Проверка того, является ли набор подмножеством другого в функциональной реализации

#functional-programming #set #scheme

Вопрос:

Если вы представляете наборы по их характеристическим функциям, таким образом, что набор-это функция, которая принимает элемент и возвращает значение true, если элемент является членом набора, как бы вы проверили, что набор является подмножеством другого, не пробуя каждый элемент во вселенной (обычно невозможно)?

Вот представление такого набора в схеме. Я хочу определить функцию (подмножество? 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-gt;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-gt;set (list 1 2 3 4))) (define ex-set-2 (list-gt;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  

Комментарии:

1. Для этого современное программное обеспечение использует двоичные диаграммы принятия решений для наборов кодирования. Я подробно рассказываю здесь о том, как вы можете кодировать характеристические функции с помощью BDD, как вы можете найти самостоятельно. Я также несколько раз публиковал ответы на эту тему.

Ответ №1:

Вы не можете сделать это с заданным интерфейсом, который вы определили. Вам нужно каким-то образом составить список членов первого набора, чтобы запросить второй набор для каждого из них. В некоторых случаях вы можете запросить всю вселенную, как вы предлагаете; или вы можете добавить в набор интерфейс с передачей сообщений, чтобы, например

 (set 'contains? x)  

отвечает на первоначальный вопрос, и

 (set 'list)  

возвращает список всех его участников.