我正在尝试编写一个程序来检查某些列表输入的结构等价性,无论它是仅包含原子还是嵌套子列表。
我在使用AND时遇到问题,我甚至不知道它是否可行,我似乎无法理解我正在查看的文档。
我的代码:
(define (structEqual a b)
(cond
(((null? car a) AND (null? car b)) (structEqual (cdr a) (cdr b)))
(((null? car a) OR (null? car b)) #f)
(((pair? car a) AND (pair? car b))
(if (= (length car a) (length car b))
(structEqual (cdr a) (cdr b))
#f))
(((pair? car a) OR (pair? car b)) #f)
(else (structEqual (cdr a) (cdr b)))))
这个想法是(我认为):(当我说两者时,我的意思是当前的a或b的cdr)
检查a和b是否为空,然后它们在结构上相等
检查a或b是否为空,然后它们在结构上不相等
检查两者是否成对
如果它们都是成对的,那么看看它们的长度是否相等,如果不是,它们在结构上是不相等的。
如果它们不是两对,那么如果其中一个是一对而另一个不是那么它们在结构上不相同。
如果它们都不成对,那么它们都必须是原子,因此它们在结构上是等价的。
因为你可以看到我试图通过检查a或b的汽车的等价性来递归地执行此操作,然后如果失败则返回#f,或者如果它们在每个都是等效的话,则返回到每个的cdr步。
任何帮助?
答案 0 :(得分:4)
Scheme(或任何LISP)中只有前缀运算符只有前缀。每次操作员先到时。 (or x (and y z q) (and y w e))
其中每个字母都可以是一个复杂的表达式。一切不是#f
的东西都是真正的价值。因此(if 4 'a 'b)
评估为a
,因为4是真值。 car
需要括号。
在评估cond
中的另一个谓词时,你应该利用这一事实,即一切都是错误的。例如
(define (structure-equal? a b)
(cond
((null? a) (null? b)) ; if a is null the result is if b is null
((not (pair? a)) (not (pair? b))) ; if a is not pair the result is if b is not also
((pair? b) (and (structure-equal? (car a) (car b)) ; if b is pair (both a and b is pair then) both
(structure-equal? (cdr a) (cdr b)))) ; car and cdr needs to be structurally equal
(else #f))) ; one pair the other not makes it #f
(structure-equal '(a (b (c d e) f) g . h) '(h (g (f e d) c) b . a)) ; ==> #t