26
Logické programování Logické programování Přednáška číslo 2 Přednáška číslo 2

Logické programování

  • Upload
    keena

  • View
    49

  • Download
    2

Embed Size (px)

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

Page 1: Logické programování

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

Přednáška číslo 2Přednáška číslo 2

Page 2: Logické programování

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

Page 3: Logické programování

33

První programPrvní program

Rodinné vztahyRodinné vztahy

Pepík Iva

Petr Ivana

Page 4: Logické programování

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

Page 5: Logické programování

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.

Page 6: Logické programování

66

První programPrvní program

Rozšíření databáze faktůRozšíření databáze faktů

Pepík Iva

Petr Ivana

Karel Anna Josef Věra

Page 7: Logické programování

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

Page 8: Logické programování

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

Page 9: Logické programování

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

Page 10: Logické programování

1010

PrologProlog – znovu a lépe – znovu a lépe

Syntaxe ProloguSyntaxe Prologu

proměnnákonstanta

atominteger

term

struktura

Page 11: Logické programování

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

Page 12: Logické programování

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

Page 13: Logické programování

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

Page 14: Logické programování

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)

Page 15: Logické programování

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

Page 16: Logické programování

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

Page 17: Logické programování

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

Page 18: Logické programování

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

Page 19: Logické programování

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

Page 20: Logické programování

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.

Page 21: Logické programování

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

Page 22: Logické programování

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

Page 23: Logické programování

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

Page 24: Logické programování

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.

Page 25: Logické programování

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

Page 26: Logické programování

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