View
49
Download
2
Category
Preview:
DESCRIPTION
Logické programování. Přednáška číslo 2. Programování v Prolog u. Programování v PROLOGu spočívá v deklarování určitých faktů o objektech a relacích premier ( uk,cameron ). definování pravidel vztahujících se k objektům a relacím likes ( alena,X ):-male(X), handsome (X), rich (X), - PowerPoint PPT Presentation
Citation preview
Logické programováníLogické programování
Přednáška číslo 2Přednáška číslo 2
22
Programování v Programování v PrologProloguu
Programování v PROLOGu spočívá vProgramování v PROLOGu spočívá v– deklarování určitých faktů o objektech a deklarování určitých faktů o objektech a
relacíchrelacích
premier(uk,cameron).premier(uk,cameron).– definování pravidel vztahujících se k definování pravidel vztahujících se k
objektům a relacímobjektům a relacím
likes(alena,X):-male(X), handsome(X), rich(X), likes(alena,X):-male(X), handsome(X), rich(X),
young(X), not(smoke(X)).young(X), not(smoke(X)).– kladení otázek na objekty a relacekladení otázek na objekty a relace
?-wrote(tolkien,Book).?-wrote(tolkien,Book).
33
První programPrvní program
Rodinné vztahyRodinné vztahy
Pepík Iva
Petr Ivana
44
Zápis v Zápis v PrologProloguu
% deklarovani faktu% deklarovani faktu% pohlav% pohlavi osobi osobmuz(petrmuz(petr).).muz(pepik).muz(pepik).zena(ivana).zena(ivana).zena(iva).zena(iva).
%% vztah mezi osobami vztah mezi osobami%% rodice(Otec,Matka,Dite). rodice(Otec,Matka,Dite).rodice(petr,ivana,pepik).rodice(petr,ivana,pepik).rodice(petr,ivana,iva).rodice(petr,ivana,iva).
55
PravidlaPravidla
% % otec(Kdo,Komu)otec(Kdo,Komu)otecotec((O,D) :- rodice(O,_,D).O,D) :- rodice(O,_,D).
% % otec(Kdo)otec(Kdo)otecotec((O) :- rodice(O,_,_).O) :- rodice(O,_,_).
% % sestra(Kdo,Komu)sestra(Kdo,Komu)sestrasestra((S,X) :- zena(S), S,X) :- zena(S),
rodice(O,M,S), rodice(O,M,S), rodice(O,M,X),rodice(O,M,X), SS\=X.\=X.
66
První programPrvní program
Rozšíření databáze faktůRozšíření databáze faktů
Pepík Iva
Petr Ivana
Karel Anna Josef Věra
77
PravidlaPravidla
% % dedecek(Deda,Vnouce)dedecek(Deda,Vnouce)dedecek(D,V) :- rodice(D,_,X), rodice(X,_,V).dedecek(D,V) :- rodice(D,_,X), rodice(X,_,V).dedecek(D,V) :- rodice(D,_,X), rodice(_,X,V).dedecek(D,V) :- rodice(D,_,X), rodice(_,X,V).
% % lze zapsat i s použitím středníkulze zapsat i s použitím středníkudedecek(D,V) :- rodice(D,_,X), dedecek(D,V) :- rodice(D,_,X),
(rodice(X,_,V) (rodice(X,_,V) ;; rodice(_,X,V)).rodice(_,X,V)).
88
Další rozšiřováníDalší rozšiřováníNapište predikáty pro relace:Napište predikáty pro relace: matka, dcera, syn, bratr, babicka, …matka, dcera, syn, bratr, babicka, …
Rozšíření databáze faktůRozšíření databáze faktů- - k zadávání dat vyk zadávání dat vyuužijte pouze predikátyžijte pouze predikáty zenazena/1, muz/1, rodice/3/1, muz/1, rodice/3
Napište predikáty pro další relace:Napište predikáty pro další relace: - - stryc, teta, snacha, stryc, teta, snacha, svagr, svagrova, svagr, svagrova, tchyne, tchan, tchyne, tchan, sestrenice, bratranec,sestrenice, bratranec, synovec, neter, synovec, neter, ......- - predek(Osoba,Predek) predek(Osoba,Predek) % -% - k k zadané osobě postupně vypíše všechny předkyzadané osobě postupně vypíše všechny předky
- potomek(Osoba, Potomek) - potomek(Osoba, Potomek) %% - - postupně najde všechny potomkypostupně najde všechny potomky
99
PrologProlog – znovu a lépe – znovu a lépe
Syntaxe ProloguSyntaxe Prologu
- program se skládá z termů- program se skládá z termů
- term je zapsán jako sekvence znaků dané - term je zapsán jako sekvence znaků dané abecedyabecedy
malá a velká písmenamalá a velká písmena
číslicečíslice
speciální znakyspeciální znaky
1010
PrologProlog – znovu a lépe – znovu a lépe
Syntaxe ProloguSyntaxe Prologu
proměnnákonstanta
atominteger
term
struktura
1111
PrologProlog – znovu a lépe – znovu a lépeKonstantyKonstanty- určují jména objektů a relací- určují jména objektů a relací- rozlišujeme – atomy a integery- rozlišujeme – atomy a integery
IntegerInteger celá čísla celá čísla ( -5, 0, 1, 4073)( -5, 0, 1, 4073) rozsah záleží na implementacirozsah záleží na implementaci většina moderních implementací umí pracovat i s většina moderních implementací umí pracovat i s reálnými číslyreálnými čísly přesto ani dnes Prolog není jazykem pro složité přesto ani dnes Prolog není jazykem pro složité matematické výpočty matematické výpočty
1212
PrologProlog – znovu a lépe – znovu a lépe
AtomyAtomy sekvence znaků začínající malým písmenem sekvence znaků začínající malým písmenem
likes, tom, president, paris, my_book, x5likes, tom, president, paris, my_book, x5
– řetězec znaků uzavřený v apostrofechřetězec znaků uzavřený v apostrofech
‘‘Tom’, ‘Clinton’, ‘Paris’, ‘Karel_IV’, ‘100’Tom’, ‘Clinton’, ‘Paris’, ‘Karel_IV’, ‘100’
– speciální atomyspeciální atomy ?-, :-, !, tečka?-, :-, !, tečka
1313
PrologProlog – znovu a lépe – znovu a lépe
ProměnnéProměnné sekvence znaků začínající velkým písmenem nebo sekvence znaků začínající velkým písmenem nebo
podtržítkempodtržítkem X, Who, Vstup, Dedova_vnucka, _3_praniX, Who, Vstup, Dedova_vnucka, _3_prani
samotné podtržítko je anonymní proměnná, jejíž samotné podtržítko je anonymní proměnná, jejíž hodnota mne nezajímá a nebude dále využívánahodnota mne nezajímá a nebude dále využívána
?- dedecek(D,_). ?- dedecek(D,_). % % jeje D D dědečkem?dědečkem?
anonymní proměnná je v každém výskytu jedinečnáanonymní proměnná je v každém výskytu jedinečná dedecek(D,V) :- rodice(D,_,X), rodice(X,_,V).dedecek(D,V) :- rodice(D,_,X), rodice(X,_,V).
1414
PrologProlog – znovu a lépe – znovu a lépeStrukturyStruktury
objekty skládající se z jiných objektů (komponent)objekty skládající se z jiných objektů (komponent)kniha(rur, karel, capek).kniha(rur, karel, capek).
kontakt(tom,novak, horni, 32, kladno, 6, 3, 1986).kontakt(tom,novak, horni, 32, kladno, 6, 3, 1986).
komponenty mohou být spojeny pomocí funktorukomponenty mohou být spojeny pomocí funktoru sdružování souvisejících informací napomáhá lepší sdružování souvisejících informací napomáhá lepší organizaci dat organizaci dat
kniha(rur, autor(karel, capek)).kniha(rur, autor(karel, capek)).kontakt(osoba(tom,novak), adresa(horni,32,kladno), nar(6,3,1986)).kontakt(osoba(tom,novak), adresa(horni,32,kladno), nar(6,3,1986)).
struktury se mohou účastnit dotazování struktury se mohou účastnit dotazování ?- kniha(rur,Kdo). ?- kniha(rur,Kdo). % % Kdo napsal rur?Kdo napsal rur?Kdo = autor(karel, capek)Kdo = autor(karel, capek)
1515
PrologProlog – znovu a lépe – znovu a lépeAritmetické operátoryAritmetické operátory
++, -, - sčítání, odečítání sčítání, odečítání **, /, / násobení, dělenínásobení, dělení //// celočíselné dělení („div“)celočíselné dělení („div“)modmod zbytek po dělenízbytek po dělení
operátory mají obvyklou prioritu, ale je snadné ji předefinovatoperátory mají obvyklou prioritu, ale je snadné ji předefinovat standardní je levá asociativita, ale i tu lze snadno standardní je levá asociativita, ale i tu lze snadno
předefinovatpředefinovat4 4 // 22 // 2 2 levá asoc.: levá asoc.: (4/2)/2 = 1(4/2)/2 = 1
pravá asoc.: pravá asoc.: 4/(2/2) = 44/(2/2) = 4
zápis zápis 33+5+5 je chápán jako struktura je chápán jako struktura +(3,5)+(3,5) a neplatí tedy a neplatí tedy automaticky ani automaticky ani 33+5+5 = 8 = 8 struktura vytvořená pomocí aritmetických operátorů je struktura vytvořená pomocí aritmetických operátorů je struktura jako každá jiná a vyhodnotí se až použitím struktura jako každá jiná a vyhodnotí se až použitím operátoru operátoru isis
1616
PrologProlog – znovu a lépe – znovu a lépeOperátor rovnosti Operátor rovnosti ‘=‘‘=‘
atomy se atomy se rovnají pouze samy soběrovnají pouze samy sobě?- jirka=jirka. ?- jirka=jirka. ?- jirka=tom.?- jirka=tom.yesyes nono
?- tom=?- tom=‘Tom’‘Tom’..nono
integery se integery se rovnají pouze samy soběrovnají pouze samy sobě?- ?- 2323==2323. . ?- ?- 2525==2323..yesyes nono
1717
PrologProlog – znovu a lépe – znovu a lépeOperátor rovnosti Operátor rovnosti ‘=‘‘=‘
je-li jedna strana rovnosti specifikovaná a je-li jedna strana rovnosti specifikovaná a druhá nespecifikovaná, příslušná proměnná druhá nespecifikovaná, příslušná proměnná nabude konkrétní hodnotunabude konkrétní hodnotu
?- X=jirka. ?- X=jirka. ?- tom=?- tom=TT..X=jirka. X=jirka. T=tomT=tomyes yes yesyes
?- K = likes(adam, eva). ?- K = likes(adam, eva). ?- A=3, B = 5, A=B.?- A=3, B = 5, A=B.K = likes(adam, eva).K = likes(adam, eva). no no yes yes % 5 \= 3% 5 \= 3
1818
PrologProlog – znovu a lépe – znovu a lépeOperátor rovnosti Operátor rovnosti ‘=‘‘=‘
dvě struktury se rovnají, jestliže mají stejný dvě struktury se rovnají, jestliže mají stejný funktor, aritu a odpovídající si komponenty funktor, aritu a odpovídající si komponenty jsou si rovnyjsou si rovny
?- ?- osoba(X,Y,kladno,nar(5,6,85))=osoba(jan,toman,M,nar(5,6,85)). osoba(X,Y,kladno,nar(5,6,85))=osoba(jan,toman,M,nar(5,6,85)).
X = janX = janY = tomanY = tomanM = kladnoM = kladnoyes yes
1919
PrologProlog – znovu a lépe – znovu a lépeOperátor rovnosti Operátor rovnosti ‘=‘‘=‘
při porovnání dvou nespecifikovaných při porovnání dvou nespecifikovaných proměnných se tyto proměnné stanou proměnných se tyto proměnné stanou sdílenými a pokud později některá z nich sdílenými a pokud později některá z nich bude specifikována, tutéž hodnotu bude specifikována, tutéž hodnotu převezme i proměnná druhápřevezme i proměnná druhá
?- X =Y, Y = 5. ?- X =Y, Y = 5. ?- X =Y, Y = 5, X = 3. ?- X =Y, Y = 5, X = 3. X = 5X = 5 no noY = 5Y = 5 % 5\=3
yes yes
2020
PrologProlog – znovu a lépe – znovu a lépe
Operátor rovnosti Operátor rovnosti ‘=‘‘=‘ - shrnutí: - shrnutí:
snaží udělat obě strany shodnými a uspěje vždy, snaží udělat obě strany shodnými a uspěje vždy, když je alespoň jedna strana nespecifikovanákdyž je alespoň jedna strana nespecifikovaná
Opačný predikát Opačný predikát ‘\=‘‘\=‘
uspěje vždy, když není splněn predikát uspěje vždy, když není splněn predikát ‘=’ ‘=’
sestrasestra((S,X) :- zena(S), S,X) :- zena(S), rodice(O,M,S), rodice(O,M,X),rodice(O,M,S), rodice(O,M,X), SS\=X.\=X.
2121
PrologProlog – znovu a lépe – znovu a lépe
Další porovnávací operátory Další porovnávací operátory
=== = čisté porovnání čisté porovnání
(porovná, ale nepřiřadí)(porovná, ale nepřiřadí)
\=\=== nerovnost, opak k ==nerovnost, opak k ==
?- X == 2. ?- X == 2. ?- X = 3, X == 3. ?- X = 3, X == 3.
nono X = 3X = 3
yesyes
?- 6?- 6 = === 5+1. 5+1. ?- 1?- 1+5 =+5 === 5+1. 5+1.
nono nono
2222
PrologProlog – znovu a lépe – znovu a lépe
Další porovnávací operátory Další porovnávací operátory
==:= := porovnání porovnání s s vyhodnocenímvyhodnocením(pracovně vyhodnotí výrazy)(pracovně vyhodnotí výrazy)
==\\== nerovnost, opak k =:=nerovnost, opak k =:=
?- 1?- 1+5 =+5 =:=:= 5+1 5+1. . yesyes
?- X = 4?- X = 4+5, Y = 3+6, X =:+5, Y = 3+6, X =:== Y. Y. ?- X = 4?- X = 4+5, Y = 3+6, X +5, Y = 3+6, X ==== Y. Y.
X = 4X = 4+5 +5 no noY = 3+6 Y = 3+6 % +(4,5) % +(4,5) není totéž jakonení totéž jako +(3,6) +(3,6) yesyes
2323
PrologProlog – znovu a lépe – znovu a lépeOperátor vyčíslení Operátor vyčíslení ‘‘isis‘‘::
vyčíslí pravou stranu výrazu a pokusí se přiřadit vyčíslí pravou stranu výrazu a pokusí se přiřadit výslednou hodnotu levé straněvýslednou hodnotu levé straně
?- X is ?- X is 6*(6*(44+2)/2+2)/2. . ?- 9 is 5?- 9 is 5++4. 4. ?- X =1, X is ?- X =1, X is XX+1.+1.X = X = 1818 yesyes nonoyesyes
Další porovnávací operátoryDalší porovnávací operátory
>, < >, < větší, menšívětší, menší >=, =< >=, =< větší rovno, menšívětší rovno, menší rovnorovno
(POZOR - nesmí vypadat jako šipka!!!)(POZOR - nesmí vypadat jako šipka!!!)
2424
Použití středníkuPoužití středníku
% % absolutní hodnota(Cislo,Vysledek)absolutní hodnota(Cislo,Vysledek)abs_h(C,V) :- Cabs_h(C,V) :- C>=0, V is C ; V is –C.>=0, V is C ; V is –C.
% % korektní provedeníkorektní provedeníabs_h(C,V) :- Cabs_h(C,V) :- C>=0, V is C.>=0, V is C.abs_h(C,V) :- C abs_h(C,V) :- C < 0, V is -C.< 0, V is -C.
2525
Příklad – skripta str. 78Příklad – skripta str. 78kral(premysl_otakar_I,1197,1230).kral(premysl_otakar_I,1197,1230).
kral(vaclav_I,1230,1253).kral(vaclav_I,1230,1253).
kral(premysl_otakar_II,1253,1278).kral(premysl_otakar_II,1253,1278).
predchudce(Prvni, Druhy):-kral(Prvni,_,Do),kral(Druhy,Do,_).predchudce(Prvni, Druhy):-kral(Prvni,_,Do),kral(Druhy,Do,_).
naslednik(A,B):-predchudce(B,A).naslednik(A,B):-predchudce(B,A).
?- kral(vaclav_I,1230,1253). ?- kral(vaclav_I,1230,1253).
yesyes
?- kral(X, 1253,Rok).?- kral(X, 1253,Rok).
X = premysl_otakar_II, Rok = 1278X = premysl_otakar_II, Rok = 1278
Skutečnosti (fakta)
Obecné vztahy (pravidla)
Konverzace s Prologem
2626
Příklad – skripta str. 78Příklad – skripta str. 78panovalpanoval(Rok, Kral) :- kral(Kral, R1, R2), Rok (Rok, Kral) :- kral(Kral, R1, R2), Rok >= R1, R>= R1, Rokok =< R2. =< R2.
?-panoval(1273, X).?-panoval(1273, X).X = X = premysl_otakar_IIpremysl_otakar_IIyesyes
doba_vlady(Kral, Kolik):- doba_vlady(Kral, Kolik):- kral(kral(KralKral,,R1R1,,R2R2)), Kolik, Kolik is is R2-R1R2-R1. .
?- ?- doba_vladydoba_vlady(premysl_otakar_II,(premysl_otakar_II,XX).).X = 2X = 255
% % tentýž tentýž program program funguje i opačně – od výstupu ke vstupu funguje i opačně – od výstupu ke vstupu % % tzv. reverzibilita logických programů tzv. reverzibilita logických programů
?- ?- doba_vladydoba_vlady((X,25X,25).).X = premysl_otakar_IIX = premysl_otakar_IIyesyes
Recommended