【问题标题】:Checking if a set is a subset of another in a functional implementation在功能实现中检查一个集合是否是另一个集合的子集
【发布时间】: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


【解决方案1】:

您无法使用您定义的设置接口来执行此操作。您需要有一些方法来列出第一组的成员,以便为每个人查询第二组。在某些情况下,您可以按照您的建议查询整个宇宙;或者您可以通过消息传递添加到设置界面,例如

(set 'contains? x)

回答最初的问题,并且

(set 'list)

返回其所有成员的列表。

【讨论】:

    猜你喜欢
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 2011-05-23
    • 2020-07-23
    • 1970-01-01
    相关资源
    最近更新 更多