gpt4 book ai didi

parsing - 'not' 的 lisp 解析

转载 作者:太空宇宙 更新时间:2023-11-03 18:49:01 24 4
gpt4 key购买 nike

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

最佳答案

“当你假设……”

实际上,测试是半好的(但如果 x(not),你最终会选择 (car nil) ).问题是递归。在纸上试试:

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

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

  3. 现在 x 是 '((not (not y)) (or x (not (not z))))So(car x)(not (not y)),不等于not`。再次递归

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

提示:(map simplify x) 如果 x 是一个原子,则修复终止条件以返回 x

关于parsing - 'not' 的 lisp 解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13485300/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com