Я пытаюсь реализовать функцию разделения с кликсом Lambda Calc. СтильCLISP Lambda Calculus Реализация Div
Я прочитал от this сайта, что лямбда-выражение деления: (. λgqab LT AB (ПАР QA) (г (SUCC д) (SUB AB) б))
Y 0
это ИСТИНА и ЛОЖЬ
(defvar TRUE #'(lambda(x)#'(lambda(y)x)))
(defvar FALSE #'(lambda(x)#'(lambda(y)y)))
Эти функции преобразования между Int и церковными номерами
(defun church2int(numchurch)
(funcall (funcall numchurch #'(lambda (x) (+ x 1))) 0)
)
(defun int2church(n)
(cond
((= n 0) #'(lambda(f) #'(lambda(x)x)))
(t #'(lambda(f) #'(lambda(x) (funcall f
(funcall(funcall(int2church (- n 1))f)x))))))
)
Это мой IF-THEN-ELSE Реализация
(defvar IF-THEN-ELSE
#'(lambda(c)
#'(lambda(x)
#'(lambda(y)
#'(lambda(acc1)
#'(lambda (acc2)
(funcall (funcall (funcall (funcall c x) y) acc1) acc2))))))
)
И это моя реализация ДИВ
(defvar division
#'(lambda (g)
#'(lambda (q)
#'(lambda (a)
#'(lambda (b)
(funcall (funcall (funcall (funcall (funcall IF-THEN-ELSE LT) a) b)
(funcall (funcall PAIR q)a))
(funcall (funcall g (funcall succ q)) (funcall (funcall sub a)b))
)))))
)
PAIR, SUCC и функции SUB работают нормально. Я поставил свои церковные номера до как этот
(set six (int2church 6))
(set two (int2church 2))
Тогда я:
(setq D (funcall (funcall division six) two))
И у меня есть:
#<FUNCTION :LAMBDA (A)
#'(LAMBDA (B)
(FUNCALL (FUNCALL (FUNCALL (FUNCALL (FUNCALL IF-THEN-ELSE LT) A) B) (FUNCALL (FUNCALL PAR Q) A))
(FUNCALL (FUNCALL G (FUNCALL SUCC Q)) (FUNCALL (FUNCALL SUB A) B))))>
За то, что я понимаю, эта функция возвращает церковь пара , Если я пытаюсь получить первый элемент с функцией FRST (FRST работает нормально), как это:
(FUNCALL FRST D)
У меня
#<FUNCTION :LAMBDA (B)
(FUNCALL (FUNCALL (FUNCALL (FUNCALL (FUNCALL IF-THEN-ELSE LT) A) B) (FUNCALL (FUNCALL PAR Q) A))
(FUNCALL (FUNCALL G (FUNCALL SUCC Q)) (FUNCALL (FUNCALL SUB A) B)))>
Если я пытаюсь получить прерывания INT значение с Church2int (Church2int работает ОК), как это:
(church2int (funcall frst D))
у меня
*** - +:
#<FUNCTION :LAMBDA (N)
#'(LAMBDA (F)
#'(LAMBDA (X)
(FUNCALL (FUNCALL (FUNCALL N #'(LAMBDA (G) #'(LAMBDA (H) (FUNCALL H (FUNCALL G F))))) #'(LAMBDA (U) X)) (LAMBDA (U) U))))>
is not a number
Где я ожидаю получить 3
Я думаю, что проблема в функции DIVISION, после IF-THEN-ELSE, я попытался изменить его немного (я думал, что это вложенная проблема скобки), но У меня много ошибок.
Любая помощь будет оценена
Благодаря