我必须构建一个函数,该函数确定我是否有以这种方式构建的格式良好的公式的联合:
cong::='('和wff-wff…')'
让我们假设我有一个代码来确定一个公式是否是wff。函数必须首先检查列表的第一个元素是否为'and
,然后递归检查其余子列表是否为wff。注意,p
也是一个wff,所以它不必是一个子列表。
示例:(and (or a b v) (and a b d) m n)
以下是我尝试过的,但对我不起作用:
(defun cong (fbf)
(and (eq (first fbf) 'and )
(reduce (lambda (x y) (and x y))
(mapcar #'wff (rest fbf)))))
假设一个可工作的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
,那么这个谓词显然是错误的,但如果你有来使用它(假设这是某种家庭作业),只需检查手头的元素是否是cons:
(defun cong (fbf)
(and (eq (first fbf) 'and)
(every #'wff (remove-if-not #'consp (cdr fbf)))))
这假设每个原子都满足CCD_ 10。因此,它们不会改变连词的结果,并且可以被丢弃。否则,您将不得不编写另一个谓词来检查满足wff
的原子,或者,这将是正确的做法,首先修复wff
。
此外,请注意,所有这些都不涉及递归,因为您只是在询问如何将谓词应用于列表并将结果连接起来。