Scheme - 检查列表的结构等价(如何使用AND)

时间:2014-11-13 22:14:28

标签: scheme

我正在尝试编写一个程序来检查某些列表输入的结构等价性,无论它是仅包含原子还是嵌套子列表。

我在使用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)

  1. 检查a和b是否为空,然后它们在结构上相等

  2. 检查a或b是否为空,然后它们在结构上不相等

  3. 检查两者是否成对

  4. 如果它们都是成对的,那么看看它们的长度是否相等,如果不是,它们在结构上是不相等的。

  5. 如果它们不是两对,那么如果其中一个是一对而另一个不是那么它们在结构上不相同。

  6. 如果它们都不成对,那么它们都必须是原子,因此它们在结构上是等价的。

  7. 因为你可以看到我试图通过检查a或b的汽车的等价性来递归地执行此操作,然后如果失败则返回#f,或者如果它们在每个都是等效的话,则返回到每个的cdr步。

    任何帮助?

1 个答案:

答案 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