Logické programování Přednáška číslo 2
2 Programování v Prologu 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), young(X), not(smoke(X)). young(X), not(smoke(X)). – kladení otázek na objekty a relace ?-wrote(tolkien,Book).
3 První program Rodinné vztahy PepíkIva PetrIvana
4 Zápis v Prologu % deklarovani faktu % pohlavi osob muz(petr). muz(pepik).zena(ivana).zena(iva). % vztah mezi osobami % rodice(Otec,Matka,Dite). rodice(petr,ivana,pepik).rodice(petr,ivana,iva).
5 Pravidla % otec(Kdo,Komu) otec(O,D) :- rodice(O,_,D). % otec(Kdo) otec(O) :- rodice(O,_,_). % sestra(Kdo,Komu) sestra(S,X) :- zena(S), rodice(O,M,S), rodice(O,M,S), rodice(O,M,X), rodice(O,M,X), S\=X. S\=X.
6 První program Rozšíření databáze faktů PepíkIva PetrIvana KarelAnnaJosefVěra
7 Pravidla % dedecek(Deda,Vnouce) 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íku dedecek(D,V) :- rodice(D,_,X), (rodice(X,_,V) ; rodice(_,X,V)). (rodice(X,_,V) ; rodice(_,X,V)).
8 Další rozšiřování Napište predikáty pro relace: matka, dcera, syn, bratr, babicka, … Rozšíření databáze faktů - k zadávání dat využijte pouze predikáty zena/1, muz/1, rodice/3 zena/1, muz/1, rodice/3 Napište predikáty pro další relace: - stryc, teta, snacha, svagr, svagrova, tchyne, tchan, sestrenice, bratranec, synovec, neter,... - predek(Osoba,Predek) % - k zadané osobě postupně vypíše všechny předky - potomek(Osoba, Potomek) % - postupně najde všechny potomky
9 Prolog – znovu a lépe Syntaxe Prologu - program se skládá z termů - term je zapsán jako sekvence znaků dané abecedy malá a velká písmena malá a velká písmena číslice číslice speciální znaky speciální znaky
10 Prolog – znovu a lépe Syntaxe Prologu proměnnákonstanta atominteger term struktura
11 Prolog – znovu a lépe Konstanty - určují jména objektů a relací - rozlišujeme – atomy a integery Integer celá čísla ( -5, 0, 1, 4073) celá čísla ( -5, 0, 1, 4073) rozsah záleží na implementaci rozsah záleží na implementaci většina moderních implementací umí pracovat i s reálnými čísly většina moderních implementací umí pracovat i s reálnými čísly přesto ani dnes Prolog není jazykem pro složité matematické výpočty přesto ani dnes Prolog není jazykem pro složité matematické výpočty
12 Prolog – znovu a lépe Atomy sekvence znaků začínající malým písmenem sekvence znaků začínající malým písmenem likes, tom, president, paris, my_book, x5 – řetězec znaků uzavřený v apostrofech ‘Tom’, ‘Clinton’, ‘Paris’, ‘Karel_IV’, ‘100’ – speciální atomy ?-, :-, !, tečka ?-, :-, !, tečka
13 Prolog – znovu a lépe Proměnné sekvence znaků začínající velkým písmenem nebo podtržítkem sekvence znaků začínající velkým písmenem nebo podtržítkem X, Who, Vstup, Dedova_vnucka, _3_prani X, Who, Vstup, Dedova_vnucka, _3_prani samotné podtržítko je anonymní proměnná, jejíž hodnota mne nezajímá a nebude dále využívána samotné podtržítko je anonymní proměnná, jejíž hodnota mne nezajímá a nebude dále využívána ?- dedecek(D,_). % je D dědečkem? ?- dedecek(D,_). % je D 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).
14 Prolog – znovu a lépe Struktury objekty skládající se z jiných objektů (komponent) objekty skládající se z jiných objektů (komponent) 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í funktoru komponenty mohou být spojeny pomocí funktoru sdružování souvisejících informací napomáhá lepší organizaci dat sdružování souvisejících informací napomáhá lepší organizaci dat kniha(rur, autor(karel, capek)). 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). % Kdo napsal rur? Kdo = autor(karel, capek)
15 Prolog – znovu a lépe Aritmetické operátory +, -sčítání, odečítání +, -sčítání, odečítání *, /násobení, dělení //celočíselné dělení („div“) //celočíselné dělení („div“) mod zbytek po dělení operátory mají obvyklou prioritu, ale je snadné ji předefinovat operátory mají obvyklou prioritu, ale je snadné ji předefinovat standardní je levá asociativita, ale i tu lze snadno předefinovat standardní je levá asociativita, ale i tu lze snadno předefinovat 4 / 2 / 2 levá asoc.: (4/2)/2 = 1 pravá asoc.: 4/(2/2) = 4 zápis 3+5 je chápán jako struktura +(3,5) a neplatí tedy automaticky ani 3+5 = 8 zápis 3+5 je chápán jako struktura +(3,5) a neplatí tedy automaticky ani 3+5 = 8 struktura vytvořená pomocí aritmetických operátorů je struktura jako každá jiná a vyhodnotí se až použitím operátoru is struktura vytvořená pomocí aritmetických operátorů je struktura jako každá jiná a vyhodnotí se až použitím operátoru is
16 Prolog – znovu a lépe Operátor rovnosti ‘=‘ atomy se rovnají pouze samy sobě atomy se rovnají pouze samy sobě ?- jirka=jirka. ?- jirka=tom. yesno ?- tom=‘Tom’. no integery se rovnají pouze samy sobě integery se rovnají pouze samy sobě ?- 23=23. ?- 25=23. yesno
17 Prolog – znovu a lépe Operátor rovnosti ‘=‘ je-li jedna strana rovnosti specifikovaná a druhá nespecifikovaná, příslušná proměnná nabude konkrétní hodnotu je-li jedna strana rovnosti specifikovaná a druhá nespecifikovaná, příslušná proměnná nabude konkrétní hodnotu ?- X=jirka. ?- tom=T. X=jirka. T=tom yes yes ?- K = likes(adam, eva). ?- A=3, B = 5, A=B. K = likes(adam, eva).no yes % 5 \= 3
18 Prolog – znovu a lépe Operátor rovnosti ‘=‘ dvě struktury se rovnají, jestliže mají stejný funktor, aritu a odpovídající si komponenty jsou si rovny dvě struktury se rovnají, jestliže mají stejný funktor, aritu a odpovídající si komponenty jsou si rovny ?- osoba(X,Y,kladno,nar(5,6,85))=osoba(jan,toman,M,nar(5,6,85)). X = jan Y = toman M = kladno yes
19 Prolog – znovu a lépe Operátor rovnosti ‘=‘ při porovnání dvou nespecifikovaných proměnných se tyto proměnné stanou sdílenými a pokud později některá z nich bude specifikována, tutéž hodnotu převezme i proměnná druhá při porovnání dvou nespecifikovaných proměnných se tyto proměnné stanou sdílenými a pokud později některá z nich bude specifikována, tutéž hodnotu převezme i proměnná druhá ?- X =Y, Y = 5. ?- X =Y, Y = 5, X = 3. X = 5 no Y = 5 Y = 5 % 5\=3yes
20 Prolog – znovu a lépe Operátor rovnosti ‘=‘ - shrnutí: snaží udělat obě strany shodnými a uspěje vždy, když je alespoň jedna strana nespecifikovaná snaží udělat obě strany shodnými a uspěje vždy, když je alespoň jedna strana nespecifikovaná Opačný predikát ‘\=‘ uspěje vždy, když není splněn predikát ‘=’ uspěje vždy, když není splněn predikát ‘=’ sestra(S,X) :- zena(S), rodice(O,M,S), rodice(O,M,X), rodice(O,M,S), rodice(O,M,X), S\=X. S\=X.
21 Prolog – znovu a lépe Další porovnávací operátory == čisté porovnání == čisté porovnání (porovná, ale nepřiřadí) \== nerovnost, opak k == \== nerovnost, opak k == ?- X == 2. ?- X = 3, X == 3. noX = 3 yes ?- 6 == 5+1. ?- 1+5 == 5+1. nono
22 Prolog – znovu a lépe Další porovnávací operátory =:= porovnání s vyhodnocením =:= porovnání s vyhodnocením (pracovně vyhodnotí výrazy) =\= nerovnost, opak k =:= =\= nerovnost, opak k =:= ?- 1+5 =:= 5+1. yes ?- X = 4+5, Y = 3+6, X =:= Y. ?- X = 4+5, Y = 3+6, X == Y. X = 4+5 no X = 4+5 no Y = 3+6 % +(4,5) není totéž jako +(3,6) yes
23 Prolog – znovu a lépe Operátor vyčíslení ‘is‘: vyčíslí pravou stranu výrazu a pokusí se přiřadit výslednou hodnotu levé straně vyčíslí pravou stranu výrazu a pokusí se přiřadit výslednou hodnotu levé straně ?- X is 6*(4+2)/2. ?- 9 is 5+4. ?- X =1, X is X+1. X = 18yesno yes Další porovnávací operátory Další porovnávací operátory >,, < větší, menší >=, = =, =< větší rovno, menší rovno (POZOR - nesmí vypadat jako šipka!!!)
24 Použití středníku % absolutní hodnota(Cislo,Vysledek) abs_h(C,V) :- C>=0, V is C ; V is –C. % korektní provedení abs_h(C,V) :- C>=0, V is C. abs_h(C,V) :- C < 0, V is -C.
25 Příklad – skripta str. 78 kral(premysl_otakar_I,1197,1230).kral(vaclav_I,1230,1253).kral(premysl_otakar_II,1253,1278). predchudce(Prvni, Druhy):-kral(Prvni,_,Do),kral(Druhy,Do,_). naslednik(A,B):-predchudce(B,A). ?- kral(vaclav_I,1230,1253). yes ?- kral(X, 1253,Rok). X = premysl_otakar_II, Rok = 1278 Skutečnosti (fakta) Obecné vztahy (pravidla) Konverzace s Prologem
26 Příklad – skripta str. 78 panoval(Rok, Kral) :- kral(Kral, R1, R2), Rok >= R1, Rok = = R1, Rok =< R2. ?-panoval(1273, X). X = premysl_otakar_II yes doba_vlady(Kral, Kolik):- kral(Kral,R1,R2), Kolik is R2-R1. ?- doba_vlady(premysl_otakar_II,X). X = 25 % tentýž program funguje i opačně – od výstupu ke vstupu % tzv. reverzibilita logických programů ?- doba_vlady(X,25). X = premysl_otakar_II yes