t-beta-reduce.scm 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. ;; import lambda/simple-gensym.scm lambda/beta-reduce.scm
  2. (print (beta-reduce '(lambda y ((lambda x (lambda y x)) y))))
  3. (print (beta-reduce '(lambda x ((lambda y x) y)))) ;; y is a free variable here
  4. (print (beta-reduce '(lambda y ((lambda x (lambda y x)) y))))
  5. (print (beta-reduce '(lambda y (lambda y ((lambda x (lambda y x)) y)))))
  6. (print (beta-reduce '(lambda y (lambda x ((lambda x (lambda y x)) y)))))
  7. (define id '(lambda i i))
  8. (print (beta-reduce `(,id ,id)))
  9. (print (beta-reduce `(,id (,id ,id))))
  10. (print (beta-reduce (beta-reduce `(,id (,id ,id)))))
  11. (newline)
  12. (beta-reduce* #t `((,id ,id) ,id))
  13. ;; http://www.toves.org/books/lambda/
  14. ;; http://www.cs.cornell.edu/courses/cs3110/2008fa/recitations/rec26.html
  15. ;; http://jwodder.freeshell.org/lambda.html
  16. (define y `(lambda f
  17. ((lambda x (f (x x)))
  18. (lambda x (f (x x))))))
  19. (define l:TRUE '(lambda x (lambda y x)))
  20. (define l:FALSE '(lambda x (lambda y y)))
  21. (define l:IF '(lambda b (lambda t (lambda f ((b t) f)))))
  22. (define l:AND `(lambda b-1 (lambda b-2 (((,l:IF b-1) b-2) ,l:FALSE))))
  23. (define l:OR `(lambda b-1 (lambda b-2 (((,l:IF b-1) ,l:TRUE) b-2))))
  24. (define l:NOT `(lambda b (((,l:IF b) ,l:FALSE) ,l:TRUE)))
  25. (beta-reduce* #t `(,l:NOT ,l:TRUE))
  26. (beta-reduce* #t `(,l:NOT ,l:FALSE))
  27. (define l:ZERO `(lambda f (lambda x x)))
  28. (define l:ONE `(lambda f (lambda x (f x))))
  29. (define l:ADD '(lambda m (lambda n (lambda f (lambda x ((m f) ((n f) x)))))))
  30. (define l:MUL `(lambda m (lambda n ((m (,l:ADD n)) ,l:ZERO))))
  31. (define l:ISZERO `(lambda n ((n (lambda x ,l:FALSE)) ,l:TRUE)))
  32. (define l:PRED `(lambda n (lambda f (lambda x
  33. (((n (lambda g (lambda h
  34. (h (g f)))))
  35. (lambda u x))
  36. (lambda u u))))))
  37. ;;(beta-reduce* #t `(,l:PRED ,l:ONE))
  38. (beta-reduce* #t `((
  39. (,l:PRED ((,l:ADD ,l:ONE) ((,l:ADD ,l:ONE) ,l:ONE)))
  40. 1+) 0))
  41. (define l:SUB `(lambda m (lambda n ((n ,l:PRED) m))))
  42. (define l:LEQ `(lambda m (lambda n (,l:ISZERO ((,l:SUB m) n)))))
  43. ;;(beta-reduce* #t `((,l:LEQ ,l:ONE) ,l:ZERO))
  44. ;;(beta-reduce* #t `((,l:LEQ ,l:ZERO) ,l:ONE))
  45. (print
  46. (beta-reduce* #f `(lambda f
  47. (lambda n
  48. ((,l:SUB ((,l:ADD ((,l:ADD ,l:ONE) ,l:ONE)) ((,l:ADD ,l:ONE) ,l:ONE)))
  49. ,l:ONE)))))
  50. (define l:FACT^ `(lambda f (lambda n (((,l:IF ((,l:LEQ n) ,l:ONE))
  51. ,l:ONE)
  52. ((,l:MUL n) ((f f) ((,l:SUB n) ,l:ONE)))))))
  53. (define l:FACT `(,l:FACT^ ,l:FACT^))
  54. ;(beta-reduce* #t `(,l:FACT ,l:ONE))
  55. (print
  56. (beta-reduce* #f `(((,l:FACT ((,l:ADD ((,l:ADD ,l:ONE) ,l:ONE))
  57. ((,l:ADD ,l:ONE) ,l:ONE)))
  58. 1+) 0)))