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
Pár slov o Prologu
Klauzule a Prolog
Programujeme
Syntaxe jazyka Prolog
Interní databáze
Rekurze
Prolog Co je to Prolog Prolog je jazyk pro logické programování, vznikl ve Francii v roce 1973 (prof. A. Colmerauer). Je to zkratka z francouzského PROgramation à LOGic („programování v logiceÿ). Je to interpretační deklarativní jazyk.
Další zdroje
Pár slov o Prologu
Klauzule a Prolog
Programujeme
Syntaxe jazyka Prolog
Interní databáze
Rekurze
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 Windows považ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, Temporal Prolog, Mercury, atd.
Viz www.fpf.slu.cz/~vav10ui/vyukaprol.html.
Další zdroje
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é pod GPL (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íl v 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 často způ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ě pro Prolog,
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ÿ, ve kterém se budeme pohybovat. 2. Zadáváme dotazy (cílové klauzule), Prolog odpovídá yes nebo 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 podle L L
našeho programu, 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ÿ, ve kterém se budeme pohybovat. 2. Zadáváme dotazy (cílové klauzule), Prolog odpovídá yes nebo 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 podle L L
našeho programu, 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ÿ, ve kterém se budeme pohybovat. 2. Zadáváme dotazy (cílové klauzule), Prolog odpovídá yes nebo 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 podle L L
našeho programu, 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ÿ, ve kterém se budeme pohybovat. 2. Zadáváme dotazy (cílové klauzule), Prolog odpovídá yes nebo 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 podle L L
našeho programu, 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ÿ, ve kterém se budeme pohybovat. 2. Zadáváme dotazy (cílové klauzule), Prolog odpovídá yes nebo 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 podle L L
našeho programu, 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 Definice Program v Prologu je konečná neprázdná množina Hornových klauzulí. Je to ekvivalent znalostní báze klauzulární logiky a množiny speciálních axiomů Klauzulárního axiomatického systé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í logiky Pravidlo Fakt Dotaz
Klauzulární logika B, C, D A A B, C, D
Tvar pravidla:
Množinový zápis A, B, C, D A B, C, D
Zápis v Prologu A :- B, C, D. A. ?- B, C, D.
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í logiky Pravidlo Fakt Dotaz
Klauzulární logika B, C, D A A B, C, D
Množinový zápis A, B, C, D A B, C, D
Zápis v Prologu A :- B, C, D. A. ?- 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í logiky Pravidlo Fakt Dotaz
Klauzulární logika B, C, D A A B, C, D
Množinový zápis A, B, C, D A B, C, D
Zápis v Prologu A :- B, C, D. A. ?- B, C, D.
Tvar pravidla: Predikat1(param) hlava
:-
Predikat2(param), Predikat3(param),... 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í logiky Pravidlo Fakt Dotaz
Klauzulární logika B, C, D A A B, C, D
Množinový zápis A, B, C, D A B, C, D
Tvar pravidla: Predikat1(param) :Predikat2(param), Predikat3(param), ...
hlava tělo klauzule
Zápis v Prologu A :- B, C, D. A. ?- B, C, D.
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žíme program (fakty a pravidla). Každý příkaz musí být na samostatné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 nebo compile) s tím, že před volbou v menu je vhodné soubor s 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žíme program (fakty a pravidla). Každý příkaz musí být na samostatné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 nebo compile) s tím, že před volbou v menu je vhodné soubor s 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žíme program (fakty a pravidla). Každý příkaz musí být na samostatné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 nebo compile) s tím, že před volbou v menu je vhodné soubor s 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í programu Načtení (přeložení, konzultování) programu je nutné, protože Prolog si program udržuje v interním kódu, se kterým se mu pracuje jednodušeji a především rychleji. Při každé změně v souboru programu musíme (samozřejmě po uložení těchto změn) program znovu načíst, aby si Prolog mohl tento 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í programu Načtení (přeložení, konzultování) programu je nutné, protože Prolog si program udržuje v interním kódu, se kterým se mu pracuje jednodušeji a především rychleji. Při každé změně v souboru programu musíme (samozřejmě po uložení těchto změn) program znovu načíst, aby si Prolog mohl tento interní kód obnovit.
Pár slov o Prologu
Klauzule a Prolog
Programujeme
Syntaxe jazyka Prolog
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)
Interní databáze
Rekurze
Další zdroje
Pár slov o Prologu
Klauzule a Prolog
Programujeme
Syntaxe jazyka Prolog
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)
Interní databáze
Rekurze
Další zdroje
Pár slov o Prologu
Klauzule a Prolog
Programujeme
Syntaxe jazyka Prolog
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 Prologu ma_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).
Interní databáze
Rekurze
Další zdroje
Pár slov o Prologu
Klauzule a Prolog
Programujeme
Syntaxe jazyka Prolog
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 Prologu ma_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).
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
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, kterou tam lze dosadit, ale tato hodnota nás nezajímá,
L
také použijeme místo „běžnéÿ proměnné, pokud se tato promě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á
Program lovi(liska,zajic). lovi(orel,mys). lovi(orel,vrabec). lovi(honza,ryba). dravec(X) :- lovi(X,_).
Liška loví zajíce. Orel loví myš. Orel loví vrabce. Honza loví rybu. 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á
Program lovi(liska,zajic). lovi(orel,mys). lovi(orel,vrabec). lovi(honza,ryba). dravec(X) :- lovi(X,_).
Liška loví zajíce. Orel loví myš. Orel loví vrabce. Honza loví rybu. 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á
Program lovi(liska,zajic). lovi(orel,mys). lovi(orel,vrabec). lovi(honza,ryba). dravec(X) :- lovi(X,_).
Liška loví zajíce. Orel loví myš. Orel loví vrabce. Honza loví rybu. 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á
Program lovi(liska,zajic). lovi(orel,mys). lovi(orel,vrabec). lovi(honza,ryba). dravec(X) :- lovi(X,_).
Liška loví zajíce. Orel loví myš. Orel loví vrabce. Honza loví rybu. 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á
Program lovi(liska,zajic). lovi(orel,mys). lovi(orel,vrabec). lovi(honza,ryba). dravec(X) :- lovi(X,_).
Liška loví zajíce. Orel loví myš. Orel loví vrabce. Honza loví rybu. 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á
Program lovi(liska,zajic). lovi(orel,mys). lovi(orel,vrabec). lovi(honza,ryba). dravec(X) :- lovi(X,_).
Liška loví zajíce. Orel loví myš. Orel loví vrabce. Honza loví rybu. 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á
Program lovi(liska,zajic). lovi(orel,mys). lovi(orel,vrabec). lovi(honza,ryba). dravec(X) :- lovi(X,_).
Liška loví zajíce. Orel loví myš. Orel loví vrabce. Honza loví rybu. 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í hodnotu obvykle odlišnou od pravdivostní), mohou být použity jen jako argument 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: Infixový zápis:
+(p,q) p + q
=(X,a) X = a
=(X,+(a,Y)) 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 rovnosti matka(pepa)=jana. matka(jana)=jitka. otec(pepa)=honza. otec(jana)=albert. matka(honza)=emilka. matka(albert)=katerina. otec(honza)=karel. 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
Aritmetické a relační operátory, predikát rovnosti
Část programu – interpretace funkcí matka(pepa)=jana. otec(pepa)=honza. matka(honza)=emilka. otec(honza)=karel.
Dotazy ?- dedecek(pepa,X). X = albert ; X = karel ; no ?- prababicka(pepa,X). X = katerina ; no
matka(jana)=jitka. otec(jana)=albert. matka(albert)=katerina.
Rekurze
Další zdroje
Pár slov o Prologu
Klauzule a Prolog
Programujeme
Syntaxe jazyka Prolog
Interní databáze
Aritmetické a relační operátory, predikát rovnosti
Část programu – interpretace funkcí matka(pepa)=jana. otec(pepa)=honza. matka(honza)=emilka. otec(honza)=karel.
Dotazy ?- dedecek(pepa,X). X = albert ; X = karel ; no ?- prababicka(pepa,X). X = katerina ; no
matka(jana)=jitka. otec(jana)=albert. matka(albert)=katerina.
Rekurze
Další zdroje
Pár slov o Prologu
Klauzule a Prolog
Programujeme
Syntaxe jazyka Prolog
Interní databáze
Rekurze
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 za pokus 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.
Další zdroje
Pár slov o Prologu
Klauzule a Prolog
Programujeme
Syntaxe jazyka Prolog
Interní databáze
Rekurze
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 za pokus 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.
Další zdroje
Pár slov o Prologu
Klauzule a Prolog
Programujeme
Syntaxe jazyka Prolog
Interní databáze
Rekurze
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 za pokus 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.
Další zdroje
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 , ; = \= is <, >, =<, >= ==, \== =:=, =\= not
konjunkce disjunkce porovnání s unifikací, identita opak předchozího, „nerovná seÿ vyčíslení (provede se vyhodnocení argumentů) porovnání porovnání bez přiřazení porovnání bez přiřazení s vyhodnocením negace
Aritmetické operátory +, -, *, /, mod, div
Pár slov o Prologu
Klauzule a Prolog
Programujeme
Syntaxe jazyka Prolog
Aritmetické a relační operátory, predikát rovnosti
Přiřazování, porovnávání ?- X = 1+1. X = 1+1
?- X == 1. no
?- X is 1+1. X = 2
?- 1 == 1. yes
?- 2 == 1+1. no ?- 2 =:= 1+1. yes
Interní databáze
Rekurze
Další zdroje
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
Testování atomů
Vestavěné predikáty na testování typu údajů ?- atom(neco). yes
?- atom(X). no
?- atom(2). no
?- integer(2). yes
?- atomic(2). yes
?- float(2.1). yes
?- atomic(neco). yes
?- float(2). no
Rekurze
Další zdroje
Pár slov o Prologu
Klauzule a Prolog
Programujeme
Syntaxe jazyka Prolog
Interní databáze
Testování atomů
Vestavěné predikáty na testování typu údajů ?- atom(neco). yes
?- atom(X). no
?- atom(2). no
?- integer(2). yes
?- atomic(2). yes
?- float(2.1). yes
?- atomic(neco). yes
?- float(2). no
Rekurze
Další zdroje
Pár slov o Prologu
Klauzule a Prolog
Programujeme
Syntaxe jazyka Prolog
Interní databáze
Testování atomů
Vestavěné predikáty na testování typu údajů ?- atom(neco). yes
?- atom(X). no
?- atom(2). no
?- integer(2). yes
?- atomic(2). yes
?- float(2.1). yes
?- atomic(neco). yes
?- float(2). no
Rekurze
Další zdroje
Pár slov o Prologu
Klauzule a Prolog
Programujeme
Syntaxe jazyka Prolog
Interní databáze
Testování atomů
Vestavěné predikáty na testování typu údajů ?- atom(neco). yes
?- atom(X). no
?- atom(2). no
?- integer(2). yes
?- atomic(2). yes
?- float(2.1). yes
?- atomic(neco). yes
?- float(2). no
Rekurze
Další zdroje
Pár slov o Prologu
Klauzule a Prolog
Programujeme
Syntaxe jazyka Prolog
Interní databáze
Testování atomů
Vestavěné predikáty na testování typu údajů ?- atom(neco). yes
?- atom(X). no
?- atom(2). no
?- integer(2). yes
?- atomic(2). yes
?- float(2.1). yes
?- atomic(neco). yes
?- float(2). no
Rekurze
Další zdroje
Pár slov o Prologu
Klauzule a Prolog
Programujeme
Syntaxe jazyka Prolog
Interní databáze
Testování atomů
Vestavěné predikáty na testování typu údajů ?- atom(neco). yes
?- atom(X). no
?- atom(2). no
?- integer(2). yes
?- atomic(2). yes
?- float(2.1). yes
?- atomic(neco). yes
?- float(2). no
Rekurze
Další zdroje
Pár slov o Prologu
Klauzule a Prolog
Programujeme
Syntaxe jazyka Prolog
Interní databáze
Testování atomů
Vestavěné predikáty na testování typu údajů ?- atom(neco). yes
?- atom(X). no
?- atom(2). no
?- integer(2). yes
?- atomic(2). yes
?- float(2.1). yes
?- atomic(neco). yes
?- float(2). no
Rekurze
Další zdroje
Pár slov o Prologu
Klauzule a Prolog
Programujeme
Syntaxe jazyka Prolog
Interní databáze
Testování atomů
Vestavěné predikáty na testování typu údajů ?- atom(neco). yes
?- atom(X). no
?- atom(2). no
?- integer(2). yes
?- atomic(2). yes
?- float(2.1). yes
?- atomic(neco). yes
?- float(2). no
Rekurze
Další zdroje
Pár slov o Prologu
Klauzule a Prolog
Programujeme
Syntaxe jazyka Prolog
Interní databáze
Rekurze
Další zdroje
Negace
Negace atomu Jak znegovat atom Nejdří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 argument jiný 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 atom Nejdří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 argument jiný 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 atom Nejdří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 argument jiný 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 ) , pak je 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 ) , pak je 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ích atomech klauzule, ale za ním se ztrácí. Řešení: L
atom s predikátem not dáváme v klauzuli až za všechny atomy, které obsahují tytéž proměnné (třeba až na konec klauzule, např. r(a,b) :- p(X),not(q(X)),p(Y).),
L
klauzule obsahující negaci dáváme spíše za všechny klauzule obsahující proměnnou, která je zde negována a se kterými je zá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ích atomech klauzule, ale za ním se ztrácí. Řešení: L
atom s predikátem not dáváme v klauzuli až za všechny atomy, které obsahují tytéž proměnné (třeba až na konec klauzule, např. r(a,b) :- p(X),not(q(X)),p(Y).),
L
klauzule obsahující negaci dáváme spíše za všechny klauzule obsahující proměnnou, která je zde negována a se kterými je zá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ích atomech klauzule, ale za ním se ztrácí. Řešení: L
atom s predikátem not dáváme v klauzuli až za všechny atomy, které obsahují tytéž proměnné (třeba až na konec klauzule, např. r(a,b) :- p(X),not(q(X)),p(Y).),
L
klauzule obsahující negaci dáváme spíše za všechny klauzule obsahující proměnnou, která je zde negována a se kterými je zároveň unifikována během výpočtu.
Pár slov o Prologu
Klauzule a Prolog
Programujeme
Syntaxe jazyka Prolog
Interní databáze
Rekurze
Negace
Program osobni(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
Další zdroje
Pár slov o Prologu
Klauzule a Prolog
Programujeme
Syntaxe jazyka Prolog
Interní databáze
Rekurze
Negace
Program osobni(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).
Další zdroje
Pár slov o Prologu
Klauzule a Prolog
Programujeme
Syntaxe jazyka Prolog
Interní databáze
Rekurze
Negace
Program osobni(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
Další zdroje
Pár slov o Prologu
Klauzule a Prolog
Programujeme
Syntaxe jazyka Prolog
Interní databáze
Rekurze
Negace
Program osobni(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).
Další zdroje
Pár slov o Prologu
Klauzule a Prolog
Programujeme
Syntaxe jazyka Prolog
Interní databáze
Rekurze
Negace
Program osobni(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
Další zdroje
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 do interní databáze Prologu, konzultujeme.
L
Kdykoliv provedeme změny, musíme znovu načíst program do databáze – rekonzultovat.
Konzultování se provádí buď položkou v menu programového prostř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 do interní databáze Prologu, konzultujeme.
L
Kdykoliv provedeme změny, musíme znovu načíst program do databáze – rekonzultovat.
Konzultování se provádí buď položkou v menu programového prostř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áze Když 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áze Když 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 jako v 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 jako v 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 jako v 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
Příklad – výpočet faktoriálu Predikáty L
faktorial(cislo,Vysl) – tento predikát bude volán uživatelem v dotazu,
L
faktorialpom(citac,Vysl,Vysl) – bude použit pro samotný rekurzivní výpočet.
Další zdroje
Pár slov o Prologu
Klauzule a Prolog
Programujeme
Syntaxe jazyka Prolog
Interní databáze
Rekurze
Příklad – výpočet faktoriálu Predikáty L
faktorial(cislo,Vysl) – tento predikát bude volán uživatelem v dotazu,
L
faktorialpom(citac,Vysl,Vysl) – bude použit pro samotný rekurzivní výpočet. faktorialpom( Citac, Vysl, Vysl )
Další zdroje
Pár slov o Prologu
Klauzule a Prolog
Programujeme
Syntaxe jazyka Prolog
Interní databáze
Rekurze
Příklad – výpočet faktoriálu Predikáty L
faktorial(cislo,Vysl) – tento predikát bude volán uživatelem v dotazu,
L
faktorialpom(citac,Vysl,Vysl) – bude použit pro samotný rekurzivní výpočet. faktorialpom( Citac, Vysl, Vysl )
Čítač, snižuje se o 1
Další zdroje
Pár slov o Prologu
Klauzule a Prolog
Programujeme
Syntaxe jazyka Prolog
Interní databáze
Rekurze
Příklad – výpočet faktoriálu Predikáty L
faktorial(cislo,Vysl) – tento predikát bude volán uživatelem v dotazu,
L
faktorialpom(citac,Vysl,Vysl) – bude použit pro samotný rekurzivní výpočet. faktorialpom( Citac, Vysl, Vysl )
Čítač, snižuje se o 1 Počítá výsledek, na začátku 1
Další zdroje
Pár slov o Prologu
Klauzule a Prolog
Programujeme
Syntaxe jazyka Prolog
Interní databáze
Rekurze
Příklad – výpočet faktoriálu Predikáty L
faktorial(cislo,Vysl) – tento predikát bude volán uživatelem v dotazu,
L
faktorialpom(citac,Vysl,Vysl) – bude použit pro samotný rekurzivní výpočet. faktorialpom( Citac, Vysl, Vysl ) Zde bude výsledek přístupný, na začátku proměnná
Čítač, snižuje se o 1 Počítá výsledek, na začátku 1
Další zdroje
Pár slov o Prologu
Klauzule a Prolog
Programujeme
Syntaxe jazyka Prolog
Interní databáze
Příklad – výpočet faktoriálu Program v Pascalu procedure 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;
Rekurze
Další zdroje
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 Prologu faktorialpom(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
Příklad – výpočet faktoriálu Program v Prologu faktorialpom(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 = 3 faktorialpom(2,3,Vysl). C = 2-1 = 1, V = 2*3 = 6 faktorialpom(1,6,Vysl). C = 1-1 = 0, V = 6*1 = 6 faktorialpom(0,6,Vysl). F = Vysl.
Další zdroje
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/