Function LISP,cond每次返回零
当它明显地将其添加到lst中时,为什么总是返回零 请帮忙 谢谢大家!Function LISP,cond每次返回零,function,recursion,lisp,common-lisp,helper,Function,Recursion,Lisp,Common Lisp,Helper,当它明显地将其添加到lst中时,为什么总是返回零 请帮忙 谢谢大家! 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)
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.-可能会修改您的列表,但不要认为它必须修改,即使它会修改,修改也不是您想要的。你应该使用它的结果。我想你甚至得到了一个风格警告,在SBCL中,你的代码看起来是这样的:
; caught STYLE-WARNING:
; The return value of DELETE-DUPLICATES should not be discarded.
(defun constants-aux (form list)
(cond ((null form) list)
((member (car form) '(implies not and or))
(constants-aux (cdr form) list))
((atom (car form))
(constants-aux (cdr form)
(adjoin (car form) list)))
(T
(constants-aux (car form) list)
(constants-aux (cdr form) list))))
阅读警告,这很有帮助
我不明白您期望的结果是什么,因此我无法修改您的函数以使其正常工作,但我将尝试向您说明问题所在。最后两个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))
可能(取决于你想要得到什么)你应该写:
(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我不是舒尔,但看起来您使用打印进行调试,只需使用打印即可。对于您的代码,它将为您提供非常好的信息,您的列表在执行过程中发生了什么:
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.如果您解释一下您希望从这段代码中得到什么样的转换,那么回答起来就很容易了
祝你好运。第一件事是正确设置代码的格式。例如:
(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))))
然后,您可以简化代码:
; caught STYLE-WARNING:
; The return value of DELETE-DUPLICATES should not be discarded.
(defun constants-aux (form list)
(cond ((null form) list)
((member (car form) '(implies not and or))
(constants-aux (cdr form) list))
((atom (car form))
(constants-aux (cdr form)
(adjoin (car form) list)))
(T
(constants-aux (car form) list)
(constants-aux (cdr form) list))))
然后,我们可以摆脱汽车
和cdr
(defun constants-aux (form list)
(if (consp form)
(destructuring-bind (head . tail)
form
(cond ((member head '(implies not and or))
(constants-aux tail list))
((atom head)
(constants-aux tail (adjoin head list)))
(T
(constants-aux head list)
(constants-aux tail list))))
list))
然后,您可以对逻辑进行一些处理,确保结果不被忽略,确保邻接的东西是正确的,等等…谢谢,更改了一些东西并使用了append,效果非常好。您正在调试器中工作<代码>cl用户3:1>表示您处于调试级别1。