lisp解析'not'

时间:2012-11-21 02:06:25

标签: parsing recursion lisp

(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'并返回它。它检查参数是否为非空列表,如果不是,则返回nil(基本情况)。如果它是非空的,我想检查汽车(x)=汽车(cdr(x))='不'。如果他们没有被发现是一对'不是'那么它应该递归并建立在列表上以便返回。如果它们被检测到两者都“不”那么它仍然应该递归,但也跳过汽车(x)和汽车(cdr(x))。现在所有这些代码都返回一个与参数相同的表达式,所以我假设问题是我的嵌套if语句中的条件没有正确设置,我该如何检查car(x)和cadr(x)都不'?

2 个答案:

答案 0 :(得分:0)

“当你假设......”

实际上,测试是半正常的(但如果(car nil)x,您最终会获得(not))。问题是递归。在纸上试试:

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

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

  3. 现在x是'((不是(不是y))(或x(不是(不是z))))So(车x)is(不是(不是y)), which is not equal to not`。再次递归

  4. 现在x是((或x(不是(非z)))and(车x)is(或x(不是(非z)))但是你可能会得到这张照片。

  5. 提示:(map simplify x)如果x是原子,请修正终止条件以返回x

答案 1 :(得分:0)

(equal '(car x) '(cadr x))始终为false,因为列表(car x)与列表(cadr x)不同。如果您想获得某些特定car的{​​{1}}和cadr,则无需引用这些表达式。