Khi tôi đang giảng dạy cơ sở của λ-tính toán gần đây, tôi đã thực hiện một trình đánh giá calcul-tính toán đơn giản trong Common Lisp. Khi tôi hỏi hình thức bình thường Y fac 3
trong việc giảm thứ tự thông thường, phải mất 619 bước, có vẻ hơi nhiều.
Tất nhiên, mỗi lần tôi thực hiện các phép giảm tương tự trên giấy, tôi không bao giờ sử dụng phép tính λ được tính toán mà chỉ thêm các số và hàm hoạt động trên chúng. Trong trường hợp này, fac được định nghĩa như sau:
fac = λfac.λn.if (= n 0) 1 (* n (fac (- n 1)))
Trong trường hợp này, xem xét =
, *
và -
như tách lạng bộ chức năng, nó chỉ mất khoảng 50 bước để có được Y fac 3
mẫu bình thường của nó 6
.
Nhưng trong đánh giá của tôi, tôi đã sử dụng như sau:
true = λx.λy.x
false = λx.λy.y
⌜0⌝ = λf.λx.x
succ = λn.λf.λx.f n f x
⌜n+1⌝ = succ ⌜n⌝
zero? = λn.n (λx.false) true
mult = λm.λn.λf.m (n f)
pred = λn.λf.λx.n (λg.λh.h (g f)) (λu.x) (λu.u)
fac = λfac.λn.(zero? n) ⌜1⌝ (* n (fac (pred n)))
Y = λf.(λf.λx.f (x x)) f ((λf.λx.f (x x)) f)
Trong 619 bước, tôi chuyển từ Y fac ⌜3⌝
dạng bình thường thành ⌜6⌝
, cụ thể là λf.λx.f (f (f (f (f (f x)))))
.
Từ việc lướt nhanh qua nhiều bước, tôi đoán đó là định nghĩa về pred
việc đảm bảo giảm thời gian dài như vậy, nhưng tôi vẫn tự hỏi liệu nó có thể là một lỗi khó chịu lớn trong quá trình thực hiện của tôi không ...
EDIT: Ban đầu tôi đã hỏi về một nghìn bước, một số bước thực sự gây ra việc thực hiện không đúng thứ tự thông thường, vì vậy tôi đã giảm xuống còn 2/3 số bước ban đầu. Như đã nhận xét bên dưới, với cách triển khai hiện tại của tôi, việc chuyển từ số học Church sang số học Peano thực sự làm tăng số bước