كيف يمكنني جعل أرقام الكنيسة أكثر قابلية للقراءة في Lisp؟
-
28-09-2019 - |
سؤال
يمكنني تحديد أرقام الكنيسة سهلة إلى حد ما باستخدام المخطط:
> (define f (lambda (x) x))
> (f f) ;0
#<procedure:f>
> (f (f f)) ;1
#<procedure:f>
ومع ذلك ، هذا لا يجعل من السهل للغاية التعرف على ذلك (f f)
هل 0 و (F (FF)) هو 1. هل هناك طريقة يمكنني من خلالها جعل هذه الأرقام أكثر قابلية للقراءة؟ ما سيكون مثاليًا هو:
> (f f)
0
> (f (f f))
1
المثال في المخطط ، لكنني سأخذ إجابة في أي lisp.
المحلول
أولاً ، دعونا نحدد أرقام الكنيسة الحقيقية التي لها خاصية مرغوبة 0 != 1
:
(define zero (lambda (f x) x))
(define (succ cn) (lambda (f x) (f (cn f x))))
لذا zero
هل تمثيل الكنيسة لـ 0 ، (succ zero)
من 1 ، (succ (succ zero))
من 2 وهلم جرا.
الآن نظرًا لأن هذه الوظائف مجرد وظائف ، فلا توجد طريقة لإخبار Repl لعرضها كأرقام ، ولكن يمكنك تحديد وظيفة cn إلى int التي تحول numerals إلى ints والتي يمكن بعد ذلك عرضها بشكل طبيعي:
> (define (cn-to-int cn) (cn (lambda (x) (+ x 1)) 0))
> (cn-to-int zero)
0
> (cn-to-int (succ zero))
1
> (cn-to-int (succ (succ zero)))
2
لا تنتمي إلى StackOverflow