Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Множества

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

Предикат превращает произвольный список в множество. Для этого удалим повторные вхождения элементов, для чего воспользуемся предикатом DeleteAll. Два аргумента – исходный и выходной список.

list_set([],[]). /* пустой список является множеством

в нашем понимании */

list_set ([H|T],[H|T1]):–

delete_all(H,T,T2),

/* T2 — результат удаления

вхождений первого элемента

исходного списка H из хвоста T */

list_set (T2,T1).

/* T1 — результат удаления

повторных вхождений элементов

из списка T2 */

 

Можно реализовать каждую операцию так, чтобы в результате гарантированно получалось множества.

Предикат, проверяющий принадлежность элемента списку.

member3(X,[X|_]):-!.

member3(X,[_|T]):- member3(X,T).

 

Объединения двух множеств A, B. Три параметра: первый – множество А, второй – множество В, третий – выходное множество. В других операция аналогично.

union([ ],S2,S2). /* результатом объединения

пустого множества со множеством S2

будет множество S2 */

union([H|T],S2,S):–

member3(H,S2),

/* если голова первого

множества H принадлежит второму

множеству S2, */

!,

union(T,S2,S).

/* то результатом S будет

объединение хвоста первого

множества T и второго

множества S2 */

union([H |T],S2,[H|S]):–

union(T,S2,S).

/* в противном случае результатом

будет множество, образованное

головой первого множества H

и хвостом, полученным объединением

хвоста первого множества T

и второго множества S2 */

 

Пересечение множеств.

intersection([],_,[]). /* в результате пересечения

пустого множества с любым

множеством получается пустое

множество */

intersection([H|T1],S2,[H|T]):–

member3(H,S2),

/* если голова первого множества H

принадлежит второму множеству S2 */

!,

intersection(T1,S2,T).

/* то результатом будет множество,

образованное головой первого

множества H и хвостом, полученным

пресечением хвоста первого

множества T1 со вторым

множеством S2 */

intersection([_|T],S2,S):–

intersection(T,S2,S).

/* в противном случае результатом

будет множество S, полученное

объединением хвоста первого

множества T со вторым

множеством S2 */

 

Разность множеств.

minus([],_,[]). /* при вычитании любого множества

из пустого множества получится пустое

множество */

minus([H|T],S2,S):–

member3(H,S2),

/* если первый элемент первого

множества H принадлежит второму

множеству S2*/

!,

minus(T,S2,S).

/* то результатом S будет разность

хвоста первого множества T

и второго множества S2 */

minus([H|T],S2,[H|S]):–

minus(T,S2,S).

/* в противном случае, результатом

будет множество, образованное

первым элементом первого

множества H и хвостом, полученным

вычитанием из хвоста первого

множества T второго множества S2 */

 

Другой вариант через разность.

intersection2(A,B,S):–

minus(A,B,A_B), /*A_B=A\B */

minus(A,A_B,S). /* S = A\A_B = A\(A\B) */

 

Предикат проверяющий является ли множество подмножеством другого.

subset([],_). /* пустое множество является

подмножеством любого множества */

subset([H|T],S):– /* множество [H|T] является

подмножеством множества S */

member3(H,S), /* если его первый элемент H

принадлежит S */

subset(T,S). /* и его хвост T является

подмножеством множества S */

 

Тот же предикат через операции объединение и пересечение.

 

subsetU(A,B):–

union(A,B,B). /* объединение множеств

совпадает со вторым множеством */

subsetI(A,B):–

intersection(A,B,A).

/* пересечение множеств

совпадает с первым множеством*/

 

Проверка совпадений двух множеств.

equal(A,B):– /* множество A совпадает

со множеством B, */

subset(A,B), /* если множество A содержится

во множестве B */

subset(B,A). /* и множество B является

подмножеством множества A*/

 

Проверка на собственное подмножество.

Prop_subset(A,B):–

subset(A,B),

/* множество A содержится

во множестве B */

not(equal(A,B)).

/* множества A и B не совпадают*/

 

Симметрическая разность – множество, чьи элементы принадлежат первому множеству и не принадлежат второму и наоборот.

Sim_minus(A,B,SM):–

minus(A,B,A_B), /* A_B — это разность

множеств A и B */

minus(B,A,B_A), /* B_A — это разность

множеств B и A */

union(A_B,B_A,SM). /* SM — это объединение

множеств A_B и B_A */

 

Дополнение. Для определенности, возьмем в качестве универсального множества множество цифр ({0,1,2,3,4,5,6,7,8,9}).

supp(A,D):–

U=[0,1,2,3,4,5,6,7,8,9],

minus(U,A,D). /* D — это разность

универсального множества U

и множества A */

 

Имея дополнение, можно выразить операцию объединения через пересечение и дополнение, или, наоборот, операцию пересечения через объединение и дополнение, используя законы де Моргана.

 

unionI(A,B,AB):–

supp(A,A_), /* A_ — это дополнение

множества A */

supp(B,B_), /* B_ — это дополнение

множества B */

intersection(A_,B_,A_B),

/* A_B — это пересечение

множеств A_ и B_ */

supp(A_B,AB). /* AB — это дополнение

множества A_B */

intersectionU(A,B,AB):–

supp(A,A_), /* A_ — это дополнение

множества A */

supp(B,B_), /* B_ — это дополнение

множества B */

union(A_,B_,A_B), /* A_B — это объединение

множеств A_ и B_ */

supp(A_B,AB). /* AB — это дополнение

множества A_B */

<== предыдущая лекция | следующая лекция ==>
Сортировка списков | Деревья. Деревами называется граф, у которого одна вершина корневая, а остальные вершины имеют только одного отца и все вершины являются потомками корневой вершины
Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 324; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.065 сек.