(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)都不'?
答案 0 :(得分:0)
“当你假设......”
实际上,测试是半正常的(但如果(car nil)
为x
,您最终会获得(not)
)。问题是递归。在纸上试试:
(simplify '(and (not (not y)) (or x (not (not z))))`
(车x)不是not
。
所以:(cons (car x) (simplify (cdr x))
现在x
是'((不是(不是y))(或x(不是(不是z))))So
(车x)is
(不是(不是y)), which is not equal to
not`。再次递归
现在x
是((或x(不是(非z)))and
(车x)is
(或x(不是(非z)))但是你可能会得到这张照片。
提示:(map simplify x)
如果x
是原子,请修正终止条件以返回x
。
答案 1 :(得分:0)
(equal '(car x) '(cadr x))
始终为false,因为列表(car x)
与列表(cadr x)
不同。如果您想获得某些特定car
的{{1}}和cadr
,则无需引用这些表达式。