2
(defun simplify (x) 

 (if (and (not (null x)) (listp x))
   (if (and (equal '(car x) '(cadr x)) (equal '(car x) 'not))
      (simplify (cddr x))
      (cons (car x) (simplify (cdr x)))
     )
    'nil
  )
)

这个 lisp 函数旨在将表达式作为参数,然后从中删除多余的 'not's 并返回它。它检查参数是否为非空列表,如果不是则返回 nil(基本情况)。如果它非空,我想检查 car(x) = car(cdr(x)) = 'not'。如果没有检测到它们是一对“不是”,那么它应该递归并建立在一个列表上以返回。如果检测到它们都是“非”,那么它应该仍然递归但也跳过 car(x) 和 car(cdr(x))。现在所有这些代码所做的只是返回一个与参数相同的表达式,所以我认为问题是我在嵌套 if 语句中的条件没有正确设置,我如何检查 car(x) 和 cadr(x)两者都是'不是'?

4

2 回答 2

0

“当你假设……”

实际上,测试是半好的(但你最终会参加(car nil)if xis (not))。问题是递归。在纸上试一试:

(simplify '(and (not (not y)) (or x (not (not z))))`
  1. (车 x) 不是not

  2. 所以:(cons (car x) (simplify (cdr x))

  3. 现在x是'((not (not y)) (or x (not (not (not z)))) So(car x) is(not (not y)) , which is not equal tonot`。再次递归

  4. 现在x是 ((or x (not (not z))) and(car x) is(or x (not (not (not z))))`。但你可能明白了。

提示:(map simplify x)并修复您的终止条件以返回xifx是一个原子。

于 2012-11-21T03:35:51.947 回答
0

(equal '(car x) '(cadr x))总是假的,因为 list 与 list(car x)不同(cadr x)。如果你想得到某个特定的carand ,你不需要引用这些表达式。cadrx

于 2012-11-21T06:37:25.243 回答