Статьи / Задачи с решениями - часть вторая (Задача №6: Предикат включения)
В статье рассматривается 7 задач и предлагаются детали реализации.
Автор: Потапенко В.А.
Написал: artish   Дата: 2008-09-09 20:10
Комментарии: (0)   Рейтинг:
Задача: Предикат включения

Реализовать предикат включения, который возвращает истину, если одно множество содержится в другом.

Определения:

Через обозначается отношение принадлежности, т.е. x A означает, что элемент x принадлежит множеству A . В противном случае пишут x A.

Через обозначается отношение включения множеств, т.е. A B означает что каждый элемент множества A является элементом множества B. В этом случае A называется подмножеством B, а B - надмножеством A.

Анализ задачи: представление множеств – списки. Решение возможно, если использовать готовые функции mapcar~ и s-eq-predicate.
 
(defun s-in-predicate (s1 s2)
(cond
((null s2) nil)
(t (eval (cons 'or (mapcar #'(lambda (x) (s-eq-predicate s1 x)) s2 ))))
)
)
 

Тестирование:
 
> (s-in-predicate '(a b) '(a b (b a) (c d (a b)f)))
T
 

Искомая функция:
 
(defun include-predicate (set1 set2)
(cond ((null set2) nil)
(t (eval (cons 'and
(mapcar #'(lambda (x) (s-in-predicate x set2)) set1))))
)
)
 

Тестирование:
 
> (include-predicate '(a b c) '(a e r f g))
NIL
> (include-predicate '(a b c) '(a e r f g b q c j))
T
 
[1] [2] [3] [4] [5] > 6 < [7]


Онлайн :

0 пользователь(ей), 24 гость(ей) :




Реклама на сайте: