Чтобы дать правильное определение subset?
первых, мы должны понять, как функция accumulate
работы и смысл его параметров.
Если «разворачиваться» рекурсивное определение, мы можем видеть, что accumulate
применяет бинарный оператор op
для всех результатов применения func
к элементам списка ls
. И поскольку список может быть пустым, в этих случаях функция определена, чтобы вернуть значение base
.
Так, например, в предположении, рекурсивное выполнение функции, следующее выражение
(accumulate + 0 sqr '(1 2 3))
производит 14, так как это эквивалентно:
(+ (sqr 1) (+ (sqr 2) (+ (sqr 3) 0)))
, что составляет 1 + 4 + 9 + 0.
Чтобы решить вашу проблему, вам необходимо определить вызов accumulate
, который применяет тот же оператор к списку элементов и . n объединить результаты. В вашем случае применяемая операция является тестом, если элемент является членом списка (member?
), и вы можете применить его ко всем элементам set1
. И вы должны знать из определения подмножества, что множество s1 является подмножеством другого множества s2 тогда и только тогда, когда все элементы s1 содержатся в s2. Таким образом, оператор, который должен применяться для объединения всех результатов теста, является только логическим оператором and
, так что это будет верно, если все элементы s1 являются членами s2 и false в противном случае. Последнее, что нужно решить, это базовое значение: это должно быть правдой, поскольку пустой набор всегда содержится в другом наборе.
Так что это возможно определение subset?
:
(define (subset? set1 set2)
(accumulate
(lambda (x y) (and x y)) ;; the combination operator
#t ;; the value for the empty list
(lambda(x) (member x set2)) ;; the function to be applied to all the elements of
set1)) ;; the set set1
Не вы разрешено использовать любые другие функции? Это становится беспорядочным, если вы этого не делаете. Если вы, сначала определите способ, которым вы могли бы получить список логических элементов, которые определяют, являются ли элементы 'set1' членами' set2'. Этот список легко накапливается. – molbdnilo