【发布时间】:2021-12-13 17:53:49
【问题描述】:
如果你用它们的特征函数来表示集合,比如一个集合是一个函数,它接受一个元素并在元素是集合的成员时返回 true,你将如何检查一个集合是否是另一个集合的子集不尝试宇宙中的每一个元素(通常是不可能的)?
这是Scheme中这种集合的表示。我要定义函数(子集?set1 set2)。
(define EMPTY-SET (lambda (x) #f))
(define (set-contains? maybe-elem set)
(set maybe-elem))
(define (set-add to-add set)
(lambda (x) (or (equal? x to-add) (set x))))
(define (list->set l)
(foldr set-add EMPTY-SET l))
(define (intersect set1 set2)
(lambda (x) (and (set-contains? x set1) (set-contains? x set2))))
; examples:
(define ex-set-1 (list->set (list 1 2 3 4)))
(define ex-set-2 (list->set (list 3 4 5 6)))
(display (set-contains? 2 (intersect ex-set-1 ex-set-2))) ; false
(display (set-contains? 3 (intersect ex-set-1 ex-set-2))) ; true
【问题讨论】:
-
为此,现代软件使用二进制决策图来编码集。我确实在此处提供了有关如何使用 BDD 对特征函数进行编码的详细信息,您可以单独找到。我还发布了几次关于这个主题的答案。
标签: functional-programming set scheme