+ All Categories
Home > Documents > Logické programování

Logické programování

Date post: 06-Jan-2016
Category:
Upload: lok
View: 24 times
Download: 3 times
Share this document with a friend
Description:
Logické programování. Přednáška číslo 4. Seznamy. Seznam je uspořádaná sekvence elementů libovolné délky Seznam se zapisuje v hranatých závorkách Příklady: [ alena , klara , lucie , zuzana ] [ plzen , sparta , slavie , hradec_kralove , brno ] [ liberec , pardubice , 3, 2] - PowerPoint PPT Presentation
15
Logické programování Logické programování Prezentace číslo 4 Prezentace číslo 4
Transcript
Page 1: Logické programování

Logické programováníLogické programování

Prezentace číslo 4Prezentace číslo 4

Page 2: Logické programování

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

Page 3: Logické programování

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]]

Page 4: Logické programování

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

Page 5: Logické programování

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

Page 6: Logické programování

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

Page 7: Logické programování

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).

......

Page 8: Logické programování

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

Page 9: Logické programování

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

Page 10: Logické programování

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

Page 11: Logické programování

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

Page 12: Logické programování

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

Page 13: Logické programování

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

Page 14: Logické programování

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] ; ;

Page 15: Logické programování

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


Recommended