Если предположить, что предикат wff
работает, ваш код будет работать. Например, используя numberp
в качестве предиката:
(defun cong (fbf)
(and (eq (first fbf) 'and)
(reduce (lambda (x y) (and x y))
(mapcar #'numberp (rest fbf)))))
Работает отлично:
CL-USER> (cong '(and 1 2 3 4 5))
T
CL-USER> (cong '(and 1 2 3 4 foo))
NIL
CL-USER> (cong '(1 2 3 4))
NIL
Обратите внимание, что это можно сделать проще:
(defun cong (fbf)
(and (eq (first fbf) 'and)
(every #'wff (cdr fbf))))
Также обратите внимание, что в CL по соглашению предикаты обычно должны заканчиваться на p
.
Итак, ваша, учитывая ваш комментарий выше, ваша проблема заключается в предикате wff
, который, похоже, не работает для атомов. Поскольку вы упомянули, что p
удовлетворяет wff
, этот предикат совершенно неверен, но если вам нужно его использовать (при условии, что это какое-то домашнее задание), просто проверьте, не является ли имеющийся элемент минусом:
(defun cong (fbf)
(and (eq (first fbf) 'and)
(every #'wff (remove-if-not #'consp (cdr fbf)))))
Это предполагает, что каждый атом удовлетворяет wff
. Таким образом, они не изменят исход соединения и могут быть опущены. В противном случае вам пришлось бы написать еще один предикат для проверки атомов, удовлетворяющих wff
, или, что было бы правильно, исправить wff
в первую очередь.
Кроме того, обратите внимание, что все это на самом деле не связано с рекурсией, поскольку вы только спрашиваете, как применить предикат к списку и получить конъюнкцию результатов.
person
danlei
schedule
12.02.2013