gpt4 book ai didi

function - LISP,条件每次都返回零

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

为什么明明把它加到 lst 里却总是返回 nil???

请帮忙!

谢谢!

CL-USER 1 : 1 > (defun constants-aux (form lst)
(cond ((null form) lst)
((eq (car form) 'implies) (constants-aux (cdr form) lst))
((eq (car form) 'not) (constants-aux (cdr form) lst))
((eq (car form) 'and) (constants-aux (cdr form) lst))
((eq (car form) 'or) (constants-aux (cdr form) lst))
((atom (car form)) (print (car form)) (cons (car form) (list lst)) (delete-duplicates lst) (constants-aux (cdr form) lst))
(T (constants-aux (car form) lst) (constants-aux (cdr form) lst))))
CONSTANTS-AUX

CL-USER 2 : 1 > (defun constants (form)
(constants-aux form nil))
CONSTANTS

CL-USER 3 : 1 > constants '(IMPLIES (NOT Q) (IMPLIES Q P))

Q
Q
P
NIL

最佳答案

你在很多方面都做错了。

1. - 为什么要创建 -aux 函数,当您可以只使用可选参数时?

(defun constants (form &optional lst)
(cond
((null form) lst) ...

2. - 你不需要那么多相似的分支,你可以这样写:

((find (car form) '(implies not and or))
(constants (cdr form) lst))

3. - delete-duplicates可以修改您的列表,但不要认为它必须这样做,即使它会修改,它所做的修改也不是您想要的。你应该使用它的结果。我认为您甚至收到了 STYLE-WARNING,在 SBCL 中,您的代码看起来像这样:

; caught STYLE-WARNING:
; The return value of DELETE-DUPLICATES should not be discarded.

阅读警告,有帮助。

我不明白您期望的结果是什么,所以我无法修改您的函数以使其正常工作,但我会尽力向您展示问题出在哪里。最后两个 cond 分支的代码:

((atom (car form))
(print (car form))
(cons (car form) (list lst)) ;; Result is ignored
(delete-duplicates lst) ;; Result is ignored
(constants-aux (cdr form) lst))

你应该写:

(constant-aux (cdr form) (delete-duplicates lst))

(T
(constants-aux (car form) lst) ;; Result is ignored
(constants-aux (cdr form) lst))))

可能(取决于你想要得到什么)你应该写:

(cons
(constants-aux (car form) lst)
(constants-aux (cdr form) lst))

4 我不确定,但看起来你使用 print 进行调试,只需使用 trace反而。对于您的代码,它将为您提供很好的信息,说明您的列表在执行过程中发生了什么:

  0: (CONSTANTS-AUX (IMPLIES (NOT Q) (IMPLIES Q P)) NIL)
1: (CONSTANTS-AUX ((NOT Q) (IMPLIES Q P)) NIL)
2: (CONSTANTS-AUX (NOT Q) NIL)
3: (CONSTANTS-AUX (Q) NIL)

Q 4: (CONSTANTS-AUX NIL NIL)
4: CONSTANTS-AUX returned NIL
3: CONSTANTS-AUX returned NIL
2: CONSTANTS-AUX returned NIL
2: (CONSTANTS-AUX ((IMPLIES Q P)) NIL)
3: (CONSTANTS-AUX (IMPLIES Q P) NIL)
4: (CONSTANTS-AUX (Q P) NIL)

Q 5: (CONSTANTS-AUX (P) NIL)

P 6: (CONSTANTS-AUX NIL NIL)
6: CONSTANTS-AUX returned NIL
5: CONSTANTS-AUX returned NIL
4: CONSTANTS-AUX returned NIL
3: CONSTANTS-AUX returned NIL
3: (CONSTANTS-AUX NIL NIL)
3: CONSTANTS-AUX returned NIL
2: CONSTANTS-AUX returned NIL
1: CONSTANTS-AUX returned NIL
0: CONSTANTS-AUX returned NIL

5. 如果您能解释一下您希望从这段代码中得到什么转换,那么回答起来会更容易。

祝你好运。

关于function - LISP,条件每次都返回零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25966431/

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