Лекция 4. Списки в Прологе

Содержание

Слайд 2

Определение

Определение

Слайд 3

Синтаксис списка [] /* пустой список (длины 0) */ [элемент] /*

Синтаксис списка

[] /* пустой список (длины 0) */
[элемент] /* список

с одним элементом - длина 1 */
[элемент1,...,элементn] /* список длины n */
[элемент|список_длины_n] /* список длины n+1 */
[элемент1,...,элементm|список_длины_n] /* список длины n+m */
'.'(элемент, список_длины_n) /* стандартная форма списка длины n+1 */
"."- предикат
[элемент1,...,элементm|переменная] /* незавершённый список */
'.'(элемент, переменная) /* стандартная форма незавершённого списка */
Слайд 4

Длина списка length([], 0) . length([_|Y], N) :- length(Y, N1), N is N1 + 1.

Длина списка

length([], 0) .
length([_|Y], N) :- length(Y, N1), N is

N1 + 1.
Слайд 5

Принадлежность списку member(A, [A|_]). member(A, [_|Z]) :- member(A, Z).

Принадлежность списку

member(A, [A|_]).
member(A, [_|Z]) :- member(A, Z).

Слайд 6

Конкатенация списков append([], X, X). append([A|X], Y, [A|Z]) :- append(X,Y,Z). Реализация

Конкатенация списков

append([], X, X).
append([A|X], Y, [A|Z]) :- append(X,Y,Z).

Реализация принадлежности списка через

append:
member1(X,L):-append(_,[X|_],L).

Реализация выделения последних N элементов через append:
remove_n(L,X,N):-append(_,X,L), length(X, N).

Реализация предиката подсписок:
sublist(S,L):-append(_,L1,L),append(S,_,L1).

Слайд 7

Примеры использования Задание 1: Определить следующего за Ивановым ученика append(_,[Ivanov,X|_],L). Задание

Примеры использования

Задание 1: Определить следующего за Ивановым ученика
append(_,[Ivanov,X|_],L).

Задание 2: Отделить

последний элемент списка
del_last(L,R):- append(R,[X],L).
Слайд 8

Удаление из списка remove(X,[X|T],T). remove(X,[Y|T],[Y|T1]):-remove(X,T,T1).

Удаление из списка

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

Слайд 9

Перестановки списка permute([],[]). permute(L,[X|T]):-remove(X,L,R),permute(R,T). ?-permute([a,b,c],L),write(L). [a,b,c] [a,c,b] [b,a,c] [b,c,a] [c,a,b] [c,b,a]

Перестановки списка

permute([],[]).
permute(L,[X|T]):-remove(X,L,R),permute(R,T).

?-permute([a,b,c],L),write(L).

[a,b,c]
[a,c,b]
[b,a,c]
[b,c,a]
[c,a,b]
[c,b,a]

Слайд 10

Задача * Имеются возраста 3 подруг Иры, Маши, Саши: 10, 13,

Задача *

Имеются возраста 3 подруг Иры, Маши, Саши: 10, 13, 15

лет. Ира старше Маши, а суммарный возраст Саши и Иры больше удвоенного возраста Маши. Кому сколько лет?

?- permute([I,M,S],[10,13,15]), I>M, S+I>2*M.

ОТВЕТ :
I= 13, M= 10, S= 15
Или I= 15, M= 10, S= 13

Слайд 11

Предикат поиска всех решений bagof(X,f(X),L), - определяет список термов L ,

Предикат поиска всех решений

bagof(X,f(X),L), - определяет список термов L ,

конкретизирующих переменную X.
setof = bagof + сортировка + удаление повторов L
findall==bagof

Для задачи *: task(R):- permute([I,M,S],[10,13,15]), I>M, S+I>2*M,R=[I,M,S].
?- findall(R,task(R) ,L),write(L).
L=[[13,10,15],[15,10,13]]

Пример:
findall(X,member(X,[a,m,n]),L).
Ответ: L=[a,m,n]

Слайд 12

Бинарные деревья bt(LD,X,RD). Лист: bt(nil,c,nil) bt(bt(nil,1,bt(bt(nil,2,nil),3,bt(nil,5,nil))),7,nil)

Бинарные деревья

bt(LD,X,RD).
Лист: bt(nil,c,nil)

bt(bt(nil,1,bt(bt(nil,2,nil),3,bt(nil,5,nil))),7,nil)

Слайд 13

Создание сортирующего дерева Включение по возрастанию: insert (nil,D,bt(nil,D,nil)). insert (bt(LT,K,RT),X,bt(Ltnew,K,RT) ):-X

Создание сортирующего дерева

Включение по возрастанию:
insert (nil,D,bt(nil,D,nil)).
insert (bt(LT,K,RT),X,bt(Ltnew,K,RT) ):-Xinsert (bt(LT,K,RT),X,bt(LT,K,Rtnew) ):-X>K,insert(RT,X,Rtnew).
Cписок в

дерево:
ltotree([],nil).
ltotree([H|X],T):-ltotree(X,T1),insert(T1,H,T).
  Дерево в список
treetol(nil,[]).
treetol(bt(LT,K,RT),S):- treetol(LT,S1), treetol(RT,S2), append(S1,[K|S2],S).
Сортировка:
sort(L,L1):-ltotree(L,T),treetol(T,L1).
?-sort([2,5,3,1,7],L),write(L).
L=[1,2,3,5,7]