Декартово произведение множеств



Предикат dek определяет операцию декартова произведения двух множеств. Декартовым произведением двух множеств X={xi} и Y={yi} является множество Z, состоящее из пар элементов [xi, yi], где xi принадлежат множеству X, а yi принадлежат множеству Y.

Предикат dek(X,Y,Z) ¾истинен, если множество Z является декартовым произведением множеств X и Y. Схема отношения того предиката имеет вид:

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

В процедуре dek используются дополнительные предикаты pro и
append[6]. Предикат pro(X,Y,Z)¾истинен, если X есть терм, Y={Yi}¾множество термов, а Z является множество пар вида [X, Yi], где X есть заданный терм, а Yi¾ соответствующий элемент множества Y. Схема отношения предиката pro имеет вид:

pro(<терм>,<список>,<список>).

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

v Список Y состоит из одного элемента. Тогда список Z является списком пар вида [X, Yi].

v Список, определяющий множество Y можно разделить на голову Н и хвост T. Тогда список Z=[[X,H]|T1], если список список T1 есть результат процедуры pro(X,T,T1].

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

v Список X состоит из одного элемента. Тогда список Z является результатом процедуры pro(X,Y,Z1.

v Список, определяющий первое множество Х можно разделить на голову X и хвост T1. Если pro(X,Y,T2) и dek(T1,Y,T3) и append(T2,T3,Z) истинны, то Z есть декартово произведение списков X и Y.

 

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

pro(X,[Y],[[X,Y]|[]]).
    pro(X,[H|T], [[X,H]|T1]):-pro(X,T,T1).

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

dek([X|[]],Y,Z):pro(X,Y,Z).
    dek([X|T1],Y,Z):-pro(X,Y,T2), dek(T1,Y,T3),

append(T2,T3,Z).

 

 

Пример запроса к процедуре pro.

? ¾ pro(4,[1,2,3],Z).                                            

Z=[4,2],[4,3],[4,3]]

Yes

 

Пример запроса к процедуре dek.

? ¾ dek([4,2][3,5,8],Z).                                            

Z=[[4,3],[4,5],[4,8], [2,3],[2,5],[2,8]]

Yes

 

5.6 Пролог¾программы сортировки списков.

 

5.6.1. Метод прямого выбора.

Наиболее распространены три метода сортировки списков:

1. метод сортировки путем прямого выбора;

2. метод сортировки путем вставки;

3. метод сортировки с использованием перестановок элементов.

Алгоритм сортировки списка путем прямого выбора включает в себя следующие шаги:

1. В исходном списке S1 находится минимальный элемент Min и помещается в результирующий список S2.

2. Этот элемент удаляется из списка S1, и процедура поиска повторяется. С каждым шагом список S1 уменьшается.

3. Когда список S1 станет пустым, список S2 станет результирующим, упорядоченным по возрастанию списком.

Процедура sort_vibor использует следующие процедуры:

1. sort1(<исходный список>, <накапливающийся список>,
<результирующий список>) ¾ процедура накопления списка;

2. delete(<терм>, <список>, <список > ) ¾ процедура удаления элемента из списка;

3. append(<список>, <список>, <список > ) ¾ процедура объединения списков;

4. minlist(<список>, <терм> ) ¾ процедура определения минимального элемента в списке;

5. min(<терм>, <терм>, <терм> ) ¾ процедура определения меньшего из двух термов.

В 5-й процедуре сравниваются числовые термы с помощью операций сравнения чисел >, <, >=, =< или символьные термы с помощью операций сравнения символов (@>, @<, @>=,@=<.

Предикат sort_vibor(L1,LS)истинен, если список LS получен из списка L1 путем упорядочения списка L1 по возрастанию методом прямого выбора. Списки L1 и LS являются списками числовых термов.

Процедура sort_vibor(L1,LS)состоит из следующих правил:

sort_vibor(L1,LS):¾sort1(L1,[],LS).

sort1(L1,L2,LS):¾minlist(L1,Min),append(L2,[Min],L3),
delete(Min,L1,LL),sort1(LL,L3,LS).

sort1([],LS,LS).

delete(A,[A|B],B).

append([],|L,L).

append([X|L1],L2,[X|L3) :¾ append(L1,L2,L3).

minlist([X],X).

minlist([X,Y|T],M) :¾ minlist([Y|T],MinN),min(X,MinN,M).

min(X,Y,X) :¾X=<Y.

min(X,Y,Y) :¾X>Y.

 

5.6.2. Метод вставки.

 

Алгоритм сортировки списка путем вставки заключается в следующем: для того, чтобы упорядочить непустой список L = [X|T], необходимо:

1) упорядочить хвост списка, получив список OT;

2) вставить голову X списка L в упорядоченный список OT, поместив X в такое место списка OT, что список OT остался бы упорядоченным.

Процедура sort_insert использует процедуру insert, которая вставляет терм в упорядоченный список, не нарушая упорядочивания. 

Предикат insert(X,L1,L2) ¾истинен, если список L2 получается из упорядоченного списка L1 путем вставки терма X без нарушения порядка. Схема отношения этого предиката имеет вид:

insert(<терм>, <список>, <список>).

В процедуре insert сравниваются числовые термы с помощью операций сравнения чисел >, <, >=, =< или символьные термы с помощью операций сравнения символов (@>, @<, @>=,@=<.

Предикат sort_insert(L1,LS) истинен, если список LS получен из списка L1 путем упорядочения списка L1 по возрастанию методом вставки. Списки L1 и LS являются списками числовых термов.

Процедура sort_insert(L1,LS) состоит из следующих правил:

sort_insert([],[]).

sort_insert([X|T],OL):¾sort_insert(T,OT),insert(X,OT,OL).

insert(X,[],[X]).

insert(X,[Y|T],[X,Y|T]):¾ X=<Y.

insert(X,[Y|T],[Y|T1]):¾ X>Y,insert(X,T,T1).

Метод перестановок.

Алгоритм сортировки списка путем перестановки элементов заключается в следующем: для того, чтобы упорядочить непустой список L = [X|T], необходимо:

1. найти в списке L два смежных элемента X и Y, таких что X>Y,и поменять X и Y местами, получив таким образом новый список L1, затем рекурсивно применить эту процедуру к списку L1;

2. если в списке L нет ни одной пары смежных элементов X и Y, таких что X>Y, то список L упорядочен.

Процедура sort_p использует процедуру perest, которая переставляет два смежных элемента в порядке возрастания (или убывания). 

Предикат perest(L1,L2) ¾истинен, если список L2 получается из упорядоченного списка L1 путем перестановки. Схема отношения этого предиката имеет вид:

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

В процедуре perest сравниваются числовые термы с помощью операций сравнения чисел >, <, >=, =< или символьные термы с помощью операций сравнения символов (@>, @<, @>=,@=<.

Предикат sort_p(L1,LS) истинен, если список LS получен из списка L1 путем упорядочения списка L1 по возрастанию методом перестановки элементов. Списки L1 и LS являются списками числовых термов.

Процедура sort_p(L1,LS) состоит из следующих правил:

sort_p(L,OL): ¾ perest(L,L1),!,sort_p(L1,OL).

sort_p(OL,OL).

perest([X,Y|T],[Y,X|T]): ¾X>Y.

perest([Z|T],[Z|T1]):¾ perest(T,T1).

 


Дата добавления: 2018-04-04; просмотров: 211;