Logické programováníLogické programování
Prezentace číslo 4Prezentace číslo 4
22
SeznamySeznamy
Seznam je uspořádaná sekvence elementů Seznam je uspořádaná sekvence elementů libovolné délkylibovolné délky
Seznam se zapisuje v hranatých závorkáchSeznam se zapisuje v hranatých závorkách
Příklady:Příklady:[alena, klara, lucie, zuzana][alena, klara, lucie, zuzana]
[plzen, sparta, slavie, hradec_kralove, brno] [plzen, sparta, slavie, hradec_kralove, brno]
[liberec, pardubice, 3, 2][liberec, pardubice, 3, 2]
[jirka, odjel, [na, brigadu, do, rakouskych, alp]][jirka, odjel, [na, brigadu, do, rakouskych, alp]]
[[ ]] % pr% prázdný seznamázdný seznam
33
SeznamySeznamy
Hlavou seznamu je jeho první prvekHlavou seznamu je jeho první prvekTělem seznamu je seznam, který zTělem seznamu je seznam, který zbybyde z de z původního seznamu po oddělení hlavypůvodního seznamu po oddělení hlavy
Příklady:Příklady:[[a, b, ca, b, c]]
Hlava: aHlava: a Tělo: Tělo: [b, c][b, c]
[[a, a, [b, c]][b, c]]Hlava: aHlava: a Tělo: Tělo: [[b, c]][[b, c]]
44
SeznamySeznamy
Příklady:Příklady:[[a+b], X-Y][[a+b], X-Y]
Hlava: Hlava: [[aa+b]+b] Tělo: Tělo: [X-Y][X-Y]
[[ ]]Hlava: Hlava: neexistujeneexistuje Tělo: Tělo: neexistujeneexistuje
Prázdný seznam nemá ani hlavu ani tělo!Prázdný seznam nemá ani hlavu ani tělo!
Pro Pro oddělení hlavy od těla se používá zápis oddělení hlavy od těla se používá zápis [H|T][H|T]
?-Sez=?-Sez=[tom, petr, jirka], Sez[tom, petr, jirka], Sez==[H|T].[H|T].Sez=Sez=[tom, petr, jirka], [tom, petr, jirka], H=tom, T=[petr, jirka]H=tom, T=[petr, jirka]yesyes
55
Jednoduché programyJednoduché programy
PrvnPrvní prvek seznamu :í prvek seznamu :% % prvniprvni(Seznam, Prvek)(Seznam, Prvek)% % prvni(prvni(SezSez,,XX)) :- Sez = :- Sez = [H|[H|TT]], X = H, X = H..%% prvni([H| prvni([H|TT],],XX)) :- X = H :- X = H..prvni([H|_], H).prvni([H|_], H).
?-?-prvni([tom, petr, jirka], X).prvni([tom, petr, jirka], X).X=tomX=tomyesyes
66
Jednoduché programyJednoduché programy
PPoslední prvek seznamuoslední prvek seznamu
% % posledni(posledni(Seznam, Prvek)Seznam, Prvek)pposledniosledni([H|([H|[][]], H).], H).pposledniosledni([_|T],X) ([_|T],X) :- :- pposledniosledni((TT,,XX).).
?-?-pposledniosledni([tom, petr, jirka], X).([tom, petr, jirka], X).X=X=jirkajirkayesyes
77
Jednoduché programyJednoduché programy
NN-tý prvek seznamu-tý prvek seznamu
% % druhý(druhý(Seznam, Prvek)Seznam, Prvek)druhydruhy([([_,_,H|H|__], H).], H).
% % třetí(třetí(Seznam, Prvek)Seznam, Prvek)tretitreti([([_,_,_,_,H|H|__], H).], H).
......% % devátý(devátý(Seznam, Prvek)Seznam, Prvek)devatydevaty([([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,H|H|__], H).], H).
......
88
Jednoduché programyJednoduché programy
NN-tý prvek seznamu (ještě jednou a lépe)-tý prvek seznamu (ještě jednou a lépe)
% % n-tý(N, n-tý(N, Seznam,Seznam, N-tý N-tý Prvek)Prvek)n-tyn-ty((1,1,[H|[H|__], H).], H).n-tyn-ty((N,N,[[__||TT], ], XX)) :- N :- N>1,>1,
N1 is N-1,N1 is N-1, n-tyn-ty((NN11,, TT, , XX).).
?-?- n-ty(3,[a,b,c,d],X). n-ty(3,[a,b,c,d],X).X = c ;X = c ;nono
99
Jednoduché programyJednoduché programy
Tisk seznamuTisk seznamu
% tisk% tisk((Seznam)Seznam)tisk([]).tisk([]).tisk([H|tisk([H|TT])]) :- :- write(H), tisk(T).write(H), tisk(T).
?-?- tisk([a,b,c,d,e]). tisk([a,b,c,d,e]).abcabcddeeyesyes
1010
Jednoduché programyJednoduché programy
Tisk seznamu – Tisk seznamu – trochu jinaktrochu jinak
% tisk% tisk((Seznam)Seznam)tisktisk22([]).([]).tisktisk22([H|([H|TT])]) :- :- write(H),write(H), nl,nl, tisk tisk22(T).(T).
?-?- tisk tisk22([a,b,c]).([a,b,c]).aa
bbccyesyes
1111
Jednoduché programyJednoduché programy
Tisk seznamu – Tisk seznamu – naposledynaposledy
% tisk% tisk((Seznam)Seznam)tisktisk33([]).([]).tisktisk33([H|([H|TT])]) :- :- tisktisk33(T)(T), , write(H)write(H),, nl nl..
?-?- tisk tisk33([a,b,c]).([a,b,c]).cc
bbaayesyes
1212
Jednoduché programyJednoduché programy
Délka seznamu Délka seznamu (počet prvků v seznamu?)(počet prvků v seznamu?)
% delka(Sez,D)% delka(Sez,D)delka([], 0).delka([], 0).delka([_|T],D) :- delka(T,D1), delka([_|T],D) :- delka(T,D1),
D is D1+1.D is D1+1.
?- delka([?- delka([ee,,vv,,aa],X).],X).X = X = 33
1313
Jednoduché programyJednoduché programyPrvek/člen seznamu Prvek/člen seznamu (je daný prvek v seznamu?)(je daný prvek v seznamu?)
% clen(X,Sez)% clen(X,Sez)clen(X,[X|_]).clen(X,[X|_]).clen(X,[_|T]) :- clen(X,T).clen(X,[_|T]) :- clen(X,T).
?- clen(b,[a,b,c]).?- clen(b,[a,b,c]).yesyes
?- clen(X,[a,b,c]).?- clen(X,[a,b,c]).X = a ;X = a ;X = b ;X = b ;X = c ;X = c ;nono
1414
Práce se seznamyPráce se seznamy
Spojení dvou seznamů Spojení dvou seznamů (přilepit druhý za první)(přilepit druhý za první)
% spoj(S1,S2,Vysl)% spoj(S1,S2,Vysl)spoj([],S2,S2).spoj([],S2,S2).spoj([H|T],S2,[H|W]) :- spoj(T,S2,W).spoj([H|T],S2,[H|W]) :- spoj(T,S2,W).
?- spoj([v,y],[b,a,r,v,i,t],V).?- spoj([v,y],[b,a,r,v,i,t],V).V = [v,y,b,a,r,v,i,t]V = [v,y,b,a,r,v,i,t]
?- spoj([p,o],S,[p,o,l,o,m]).?- spoj([p,o],S,[p,o,l,o,m]).S = [l,o,m]S = [l,o,m] ; ;
1515
Reverzibilita spoj/3Reverzibilita spoj/3?- spoj(S,[l,o,m],[p,o,l,o,m]).?- spoj(S,[l,o,m],[p,o,l,o,m]).S = [p,o] S = [p,o]
?- spoj(S1,S2,[l,o,m]).?- spoj(S1,S2,[l,o,m]).S1 = [] ,S1 = [] ,S2 = [l,o,m] ;S2 = [l,o,m] ;
S1 = [l] ,S1 = [l] ,S2 = [o,m] ;S2 = [o,m] ;
S1 = [l,o] ,S1 = [l,o] ,S2 = [m] ;S2 = [m] ;
S1 = [l,o,m] ,S1 = [l,o,m] ,S2 = [] ;S2 = [] ;
nono