【问题标题】:Recursive function in LispLisp 中的递归函数
【发布时间】:2013-02-12 15:07:53
【问题描述】:

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

cong ::= '(' and 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)))))

【问题讨论】:

  • 你运行它时它做了什么?
  • CL-USER 27 : 7 > (cong '(and a b c d)) Error: Cannot take CAR of A.

标签: lisp conjunctive-normal-form


【解决方案1】:

假设 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

另外,请注意,这些都没有真正涉及递归,因为您只是在询问如何将谓词应用于列表并取结果的合取。

【讨论】:

  • 好吧,我不明白 wff 怎么会出错。该谓词应测试公式是否格式正确并基于调用其他函数。这里是如何定义的:pastebin.com/VMDExFt1 这是它支持的语法pastebin.com/jTpFw0bp
  • 好吧,在fbf-fun 中,predicato 在对列表进行操作的谓词之后进行评估。例如,negazione 采用其参数的car,而没有事先检查它是否是一个列表。你必须先检查参数是否是一个缺点 - 否则这些测试会中断。
  • 对不起,我不明白。你是什​​么意思谓词是在对列表进行操作的谓词之后评估的。我知道 negazione 在没有事先检查它是否是一个列表的情况下接受了它的参数的汽车,但是当 negazione 失败时,操作员或 fbf-fun 是否应该尝试评估剩余的谓词,如 cong、disg 等?
  • 问题是这不是 ML 风格的模式匹配。 negazione 的代码将被运行,无论它的参数是否是一个列表,因此它会尝试获取一个原子的car,如果那是它的参数。但是,将car 应用于原子将发出未处理的type-error 信号。您的谓词永远不会返回,因此其他 or 分支将不会执行。
  • 不客气。也许你应该再花点时间阅读一些 Lisp 基础知识。一方面,您的代码看起来不错,使用 reducemapcar 等等 - 另一方面,您似乎在基本评估规则方面存在一些问题。
猜你喜欢
  • 2023-04-01
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 2016-01-22
  • 1970-01-01
相关资源
最近更新 更多