260 likes | 390 Views
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),
E N D
Logické programování Přednáška číslo 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)). • kladení otázek na objekty a relace ?-wrote(tolkien,Book).
První program • Rodinné vztahy Petr Ivana Pepík Iva
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).
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,X), S\=X.
První program • Rozšíření databáze faktů Karel Anna Josef Věra Petr Ivana Pepík Iva
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)).
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 • 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
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 • číslice • speciální znaky
Prolog – znovu a lépe • Syntaxe Prologu term konstanta proměnná struktura integer atom
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) • rozsah záleží na implementaci • 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
Prolog – znovu a lépe • Atomy • 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
Prolog – znovu a lépe • Proměnné • sekvence znaků začínající velkým písmenem nebo podtržítkem 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 ?- dedecek(D,_). % je D dědečkem? • anonymní proměnná je v každém výskytu jedinečná dedecek(D,V) :- rodice(D,_,X), rodice(X,_,V).
Prolog – znovu a lépe • Struktury • objekty skládající se z jiných objektů (komponent) kniha(rur, karel, capek). kontakt(tom,novak, horni, 32, kladno, 6, 3, 1986). • komponenty mohou být spojeny pomocí funktoru • 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í ?- kniha(rur,Kdo). % Kdo napsal rur? Kdo = autor(karel, capek)
Prolog – znovu a lépe • Aritmetické operátory • +, - sčítání, odečítání • *, / násobení, dělení • // celočíselné dělení („div“) • mod zbytek po dělení • operátory mají obvyklou prioritu, ale je snadné ji 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+5je 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
Prolog – znovu a lépe • Operátor rovnosti ‘=‘ • atomy se rovnají pouze samy sobě ?- jirka=jirka. ?- jirka=tom. yes no ?- tom=‘Tom’. no • integery se rovnají pouze samy sobě ?- 23=23. ?- 25=23. yes no
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 ?- 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
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 ?- osoba(X,Y,kladno,nar(5,6,85))=osoba(jan,toman,M,nar(5,6,85)). X = jan Y = toman M = kladno yes
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á ?- X =Y, Y = 5. ?- X =Y, Y = 5, X = 3. X = 5 no Y = 5 % 5\=3 yes
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á • Opač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), S\=X.
Prolog – znovu a lépe • Další porovnávací operátory • == čisté porovnání (porovná, ale nepřiřadí) • \==nerovnost, opak k == ?- X == 2. ?- X = 3, X == 3. no X = 3 yes ?- 6 == 5+1. ?- 1+5 == 5+1. no no
Prolog – znovu a lépe • Další porovnávací operátory • =:= porovnání s vyhodnocením (pracovně vyhodnotí výrazy) • =\=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 Y = 3+6 % +(4,5) není totéž jako +(3,6) yes
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ě ?- X is 6*(4+2)/2. ?- 9 is 5+4. ?- X =1, X is X+1. X = 18 yes no yes • Další porovnávací operátory • >, < větší, menší • >=, =< větší rovno, menšírovno (POZOR - nesmí vypadat jako šipka!!!)
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.
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
Příklad – skripta str. 78 panoval(Rok, Kral) :- kral(Kral, R1, R2), R >= R1, R =< R2. ?-panoval(1273, X). X = premysl_otakar_II yes doba_vlady(Kral, Kolik):- kral(Kral,R1,R2), Kolik=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