连接范式-Lisp中的递归函数



我必须构建一个函数,该函数确定我是否有以这种方式构建的格式良好的公式的联合:

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

此外,请注意,所有这些都不涉及递归,因为您只是在询问如何将谓词应用于列表并将结果连接起来。

相关内容

  • 没有找到相关文章

最新更新