list - 如何编写 “set-equal?” 谓词?

标签 list lisp scheme set racket

我如何构建一个 same? 谓词返回 #t(same? '(4 6) '(6 4))? 我一直坚持编写一个 (same? a b) 谓词,如果 ab 返回 #t是相等的集合,否则 #f。还有一个类似的谓词 (element? el set) 确定 el 是否是 set 的元素。

(是的,这是家庭作业,所以我不是在寻求一个完全完成的解决方案。我只需要在正确的方向上得到一个或几个碰撞,因为我们的老师几乎没有帮助.)

我们使用列表来表示集合。我们被要求自己构建我们需要的一切。 map 等高阶函数几乎被禁止。

问题是我的元素?和一样?不适用于:

(same? '(4 6) '(6 4))<br/>
(element? '(2 3) '(1 8 5 '(3 2) 4))

这些应该返回 #t,但他们没有,我明白为什么,但我仍然无法修复它。

我的 element? 看起来像这样,我知道它只适用于相同顺序的列表,但问题是我如何改进它? (setEmptysetFirstsetRest 定义为 null?carcdr。出于某种原因,我们被要求制作自己的。)

(define element?
  (lambda (x set)
     (cond ((setEmpty? set) #f)
      ((equal? x (setFirst set)) #t)
      (else (element? x (setRest set)))
      )
   )
)

我有一个有效的 set?-predicate 看起来像这样,可能有用:

(define set?
  (lambda (set)
    (cond ((setEmpty? set) #t)
          ((list? (setFirst set))
            (if (element? (setFirst set) (setRest set))
             #f
             (set? (setFirst set))))
          (else (if (element? (setFirst set) (setRest set))
                #f
                (set? (setRest set))
                )
            )
        )
     )
 )

如果列表及其“子列表”没有重复项,则返回 #t。我还有一个程序可以从一个列表中创建一个真正的集合,该列表可以正常工作。

最佳答案

一些提示,让您朝着正确的方向前进。

element? 过程大部分是正确的,除了它不应该使用 equal? 进行键比较 - 它应该使用 same?, 和 same? 应该区分两种情况:比较的元素是原子还是集合。

因此不难想象,整个练习的正确性取决于same?的实现。而这又取决于所选择的集合表示。关于 representing sets 有一整章在精彩的 SICP 书中(包括将集合表示为列表),您应该从阅读它开始,以了解您的方位。

一旦您实现了集合的原始过程,就很容易检查两个集合是否相等,我将留给您实现 setSizesetUnion:

(= (setSize a) (setSize b) (setSize (setUnion a b)))

或者,正如@sds 在他的回答中指出的那样,如果两个集合是彼此的子集,您可以确定它们是否相同 - 并且您应该在您的拥有:

(and (subset? a b) (subset? b a))

关于list - 如何编写 “set-equal?” 谓词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19212086/

相关文章:

python - IF 语句不适用于列表差异

c# - 初始化列表上的 ArgumentOutOfRangeException

c++ - 如何在不推送的情况下创建 vector<string> 或类似的?

scheme - Racket中 “map”的定义是什么

list - 如何从 Racket 语言中给定索引处的列表中获取项目?

Linux根据列表重命名批处理文件

lisp - 在 Lisp 的可调数组中插入元素

mysql - quicklisp 安装和使用 cl-dbi 失败并出现错误 - 打开共享对象时出错 "libmysqlclient_r.so":

scheme - Racket :使用大爆炸和点击

file-io - Racket 中的文件输出有最大长度吗?