Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
пособие_Пролог_часть1.doc
Скачиваний:
40
Добавлен:
13.11.2019
Размер:
1.36 Mб
Скачать

5.5 Множества и их представление на языке Пролог. Простые программы обработки множеств.

      1. Основные определения.

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

      1. Предикат unionset.

Предикат unionset определяет операцию объединения двух множеств. Объединением двух множеств X и Y является множество Z, состоящее из элементов, которые принадлежат или множеству X, или множеству Y, или обоим множествам одновременно.

Предикат unionset(X,Y,Z) истинен, если множество Z является объединением множеств X и Y. Схема отношения этого предиката имеет вид:

unionset(<список>,<список>,<список>).

Декларативное описание предиката unionset(X,Y,Z)формулируется следующим образом:

  • Объединение пустого множества с непустым множеством Х есть множество Х.

  • Список, определяющий первое множество Х можно разделить на голову Н и хвост Xs. Если голова первого списка Н принадлежит второму списку Y, то рекурсивно вызывается процедура unionset с аргументами Xs и Y. При этом терм H в результирующий список не помещается.

  • Список, определяющий первое множество Х можно разделить на голову Н и хвост Xs. Если голова первого списка Н не принадлежит второму списку Y, то рекурсивно вызывается процедура unionset с аргументами Xs и Y. При этом терм H помещается в результирующий список.

Процедура unuonset(X,Y) состоит из трех правил:

unionset([],X,X). unionset([H|Xs],Y,Z):-member(H,Y),!,unionset(Xs,Y,Z).

unionset([H|Xs],Y,[H|Z]):-unionset(Xs,Y,Z).

Процедура unionset выполняется следующим образом:

?  unionset([a,b,c],[d,a,b,f],Z).

ТР: unionset([a,b,c],[d,a,b,f],Z).

Шаг 1: ТЦ: unionset([a,b,c], [d,a,b,f] ,Z).

Пр1: [a,b,c] =[]  неуспех (списки разной длины)

Пр2: unionset([a|[b,c]],[d,a,b,f],Z):-member(a,[d,a,b,f]),!,unionset([b,c], [d,a,b,f],Z).

ТР: member(a,[d,a,b,f]),!,unionset([b,c],[d,a,b,f],Z).

Шаг 2: ТЦ: member(a,[d,a,b,f])  успех3

ТР: unionset([b,c],[d,a,b,f],Z1).

Шаг 3: ТЦ: unionset([b,c],[d,a,b,f],Z).

Пр1: [b,c] =[]  неуспех (списки разной длины)

Пр2: unionset([b|[c]],[d,b,a,f],Z):-member(b,[d,a,b,f]),!,unionset([c],[d,a,b,f],Z).

ТР: member(b,[d,a,b,f]),!,unionset([c],[d,b,a,f],Z).

Шаг 4: ТЦ: member(b,[d,a,b,f])  успех

ТР: unionset([c],[ d,a,b,f],Z).

Шаг 5: ТЦ: unionset([c],[ d,a,b,f ],Z).

Пр1: [c] =[]  неуспех (списки разной длины)

Пр2: unionset([c|[]],[d,a,b,f],Z):-member(c,[d,a,b,f]),!,unionset([],[d,a,b,f],Z).

ТР: member(c,[d,a,b,f]),!,unionset([],[d,a,b,f ],Z).

Шаг 6: ТЦ: member(с,[d,a,b,f])  неуспех

Возврат.

Пр3: unionset([c|[]],[ d,a,b,f ],[c|Z1]):- unionset([],[d,a,b,f ],Z1).

Z=[c|Z1]

ТР: unionset([],[d,a,b,f ],Z1).

Шаг 7: ТЦ: unionset([],[d,a,b,f ] ,Z1).

Пр1: [] =[]  успех при подстановке Z1=[d,a,b,f ].

Выход из рекурсии на шаг 6, получается подстановка Z=[c|Z1] или Z=[c,d,a,b,f].

Выход из рекурсии на шаг 5, Z=[c,d,a,b,f].

Выход из рекурсии на шаг 3, Z=[c,d,a,b,f].

Выход из рекурсии на шаг 1, Z=[c,d,a,b,f].

ТР:  успех.

Результат вычисления запроса Z=[c,d,a,b,f]. успех.