90
Programovací jazyk Prolog Logické programování Šárka Vavrečková Ústav informatiky, Filozoficko-přírodovědecká fakulta Slezské univerzity v Opavě [email protected] 1. prosince 2008

Programovací jazyk Prolog - vavreckova.zam.slu.czvavreckova.zam.slu.cz/obsahy/log2/prezentace/log11_1_prolog.pdf · L SWI Prolog šířený pod GNU licencí a používaný v Unixech,

Embed Size (px)

Citation preview

Programovací jazyk PrologLogické programování

Šárka Vavrečková

Ústav informatiky, Filozoficko-přírodovědecká fakulta Slezské univerzity v Opavě

[email protected]

1. prosince 2008

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Prolog

Co je to Prolog

Prolog je jazyk pro logické programování, vznikl ve Franciiv roce 1973 (prof. A. Colmerauer).Je to zkratka z francouzského PROgramation à LOGic(„programování v logiceÿ).Je to interpretační deklarativní jazyk.

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Prolog

Varianty Prologu

L SWI Prolog šířený pod GNU licencí a používaný v Unixech,Linuxu a Windows,

L LPA Win Prolog je komerční program pro Windowspovažovaný za jeden z nejlepších pro tuto platformu,

L GNU Prolog pro Unixy a Linux,L OpenProlog pro MacOS,L Amzi! Prolog, Visual Prolog, Strawbery Prolog, atd.,L rozšíření: Fuzzy Prolog, Templog, Chronolog, TemporalProlog, Mercury, atd.

Viz www.fpf.slu.cz/~vav10ui/vyukaprol.html.

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Prolog

Rozdíly mezi variantami

L licence (některé jsou komerční, jiné volně šiřitelné, také podGPL (SWI Prolog, GNU Prolog),

L grafické rozhraní – vždy je přítomna „konzolaÿ na zadávánípříkazů, ale může vypadat jinak, dále v rozhraní může/nemusíbýt editor samotných programů(znalostních bází), rozdílv ovládání, klávesových zkratkách, atd.,

L predikáty pro vstupy a výstupy, včetně práce se soubory –někdy bývají jinak nazvány, případně jinak fungují, to je častozpůsobeno tím, že bývají psány pro různé SW platformy,

L další přidané predikáty, které nejsou v základní normě proProlog,

L přípony zdrojového souboru programu, atd.

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Používání Prologu

Postup

1. Vytvoříme znalostní bázi = program popisující „světÿ, vekterém se budeme pohybovat.

2. Zadáváme dotazy (cílové klauzule), Prolog odpovídá yesnebo no podle toho, zda je formule dotazu splnitelnáv zadaném programu (světě), nebo vypíše hodnoty parametrů,pro které je splnitelná (ohodnocení).

3. Prolog rozhoduje podleL našeho programu,L vnitřních pravidel – obdoby logických axiomů v klauzulárnílogice.

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Používání Prologu

Postup

1. Vytvoříme znalostní bázi = program popisující „světÿ, vekterém se budeme pohybovat.

2. Zadáváme dotazy (cílové klauzule), Prolog odpovídá yesnebo no podle toho, zda je formule dotazu splnitelnáv zadaném programu (světě), nebo vypíše hodnoty parametrů,pro které je splnitelná (ohodnocení).

3. Prolog rozhoduje podleL našeho programu,L vnitřních pravidel – obdoby logických axiomů v klauzulárnílogice.

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Používání Prologu

Postup

1. Vytvoříme znalostní bázi = program popisující „světÿ, vekterém se budeme pohybovat.

2. Zadáváme dotazy (cílové klauzule), Prolog odpovídá yesnebo no podle toho, zda je formule dotazu splnitelnáv zadaném programu (světě), nebo vypíše hodnoty parametrů,pro které je splnitelná (ohodnocení).

3. Prolog rozhoduje podleL našeho programu,L vnitřních pravidel – obdoby logických axiomů v klauzulárnílogice.

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Používání Prologu

Postup

1. Vytvoříme znalostní bázi = program popisující „světÿ, vekterém se budeme pohybovat.

2. Zadáváme dotazy (cílové klauzule), Prolog odpovídá yesnebo no podle toho, zda je formule dotazu splnitelnáv zadaném programu (světě), nebo vypíše hodnoty parametrů,pro které je splnitelná (ohodnocení).

3. Prolog rozhoduje podleL našeho programu,L vnitřních pravidel – obdoby logických axiomů v klauzulárnílogice.

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Používání Prologu

Postup

1. Vytvoříme znalostní bázi = program popisující „světÿ, vekterém se budeme pohybovat.

2. Zadáváme dotazy (cílové klauzule), Prolog odpovídá yesnebo no podle toho, zda je formule dotazu splnitelnáv zadaném programu (světě), nebo vypíše hodnoty parametrů,pro které je splnitelná (ohodnocení).

3. Prolog rozhoduje podleL našeho programu,L vnitřních pravidel – obdoby logických axiomů v klauzulárnílogice.

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Program v Prologu

DefiniceProgram v Prologu je konečná neprázdná množina Hornovýchklauzulí. Je to ekvivalent znalostní báze klauzulární logikya množiny speciálních axiomů Klauzulárního axiomatickéhosystému.V programu lze použít dva druhy klauzulí:L pravidla – obecná tvrzení ve tvaru „Závěr platí, pokud platívšechny jeho předpoklady zároveň.ÿ

L fakty – konstantní tvrzení

Používání programu spočívá v zadávání dotazů (cílových klauzulí)– Hornových klauzulí bez pozitivních literálů.

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Zápis klauzulí v Prologu

Převod z klauzulární logikyKlauzulární logika Množinový zápis Zápis v Prologu

Pravidlo B,C,D � A �A, B, C, D� A :- B,C,D.Fakt � A �A� A.

Dotaz B,C,D � � B, C, D� ?- B,C,D.

Tvar pravidla:

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Zápis klauzulí v Prologu

Převod z klauzulární logikyKlauzulární logika Množinový zápis Zápis v Prologu

Pravidlo B,C,D � A �A, B, C, D� A :- B,C,D.Fakt � A �A� A.

Dotaz B,C,D � � B, C, D� ?- B,C,D.

Tvar pravidla:Predikat1(param) :- Predikat2(param), Predikat3(param),...

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Zápis klauzulí v Prologu

Převod z klauzulární logikyKlauzulární logika Množinový zápis Zápis v Prologu

Pravidlo B,C,D � A �A, B, C, D� A :- B,C,D.Fakt � A �A� A.

Dotaz B,C,D � � B, C, D� ?- B,C,D.

Tvar pravidla:Predikat1(param) :- Predikat2(param), Predikat3(param),...

hlava tělo

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Zápis klauzulí v Prologu

Převod z klauzulární logikyKlauzulární logika Množinový zápis Zápis v Prologu

Pravidlo B,C,D � A �A, B, C, D� A :- B,C,D.Fakt � A �A� A.

Dotaz B,C,D � � B, C, D� ?- B,C,D.

Tvar pravidla:Predikat1(param) :- hlava

Predikat2(param), tělo

Predikat3(param), klauzule

...

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Programujeme v Prologu

Postup

1. Vytvoříme textový soubor s příponou .pl, do kterého uložímeprogram (fakty a pravidla). Každý příkaz musí být nasamostatném řádku (nebo na více řádcích), končí tečkou,komentáře jsou řádky začínající znakem %.

2. Načteme tento soubor (po uložení) do editoru Prologu(příkazem consult, případně položkou v menu (consult nebocompile) s tím, že před volbou v menu je vhodné soubors programem v editoru Prologu otevřít).

3. Na výzvu Prologu (prompt, je to dvojznak ?-, znamená„zadej dotazÿ) zadáváme dotazy, Prolog vypisuje odpovědi.

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Programujeme v Prologu

Postup

1. Vytvoříme textový soubor s příponou .pl, do kterého uložímeprogram (fakty a pravidla). Každý příkaz musí být nasamostatném řádku (nebo na více řádcích), končí tečkou,komentáře jsou řádky začínající znakem %.

2. Načteme tento soubor (po uložení) do editoru Prologu(příkazem consult, případně položkou v menu (consult nebocompile) s tím, že před volbou v menu je vhodné soubors programem v editoru Prologu otevřít).

3. Na výzvu Prologu (prompt, je to dvojznak ?-, znamená„zadej dotazÿ) zadáváme dotazy, Prolog vypisuje odpovědi.

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Programujeme v Prologu

Postup

1. Vytvoříme textový soubor s příponou .pl, do kterého uložímeprogram (fakty a pravidla). Každý příkaz musí být nasamostatném řádku (nebo na více řádcích), končí tečkou,komentáře jsou řádky začínající znakem %.

2. Načteme tento soubor (po uložení) do editoru Prologu(příkazem consult, případně položkou v menu (consult nebocompile) s tím, že před volbou v menu je vhodné soubors programem v editoru Prologu otevřít).

3. Na výzvu Prologu (prompt, je to dvojznak ?-, znamená„zadej dotazÿ) zadáváme dotazy, Prolog vypisuje odpovědi.

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Programujeme v Prologu

Konzultování programuNačtení (přeložení, konzultování) programu je nutné, protožeProlog si program udržuje v interním kódu, se kterým se mupracuje jednodušeji a především rychleji.

Při každé změně v souboru programu musíme (samozřejmě pouložení těchto změn) program znovu načíst, aby si Prolog mohltento interní kód obnovit.

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Programujeme v Prologu

Konzultování programuNačtení (přeložení, konzultování) programu je nutné, protožeProlog si program udržuje v interním kódu, se kterým se mupracuje jednodušeji a především rychleji.

Při každé změně v souboru programu musíme (samozřejmě pouložení těchto změn) program znovu načíst, aby si Prolog mohltento interní kód obnovit.

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Příklad

ZadáníV programu budou tyto klauzule:L Petr má rád květiny, Ivanu a televizi.L Jan má rád jitrnice a televizi.L Věra má ráda všechno, co má rád Jan.

V klauzulární logice�ma rad(petr, kvetiny)�ma rad(petr, ivana)�ma rad(petr, televize)�ma rad(jan, jitrnice)�ma rad(jan, televize)ma rad(jan,X)�ma rad(vera,X)

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Příklad

ZadáníV programu budou tyto klauzule:L Petr má rád květiny, Ivanu a televizi.L Jan má rád jitrnice a televizi.L Věra má ráda všechno, co má rád Jan.

V klauzulární logice�ma rad(petr, kvetiny)�ma rad(petr, ivana)�ma rad(petr, televize)�ma rad(jan, jitrnice)�ma rad(jan, televize)ma rad(jan,X)�ma rad(vera,X)

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Příklad

V klauzulární logice�ma rad(petr, kvetiny)�ma rad(petr, ivana)�ma rad(petr, televize)�ma rad(jan, jitrnice)�ma rad(jan, televize)ma rad(jan,X)�ma rad(vera,X)V Prologuma_rad(petr,kvetiny).

ma_rad(petr,ivana).

ma_rad(petr,televize).

ma_rad(jan,jitrnice).

ma_rad(jan,televize).

ma_rad(vera,X):-ma_rad(jan,X).

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Příklad

V klauzulární logice�ma rad(petr, kvetiny)�ma rad(petr, ivana)�ma rad(petr, televize)�ma rad(jan, jitrnice)�ma rad(jan, televize)ma rad(jan,X)�ma rad(vera,X)V Prologuma_rad(petr,kvetiny).

ma_rad(petr,ivana).

ma_rad(petr,televize).

ma_rad(jan,jitrnice).

ma_rad(jan,televize).

ma_rad(vera,X):-ma_rad(jan,X).

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Anonymní proměnná

Anonymní proměnná

PoužitíAnonymní proměnná nahrazuje existenční termy:L zapisuje se znakem podtržítka nebo tímto podtržítkem začíná:_, _Prom

L pro argument, ve kterém je použita, existuje hodnota, kteroutam lze dosadit, ale tato hodnota nás nezajímá,

L také použijeme místo „běžnéÿ proměnné, pokud se tatoproměnná vyskytuje v těle pravidla pouze jednou.

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Anonymní proměnná

Programlovi(liska,zajic). Liška loví zajíce.lovi(orel,mys). Orel loví myš.lovi(orel,vrabec). Orel loví vrabce.lovi(honza,ryba). Honza loví rybu.dravec(X) :- lovi(X,_). Kdo někoho loví, je dravec.

Dotazy?- dravec(_).

yes

?- lovi(liska,_).

yes

?- lovi(X,_).

X = liska ;

X = orel ;

X = honza ;

no

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Anonymní proměnná

Programlovi(liska,zajic). Liška loví zajíce.lovi(orel,mys). Orel loví myš.lovi(orel,vrabec). Orel loví vrabce.lovi(honza,ryba). Honza loví rybu.dravec(X) :- lovi(X,_). Kdo někoho loví, je dravec.

Dotazy?- dravec(_).

yes

?- lovi(liska,_).

yes

?- lovi(X,_).

X = liska ;

X = orel ;

X = honza ;

no

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Anonymní proměnná

Programlovi(liska,zajic). Liška loví zajíce.lovi(orel,mys). Orel loví myš.lovi(orel,vrabec). Orel loví vrabce.lovi(honza,ryba). Honza loví rybu.dravec(X) :- lovi(X,_). Kdo někoho loví, je dravec.

Dotazy?- dravec(_).

yes

?- lovi(liska,_).

yes

?- lovi(X,_).

X = liska ;

X = orel ;

X = honza ;

no

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Anonymní proměnná

Programlovi(liska,zajic). Liška loví zajíce.lovi(orel,mys). Orel loví myš.lovi(orel,vrabec). Orel loví vrabce.lovi(honza,ryba). Honza loví rybu.dravec(X) :- lovi(X,_). Kdo někoho loví, je dravec.

Dotazy?- dravec(_).

yes

?- lovi(liska,_).

yes

?- lovi(X,_).

X = liska ;

X = orel ;

X = honza ;

no

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Anonymní proměnná

Programlovi(liska,zajic). Liška loví zajíce.lovi(orel,mys). Orel loví myš.lovi(orel,vrabec). Orel loví vrabce.lovi(honza,ryba). Honza loví rybu.dravec(X) :- lovi(X,_). Kdo někoho loví, je dravec.

Dotazy?- dravec(_).

yes

?- lovi(liska,_).

yes

?- lovi(X,_).

X = liska ;

X = orel ;

X = honza ;

no

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Anonymní proměnná

Programlovi(liska,zajic). Liška loví zajíce.lovi(orel,mys). Orel loví myš.lovi(orel,vrabec). Orel loví vrabce.lovi(honza,ryba). Honza loví rybu.dravec(X) :- lovi(X,_). Kdo někoho loví, je dravec.

Dotazy?- dravec(_).

yes

?- lovi(liska,_).

yes

?- lovi(X,_).

X = liska ;

X = orel ;

X = honza ;

no

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Anonymní proměnná

Programlovi(liska,zajic). Liška loví zajíce.lovi(orel,mys). Orel loví myš.lovi(orel,vrabec). Orel loví vrabce.lovi(honza,ryba). Honza loví rybu.dravec(X) :- lovi(X,_). Kdo někoho loví, je dravec.

Dotazy?- dravec(_).

yes

?- lovi(liska,_).

yes

?- lovi(X,_).

X = liska ;

X = orel ;

X = honza ;

no

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Aritmetické a relační operátory, predikát rovnosti

Predikát rovnosti

Použití

L aritmetické operátory jsou vlastně termy (vrací hodnotuobvykle odlišnou od pravdivostní), mohou být použity jen jakoargument predikátu,

L relační operátory jsou predikáty,L predikát rovnosti existuje, ale pro jeho použití existují přísnápravidla, jeho argumenty po interpretaci musí být identické,

L v logických programovacích jazycích je obvykle možnéoperátory používat v infixovém zápisu:

Prefixový zápis: +(p,q) =(X,a) =(X,+(a,Y))

Infixový zápis: p + q X = a X = a + Y

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Aritmetické a relační operátory, predikát rovnosti

Program – predikát rovnostimatka(pepa)=jana.otec(pepa)=honza.

matka(jana)=jitka.otec(jana)=albert.

matka(honza)=emilka.otec(honza)=karel.

matka(albert)=katerina.

babicka(Vnouce,Babicka) :-X=matka(Vnouce),Babicka=matka(X).

babicka(Vnouce,Babicka) :-X=otec(Vnouce),Babicka=matka(X).

dedecek(Vnouce,Dedecek) :-X=matka(Vnouce),Dedecek=otec(X).

dedecek(Vnouce,Dedecek) :- X=otec(Vnouce),Dedecek=otec(X).

prababicka(Vnouce,Prababicka) :-X=matka(Vnouce),babicka(X,Prababicka).

prababicka(Vnouce,Prababicka) :-X=otec(Vnouce),babicka(X,Prababicka).

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Aritmetické a relační operátory, predikát rovnosti

Část programu – interpretace funkcímatka(pepa)=jana.otec(pepa)=honza.

matka(jana)=jitka.otec(jana)=albert.

matka(honza)=emilka.otec(honza)=karel.

matka(albert)=katerina.

Dotazy?- dedecek(pepa,X).

X = albert ;

X = karel ;

no

?- prababicka(pepa,X).

X = katerina ;

no

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Aritmetické a relační operátory, predikát rovnosti

Část programu – interpretace funkcímatka(pepa)=jana.otec(pepa)=honza.

matka(jana)=jitka.otec(jana)=albert.

matka(honza)=emilka.otec(honza)=karel.

matka(albert)=katerina.

Dotazy?- dedecek(pepa,X).

X = albert ;

X = karel ;

no

?- prababicka(pepa,X).

X = katerina ;

no

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Aritmetické a relační operátory, predikát rovnosti

Jak moc je predikát „=ÿ použitelný?

L Zápisy typu

matka(pepa)=jana.

ve většině Prologů nefungují, protože to je považováno zapokus o předefinování vestavěného predikátu.

L Možnost použití: v těle klauzule pro unifikaci proměnné:

hlava_klauzule :- ..., X=jana, ...

L funktory raději nepoužíváme.

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Aritmetické a relační operátory, predikát rovnosti

Jak moc je predikát „=ÿ použitelný?

L Zápisy typu

matka(pepa)=jana.

ve většině Prologů nefungují, protože to je považováno zapokus o předefinování vestavěného predikátu.

L Možnost použití: v těle klauzule pro unifikaci proměnné:

hlava_klauzule :- ..., X=jana, ...

L funktory raději nepoužíváme.

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Aritmetické a relační operátory, predikát rovnosti

Jak moc je predikát „=ÿ použitelný?

L Zápisy typu

matka(pepa)=jana.

ve většině Prologů nefungují, protože to je považováno zapokus o předefinování vestavěného predikátu.

L Možnost použití: v těle klauzule pro unifikaci proměnné:

hlava_klauzule :- ..., X=jana, ...

L funktory raději nepoužíváme.

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Aritmetické a relační operátory, predikát rovnosti

Operátory – souhrn

Relační operátory, konjunkce; disjunkce= porovnání s unifikací, identita\= opak předchozího, „nerovná seÿis vyčíslení (provede se vyhodnocení argumentů)<, >, =<, >= porovnání==, \== porovnání bez přiřazení=:=, =\= porovnání bez přiřazení s vyhodnocenímnot negace

Aritmetické operátory+, -, *, /, mod, div

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Aritmetické a relační operátory, predikát rovnosti

Přiřazování, porovnávání

?- X = 1+1.

X = 1+1

?- X is 1+1.

X = 2

?- X == 1.

no

?- 1 == 1.

yes

?- 2 == 1+1.

no

?- 2 =:= 1+1.

yes

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Testování atomů

Vestavěné predikáty na testování typu údajů

L atom(argument)

vrátí true, jestliže je argument řetězcová konstanta

L atomic(argument)

vrátí true, jestliže je argument konstanta (řetězcová, číselná)

L integer(argument)

vrátí true, jestliže je argument celé číslo

L float(argument)

vrátí true, jestliže je argument reálné číslo

L number(argument)

vrátí true, jestliže je argument číslo

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Testování atomů

Vestavěné predikáty na testování typu údajů

?- atom(neco).

yes

?- atom(2).

no

?- atomic(2).

yes

?- atomic(neco).

yes

?- atom(X).

no

?- integer(2).

yes

?- float(2.1).

yes

?- float(2).

no

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Testování atomů

Vestavěné predikáty na testování typu údajů

?- atom(neco).

yes

?- atom(2).

no

?- atomic(2).

yes

?- atomic(neco).

yes

?- atom(X).

no

?- integer(2).

yes

?- float(2.1).

yes

?- float(2).

no

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Testování atomů

Vestavěné predikáty na testování typu údajů

?- atom(neco).

yes

?- atom(2).

no

?- atomic(2).

yes

?- atomic(neco).

yes

?- atom(X).

no

?- integer(2).

yes

?- float(2.1).

yes

?- float(2).

no

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Testování atomů

Vestavěné predikáty na testování typu údajů

?- atom(neco).

yes

?- atom(2).

no

?- atomic(2).

yes

?- atomic(neco).

yes

?- atom(X).

no

?- integer(2).

yes

?- float(2.1).

yes

?- float(2).

no

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Testování atomů

Vestavěné predikáty na testování typu údajů

?- atom(neco).

yes

?- atom(2).

no

?- atomic(2).

yes

?- atomic(neco).

yes

?- atom(X).

no

?- integer(2).

yes

?- float(2.1).

yes

?- float(2).

no

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Testování atomů

Vestavěné predikáty na testování typu údajů

?- atom(neco).

yes

?- atom(2).

no

?- atomic(2).

yes

?- atomic(neco).

yes

?- atom(X).

no

?- integer(2).

yes

?- float(2.1).

yes

?- float(2).

no

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Testování atomů

Vestavěné predikáty na testování typu údajů

?- atom(neco).

yes

?- atom(2).

no

?- atomic(2).

yes

?- atomic(neco).

yes

?- atom(X).

no

?- integer(2).

yes

?- float(2.1).

yes

?- float(2).

no

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Testování atomů

Vestavěné predikáty na testování typu údajů

?- atom(neco).

yes

?- atom(2).

no

?- atomic(2).

yes

?- atomic(neco).

yes

?- atom(X).

no

?- integer(2).

yes

?- float(2.1).

yes

?- float(2).

no

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Negace

Negace atomu

Jak znegovat atomNejdřív můžeme vyzkoušet postup známý z klauzulární logiky –transfer atomu na druhou stranu implikace (včetně řešeníkvantifikátorů):L pokud vyjde Hornova klauzule (za implikací jen jediný atom),je to dostačující,

L v opačném případě transfer nelze použít, využijeme speciálnípredikát not.

Predikát not je jeden z mála predikátů, které mají jako argumentjiný predikát:

not(p(arg1,arg2,...,argn))

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Negace

Negace atomu

Jak znegovat atomNejdřív můžeme vyzkoušet postup známý z klauzulární logiky –transfer atomu na druhou stranu implikace (včetně řešeníkvantifikátorů):L pokud vyjde Hornova klauzule (za implikací jen jediný atom),je to dostačující,

L v opačném případě transfer nelze použít, využijeme speciálnípredikát not.

Predikát not je jeden z mála predikátů, které mají jako argumentjiný predikát:

not(p(arg1,arg2,...,argn))

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Negace

Negace atomu

Jak znegovat atomNejdřív můžeme vyzkoušet postup známý z klauzulární logiky –transfer atomu na druhou stranu implikace (včetně řešeníkvantifikátorů):L pokud vyjde Hornova klauzule (za implikací jen jediný atom),je to dostačující,

L v opačném případě transfer nelze použít, využijeme speciálnípredikát not.

Predikát not je jeden z mála predikátů, které mají jako argumentjiný predikát:

not(p(arg1,arg2,...,argn))

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Negace

Negace atomu

Jak funguje not(p(arg1,arg2,...,argn))

L nejdřív je vyhodnocen atom p(arg1,arg2,...,argn) , pakje jeho pravdivostní hodnota převrácena,

L vrací informaci typu „Jestliže p(...) je odvoditelný z báze

(programu), pak not(p(...)) není odvoditelný z báze.ÿ.

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Negace

Negace atomu

Jak funguje not(p(arg1,arg2,...,argn))

L nejdřív je vyhodnocen atom p(arg1,arg2,...,argn) , pakje jeho pravdivostní hodnota převrácena,

L vrací informaci typu „Jestliže p(...) je odvoditelný z báze

(programu), pak not(p(...)) není odvoditelný z báze.ÿ.

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Negace

Negace atomu

Jak funguje not(p(arg1,arg2,...,argn))Problém: proměnné vázané univerzálně (∀) se stávají volnými,neumí řešit existenční vazbu (nahrazení _), při vyhodnoceníp(...) ještě funguje vazba na tytéž proměnné v předchozíchatomech klauzule, ale za ním se ztrácí.Řešení:L atom s predikátem not dáváme v klauzuli až za všechnyatomy, které obsahují tytéž proměnné (třeba až na konecklauzule, např. r(a,b) :- p(X),not(q(X)),p(Y).),

L klauzule obsahující negaci dáváme spíše za všechny klauzuleobsahující proměnnou, která je zde negována a se kterými jezároveň unifikována během výpočtu.

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Negace

Negace atomu

Jak funguje not(p(arg1,arg2,...,argn))Problém: proměnné vázané univerzálně (∀) se stávají volnými,neumí řešit existenční vazbu (nahrazení _), při vyhodnoceníp(...) ještě funguje vazba na tytéž proměnné v předchozíchatomech klauzule, ale za ním se ztrácí.Řešení:L atom s predikátem not dáváme v klauzuli až za všechnyatomy, které obsahují tytéž proměnné (třeba až na konecklauzule, např. r(a,b) :- p(X),not(q(X)),p(Y).),

L klauzule obsahující negaci dáváme spíše za všechny klauzuleobsahující proměnnou, která je zde negována a se kterými jezároveň unifikována během výpočtu.

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Negace

Negace atomu

Jak funguje not(p(arg1,arg2,...,argn))Problém: proměnné vázané univerzálně (∀) se stávají volnými,neumí řešit existenční vazbu (nahrazení _), při vyhodnoceníp(...) ještě funguje vazba na tytéž proměnné v předchozíchatomech klauzule, ale za ním se ztrácí.Řešení:L atom s predikátem not dáváme v klauzuli až za všechnyatomy, které obsahují tytéž proměnné (třeba až na konecklauzule, např. r(a,b) :- p(X),not(q(X)),p(Y).),

L klauzule obsahující negaci dáváme spíše za všechny klauzuleobsahující proměnnou, která je zde negována a se kterými jezároveň unifikována během výpočtu.

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Negace

Programosobni(autoPepy).

osobni(autoJany).

nakladni(autoStandy).

ma_vozik(autoJany).

auto(X) :- osobni(X).

auto(X) :- nakladni(X).

velky_naklad(X) :- nakladni(X).

velky_naklad(X) :- osobni(X),ma_vozik(X).

maly_naklad(X) :- auto(X),not(velky_naklad(X)).

Dotazy

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Negace

Programosobni(autoPepy).

osobni(autoJany).

nakladni(autoStandy).

ma_vozik(autoJany).

auto(X) :- osobni(X).

auto(X) :- nakladni(X).

velky_naklad(X) :- nakladni(X).

velky_naklad(X) :- osobni(X),ma_vozik(X).

maly_naklad(X) :- auto(X),not(velky_naklad(X)).

Dotazy?- nakladni(X).

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Negace

Programosobni(autoPepy).

osobni(autoJany).

nakladni(autoStandy).

ma_vozik(autoJany).

auto(X) :- osobni(X).

auto(X) :- nakladni(X).

velky_naklad(X) :- nakladni(X).

velky_naklad(X) :- osobni(X),ma_vozik(X).

maly_naklad(X) :- auto(X),not(velky_naklad(X)).

Dotazy?- nakladni(X).

X = autoStandy ;

no

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Negace

Programosobni(autoPepy).

osobni(autoJany).

nakladni(autoStandy).

ma_vozik(autoJany).

auto(X) :- osobni(X).

auto(X) :- nakladni(X).

velky_naklad(X) :- nakladni(X).

velky_naklad(X) :- osobni(X),ma_vozik(X).

maly_naklad(X) :- auto(X),not(velky_naklad(X)).

Dotazy?- osobni(X),not(X=autoJany).

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Negace

Programosobni(autoPepy).

osobni(autoJany).

nakladni(autoStandy).

ma_vozik(autoJany).

auto(X) :- osobni(X).

auto(X) :- nakladni(X).

velky_naklad(X) :- nakladni(X).

velky_naklad(X) :- osobni(X),ma_vozik(X).

maly_naklad(X) :- auto(X),not(velky_naklad(X)).

Dotazy?- osobni(X),not(X=autoJany).

X = autoPepy ;

no

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Interní databáze

Konzultování programu

L Na začátku práce s programem tento program načteme dointerní databáze Prologu, konzultujeme.

L Kdykoliv provedeme změny, musíme znovu načíst program dodatabáze – rekonzultovat.

Konzultování se provádí buď položkou v menu programovéhoprostředí Prologu (volba Consult, Reconsult, příp. Compile),a nebo příkazy (včetně tečky):

consult(‘Název souboru s programem’).

reconsult(‘Název souboru s programem’).

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Interní databáze

Konzultování programu

L Na začátku práce s programem tento program načteme dointerní databáze Prologu, konzultujeme.

L Kdykoliv provedeme změny, musíme znovu načíst program dodatabáze – rekonzultovat.

Konzultování se provádí buď položkou v menu programovéhoprostředí Prologu (volba Consult, Reconsult, příp. Compile),a nebo příkazy (včetně tečky):

consult(‘Název souboru s programem’).

reconsult(‘Název souboru s programem’).

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Interní databáze

Obsah databázeKdyž chceme vypsat momentální obsah databáze, použijeme příkaz

listing.

Když chceme vypsat pouze ty klauzule, které obsahují určitýpredikát (třeba p), použijeme příkaz

listing(p).

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Interní databáze

Obsah databázeKdyž chceme vypsat momentální obsah databáze, použijeme příkaz

listing.

Když chceme vypsat pouze ty klauzule, které obsahují určitýpredikát (třeba p), použijeme příkaz

listing(p).

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Predikáty se stejným jménem

V různých klauzulích

L Více klauzulí může mít stejný cíl,L představují různá řešení téhož problému, z nichž některá končípopřením, jiná splněním cíle.

V téže klauzuli

L Rekurze je základní výpočetní prvek Prologu,L nastává tehdy, když v těle klauzule je stejný predikát jakov těle klauzule,

L v těle klauzule tento predikát umísťujeme spíše na konec,pokud není důvod pro jiné umístění.

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Predikáty se stejným jménem

V různých klauzulích

L Více klauzulí může mít stejný cíl,L představují různá řešení téhož problému, z nichž některá končípopřením, jiná splněním cíle.

V téže klauzuli

L Rekurze je základní výpočetní prvek Prologu,L nastává tehdy, když v těle klauzule je stejný predikát jakov těle klauzule,

L v těle klauzule tento predikát umísťujeme spíše na konec,pokud není důvod pro jiné umístění.

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Predikáty se stejným jménem

V různých klauzulích

L Více klauzulí může mít stejný cíl,L představují různá řešení téhož problému, z nichž některá končípopřením, jiná splněním cíle.

V téže klauzuli

L Rekurze je základní výpočetní prvek Prologu,L nastává tehdy, když v těle klauzule je stejný predikát jakov těle klauzule,

L v těle klauzule tento predikát umísťujeme spíše na konec,pokud není důvod pro jiné umístění.

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Příklad – výpočet faktoriálu

Predikáty

L faktorial(cislo,Vysl) – tento predikát bude volánuživatelem v dotazu,

L faktorialpom(citac,Vysl,Vysl) – bude použit prosamotný rekurzivní výpočet.

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Příklad – výpočet faktoriálu

Predikáty

L faktorial(cislo,Vysl) – tento predikát bude volánuživatelem v dotazu,

L faktorialpom(citac,Vysl,Vysl) – bude použit prosamotný rekurzivní výpočet.

faktorialpom( Citac, Vysl, Vysl )

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Příklad – výpočet faktoriálu

Predikáty

L faktorial(cislo,Vysl) – tento predikát bude volánuživatelem v dotazu,

L faktorialpom(citac,Vysl,Vysl) – bude použit prosamotný rekurzivní výpočet.

faktorialpom( Citac, Vysl, Vysl )

Čítač, snižujese o 1

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Příklad – výpočet faktoriálu

Predikáty

L faktorial(cislo,Vysl) – tento predikát bude volánuživatelem v dotazu,

L faktorialpom(citac,Vysl,Vysl) – bude použit prosamotný rekurzivní výpočet.

faktorialpom( Citac, Vysl, Vysl )

Čítač, snižujese o 1

Počítá výsledek,na začátku 1

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Příklad – výpočet faktoriálu

Predikáty

L faktorial(cislo,Vysl) – tento predikát bude volánuživatelem v dotazu,

L faktorialpom(citac,Vysl,Vysl) – bude použit prosamotný rekurzivní výpočet.

faktorialpom( Citac, Vysl, Vysl )

Čítač, snižujese o 1

Zde bude výsledekpřístupný, nazačátku proměnná

Počítá výsledek,na začátku 1

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Příklad – výpočet faktoriálu

Program v Pascaluprocedure faktorial(Citac,Vysl: integer);

var C: integer;

begin

if (Citac=0) then Vysl := 1

else begin

C := Citac-1;

Vysl := Citac * faktorial(C,Vysl);

end;

end;

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Příklad – výpočet faktoriálu

Program v Prologufaktorialpom(0, Vysl, Vysl).

faktorialpom(Citac,Pomocna,Vysl) :-

C is Citac - 1,

V is Pomocna * Citac,

faktorialpom(C,V,Vysl).

faktorial(Citac,Vysl) :- faktorialpom(Citac,1,Vysl).

Dotaz?- faktorial(4,F).

F = 24.

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Příklad – výpočet faktoriálu

Program v Prologufaktorialpom(0, Vysl, Vysl).

faktorialpom(Citac,Pomocna,Vysl) :-C is Citac - 1,V is Pomocna * Citac,faktorialpom(C,V,Vysl).

faktorial(Citac,Vysl) :- faktorialpom(Citac,1,Vysl).

Dotaz – faktorial(3,F).faktorialpom(3,1,Vysl). C = 3-1 = 2, V = 1*3 = 3faktorialpom(2,3,Vysl). C = 2-1 = 1, V = 2*3 = 6faktorialpom(1,6,Vysl). C = 1-1 = 0, V = 6*1 = 6faktorialpom(0,6,Vysl). F = Vysl.

Pár slov o Prologu Klauzule a Prolog Programujeme Syntaxe jazyka Prolog Interní databáze Rekurze Další zdroje

Zajímavé odkazy

Test Zone – on-line editor Prologu

http://kti.mff.cuni.cz/~bartak/prolog/testing.html

Expertní systémy v Prologu

http://www.amzi.com/ExpertSystemsInProlog/