Programovací jazyk PrologLogické programování
Šárka Vavrečková
Ústav informatiky, Filozoficko-přírodovědecká fakulta Slezské univerzity v Opavě
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/
Top Related