Типовые процедуры обработки списков в программах на языке Пролог

Содержание

Слайд 2

Типовые процедуры обработки списков Типовые процедуры обработки списков не являются стандартными предикатами системы программирования языка Пролог.

Типовые процедуры обработки списков

Типовые процедуры обработки списков не
являются стандартными предикатами системы
программирования

языка Пролог.
Слайд 3

Предикат add Предикат add(X,Y,Z) истинен, если список Z получается добавлением терма

Предикат add

Предикат add(X,Y,Z) истинен, если список
Z получается добавлением терма Х в
начало

списка Y. Схема отношения этого
предиката имеет вид:
add(<терм>,<список>,<список>).
Слайд 4

Декларативное описание предиката add Декларативное описание предиката add формулируется следующим образом:

Декларативное описание предиката add

Декларативное описание предиката add
формулируется следующим образом:
Терм X

является головой списка Z, а
список Y ⎯ хвостом списка Z.
Процедура add(X,Y,Z) состоит из факта:
add(X,Y,[X|Y]).
Слайд 5

Предикаты revers1 и revers2. Предикаты revers1 и revers2 являются предикатами обращения

Предикаты revers1 и revers2.

Предикаты revers1 и revers2 являются
предикатами обращения списков и

определяют
одно и то же отношение различными
способами. Схема отношения этого предиката
имеет вид:
revers(<список>,<список>).
Слайд 6

Предикаты revers1 и revers2. Процедура revers определяется двумя способами: простым обращением; обращением с накоплением.

Предикаты revers1 и revers2.

Процедура revers определяется двумя
способами:
простым обращением;
обращением с накоплением.

Слайд 7

Предикаты revers Предикат revers(X,Y) истинен, если список Y содержит все элементы

Предикаты revers

Предикат revers(X,Y) истинен, если список Y содержит все элементы списка

Х, которые записаны в списке Y в обратном порядке. Перестановку элементов списка в обратном порядке можно произвести путем многократного выполнения процедуры append.
Слайд 8

Простое обращение. Декларативное определение предика revers1 1) обращенный пустой список есть

Простое обращение. Декларативное определение предика revers1

1) обращенный пустой список есть пустой
список;
2) если список

Х можно разделить на голову Н
и хвост Xs, то Zs есть обращенный список, если
Ys ⎯обращенный хвост списка X, Zs получен
путем присоединения к Ys головы Н списка X.
Слайд 9

Процедура простого обращения Простое обращение выполняется процедурой revers1, которая использует процедуру

Процедура простого обращения

Простое обращение выполняется
процедурой revers1, которая использует
процедуру append и состоит

из двух
предложений:
revers1([ ],[ ]).
revers1([H|Xs],Zs):⎯ revers1(Xs,Ys), append(Ys,[H],Zs).
Слайд 10

Обращение с накоплением В процедуре revers2 введен дополнительный предикат rev с

Обращение с накоплением

В процедуре revers2 введен дополнительный предикат rev с тремя

аргументами⎯списками, где первый аргумент ⎯ исходный список, второй аргумент ⎯ накапливающийся список, а третий аргумент ⎯ результирующий, обращенный список.
Слайд 11

Декларативное определение предиката rev Декларативное определение предиката rev формулируется следующим образом:

Декларативное определение предиката rev

Декларативное определение предиката rev формулируется следующим образом:
1) если первый

аргумент есть пустой список, то второй и третий аргументы представляют собой один и тот же список;
Слайд 12

Декларативное определение предиката rev 2) первый аргумент⎯ непустой список [H|Хs], и

Декларативное определение предиката rev

2) первый аргумент⎯ непустой список [H|Хs], и его можно

разделить на голову Н и хвост Xs; в этом случае применение предиката rev к списку [H|Хs] и накапливающемуся списку L равносильно применению предиката rev к хвосту списка Xs и списку [H|L]; при этом получается обращенный список Y.
Слайд 13

Процедура revers2 Обращение списка с накоплением выполняется процедурой revers2, состоящей из

Процедура revers2

Обращение списка с накоплением
выполняется процедурой revers2,
состоящей из трех предложений и
содержит

дополнительный предикат rev:
revers2(X,Y):⎯rev(X,[ ],Y).
rev([ ],Y,Y).
rev([H|Xs],L,Y):⎯rev(Xs,[H|L],Y).
Слайд 14

Предикат delete Предикат delete(X,L,M) принимает значение “истина”, если список M получается

Предикат delete

Предикат delete(X,L,M) принимает значение
“истина”, если список M получается в
результате удаления

первого вхождения
терма Х из списка L.
Схема отношения этого предиката имеет
вид:
delete(<терм>,<список>,<список>).
Слайд 15

Декларативное описание предикат delete Декларативное описание предиката next формулируется следующим образом:

Декларативное описание предикат delete

Декларативное описание предиката next
формулируется следующим образом:
1) Если X

⎯ голова списка L, то предикат
delete(X,L, M) истинен и M есть хвост
списка L.
2) Если X принадлежит хвосту списка, то
предикат delete необходимо применить к
хвосту списка L.
Слайд 16

Декларативное описание предикат delete 3) Если X не принадлежит списку L, то предикат delete(X,L, M) ложен.

Декларативное описание предикат delete

3) Если X не принадлежит списку L, то предикат

delete(X,L, M) ложен.
Слайд 17

Процедура delete Процедура delete(X,Y,L) состоит из двух правил: delete(X,[X|B],B):⎯!. delete(X,[Y|L],[Y|M]):⎯ delete(X,L,M).

Процедура delete

Процедура delete(X,Y,L) состоит из двух
правил:
delete(X,[X|B],B):⎯!.
delete(X,[Y|L],[Y|M]):⎯ delete(X,L,M).

Слайд 18

Предикат number_list Предикат number_list(L) определяет, является ли список X списком числовых

Предикат number_list

Предикат number_list(L) определяет,
является ли список X списком числовых
термов. Схема отношения

этого предиката
имеет вид:
number_list(<список>).
Слайд 19

Декларативное описание предиката number_list(L) 1) Список L включает один элемент Х.

Декларативное описание предиката number_list(L)

1) Список L включает один элемент Х. Тогда предикат

number_list([X]) истинен, если X числовой терм.
2) Список L можно разделить на голову Н и хвост Xs. Тогда L есть список числовых термов, если H ⎯числовой терм и хвост списка есть список числовых термов.
Слайд 20

Процедура number_list Процедура number_list(X,Y) состоит из двух правил: number_list([]):⎯ number(X). number_list(X,[_|T]):

Процедура number_list

Процедура number_list(X,Y) состоит из двух
правил:
number_list([]):⎯ number(X).
number_list(X,[_|T]): ⎯ number(X), number_list(X,T).
Предикат number(X)

⎯стандартный предикат
системы Arity Prolog, этот предикат истинен,
если Х ⎯ числовой терм.
Слайд 21

Предикат sumlist Предикат sumlist(L,Sum) определяет сумму элементов числового списка. Схема отношения

Предикат sumlist

Предикат sumlist(L,Sum) определяет
сумму элементов числового списка.
Схема отношения этого предиката

имеет
вид:
sumlist(<список>,<целочисленный терм>).
Слайд 22

Декларативное описание предиката sumlist(L) Сумма элементов пустого списка равна нулю. Если

Декларативное описание предиката sumlist(L)

Сумма элементов пустого списка равна нулю.
Если исходный список

состоит L из головы Н и хвоста Т, то сумма элементов списка L равна сумме элементов хвоста списка T плюс Н.
Слайд 23

Процедура sumlist Процедура sumlist(L,Sum) состоит из двух правил: sumlist([ ],0). sumlist([H|T],Sum):⎯ sumlist(T,SumT), Sum is SumT+H.

Процедура sumlist

Процедура sumlist(L,Sum) состоит из двух
правил:
sumlist([ ],0).
sumlist([H|T],Sum):⎯ sumlist(T,SumT),
Sum is SumT+H.

Слайд 24

Предикат delrepeat Предикат delrepeat (L,LS) истинен, если список получается из списка

Предикат delrepeat

Предикат delrepeat (L,LS) истинен, если список получается из списка S

путем удаления всех повторений элементов. Схема отношения этого предиката имеет вид:
delrepeat(<список>,<список>).
Слайд 25

Предикат delrepeat Удаление повторений элементов выполняется процедурой delrepeat с накоплением списка,

Предикат delrepeat

Удаление повторений элементов выполняется процедурой delrepeat с накоплением списка, состоящей

из четырех предложений и содержит дополнительный предикат delrep.
Слайд 26

Декларативное описание предиката delrepeat 1) если первый аргумент есть пустой список,

Декларативное описание предиката delrepeat

1) если первый аргумент есть пустой список, то второй

и третий аргументы представляют собой один и тот же список;
2) если первый аргумент⎯ непустой список [H|Хs], и голова Н принадлежит хвосту списка T, то процедура delrep рекурсивно вызывается с аргументами T и S1; при этом элемент H не включается в накапливающийся список S1;
Слайд 27

Декларативное описание предиката delrepeat 3) если первый аргумент⎯ непустой список [H|Хs],

Декларативное описание предиката delrepeat

3) если первый аргумент⎯ непустой список [H|Хs], и голова

Н не принадлежит хвосту списка T, то элемент H включается в накапливающийся список S1 и получается список S2. Затем процедура delrep рекурсивно вызывается с аргументами T и S2.
Слайд 28

Процедура delrepeat delrepeat(S,SF):-delrep(S,[ ],SF). delrep([ ],S,S). delrep([H|T],S1,SF):-member(H,T),!,delrep(T,S1,SF). delrep([H|T],S1,SF):-append(S1,[H],S2),delrep(T,S2,SF).

Процедура delrepeat

delrepeat(S,SF):-delrep(S,[ ],SF).
delrep([ ],S,S).
delrep([H|T],S1,SF):-member(H,T),!,delrep(T,S1,SF).
delrep([H|T],S1,SF):-append(S1,[H],S2),delrep(T,S2,SF).

Слайд 29

Полный текст процедуры delrepeat delrepeat(S,SF):-delrep(S,[ ],SF). delrep([ ],S,S). delrep([H|T],S1,SF):-member(H,T),!, delrep(T,S1,SF). delrep([H|T],S1,SF):-append(S1,[H],S2), delrep(T,S2,SF). member(X,[X|_]). member(X,[Y|T]):-member(X,T). append([],X,X). append([H|T1],X,[H|T2]):-append(T1,X,T2).

Полный текст процедуры delrepeat

delrepeat(S,SF):-delrep(S,[ ],SF).
delrep([ ],S,S).
delrep([H|T],S1,SF):-member(H,T),!,
delrep(T,S1,SF).
delrep([H|T],S1,SF):-append(S1,[H],S2),
delrep(T,S2,SF).
member(X,[X|_]).
member(X,[Y|T]):-member(X,T).
append([],X,X).
append([H|T1],X,[H|T2]):-append(T1,X,T2).