Advertisement
Guest User

Untitled

a guest
Nov 18th, 2011
215
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.45 KB | None | 0 0
  1. ;; lambda.lsp - newLISPでラムダ計算をしてみるテスト
  2.  
  3. ;; newLISPの以下の性質を利用することで、動的束縛を静的束縛のように振舞わせる
  4. ;; * 読取器が大文字小文字を区別すること
  5. ;; * ラムダ式がオープン(リストのサブタイプ)であり、変更が容易なこと
  6. ;; * 大文字から始まるシンボルを展開する関数(expand)が用意されている
  7.  
  8. ;; 当然ながら、変数が重複するとシンボルの展開がおかしくなるのでエラー
  9. ;; 場合によってはラムダ式の仮引数が展開されて妙なことに (しかもエラーの通知がない)
  10.  
  11. ;; 参考リンク
  12. ;; - Lambda calculus - http://en.wikipedia.org/wiki/Lambda_calculus
  13. ;; - ラムダ計算 - http://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%A0%E3%83%80%E8%A8%88%E7%AE%97
  14. ;; - Y Function - http://www.newlisp.org/index.cgi?Y_Function
  15.  
  16.  
  17. (define-macro (LAMBDA)
  18. (append (lambda ) (expand (args))))
  19.  
  20. (define DEFINE define)
  21.  
  22.  
  23. ;;;##自然数と算術 (number)
  24.  
  25. (DEFINE ZERO (LAMBDA (F) (LAMBDA (X) X))) ; 0 := λfx.x
  26. (DEFINE ONE (LAMBDA (F) (LAMBDA (X) (F X)))) ; 1 := λfx.fx
  27. (DEFINE TWO (LAMBDA (F) (LAMBDA (X) (F (F X))))) ; 2 := λfx.f(fx)
  28. (DEFINE THREE (LAMBDA (F) (LAMBDA (X) (F (F (F X)))))) ; 3 := λfx.f(f(fx))
  29.  
  30. (DEFINE (SUCC N) (LAMBDA (F) (LAMBDA (X) (F (N F X))))) ; SUCC := λnfx.f (n f x)
  31.  
  32. (DEFINE (PLUS M N) (LAMBDA (F) (LAMBDA (X) ((M F) ((N F) X))))) ; PLUS := λmnfx.m f (n f x)
  33. (DEFINE (MULT M N) (LAMBDA (F) (LAMBDA (X) ((N (M F)) X)))) ; MULT := λmnf.m (n f)
  34. (DEFINE (POW B E) (E B)) ; POW := λbe.e b
  35.  
  36. (define (to-number x) ((x (lambda (n) (+ n 1))) 0))
  37. (define (to-lambda n) (if (< 0 n) (SUCC (to-lambda (- n 1))) (ZERO)))
  38.  
  39. (to-number ZERO) ;=> 0
  40. (to-number ONE) ;=> 1
  41. (to-number TWO) ;=> 2
  42. (to-number (PLUS ONE TWO)) ;=> 3
  43.  
  44.  
  45. ;;;##論理記号と述語 (boolean)
  46.  
  47. (DEFINE TRUE (LAMBDA (X Y) X)) ; TRUE := λx y. x
  48. (DEFINE FALSE (LAMBDA (X Y) Y)) ; FALSE := λx y. y
  49.  
  50. (DEFINE (AND P Q) (P Q FALSE)) ; AND := λp q. p q FALSE
  51. (DEFINE (OR P Q) (P TRUE Q)) ; OR := λp q. p TRUE q
  52. (DEFINE (NOT P) (P FALSE TRUE)) ; NOT := λp. p FALSE TRUE
  53. (DEFINE (IF P X Y) (P X Y)) ; IFTHENELSE := λp x y. p x y
  54.  
  55. (DEFINE ZEROP (LAMBDA (N) (N (LAMBDA (X) FALSE) TRUE)))
  56.  
  57. (define bool (lambda (p) (p "TRUE" "FALSE")))
  58.  
  59. ;(IF TRUE (LAMBDA () (+ 10 2)) (LAMBDA () (* 10 2)))
  60.  
  61. ;(bool (AND TRUE FALSE)) ;=> "FALSE"
  62. ;(bool (OR TRUE FALSE)) ;=> "TRUE"
  63. ;(bool (OR FALSE FALSE)) ;=> "FALSE"
  64. ;(bool (NOT FALSE)) ;=> "TRUE"
  65. ;(bool (ZEROP (PLUS ZERO ZERO))) ;=> "TRUE"
  66.  
  67. ;;;##対 (pair)
  68.  
  69. (DEFINE (CONS X Y) (LAMBDA (M) (M X Y))) ; CONS := λx y m. m x y
  70. (DEFINE (CAR P) (P TRUE)) ; CAR := λp. p TRUE
  71. (DEFINE (CDR P) (P FALSE)) ; CDR := λp. p FALSE
  72.  
  73. ;(CDR (CONS (CONS 1 2) 3)) ;=> 3
  74.  
  75.  
  76. ;;;##再帰 (recursion)
  77.  
  78. ;; *** あまり再帰が深いとスタックを食い潰すので使えない
  79.  
  80. (define IF if)
  81.  
  82. (DEFINE Y
  83. (LAMBDA (F)
  84. ((LAMBDA (H) (LAMBDA (X) ((F (H H)) X)))
  85. (LAMBDA (H) (LAMBDA (X) ((F (H H)) X))))))
  86.  
  87. (DEFINE FACT
  88. (Y (LAMBDA (F)
  89. (LAMBDA (N)
  90. (IF (= N 0) 1 (* N (F (- N 1))))))))
  91.  
  92. ;; (define F
  93. ;; (lambda (Q)
  94. ;; (LAMBDA (n)
  95. ;; (if (= n 1) 1 (* n ((Q Q) (- n 1)))))))
  96. ;((F F) 10) ;=> 3628800
  97.  
  98. ;;; EOF
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement