Prolog
Základy syntaxe
- program je tvořen posloupností klauzulí (také databáze)
- pravidlo má tvar hlava
:-tělo. - fakt je klauzule bez těla, tedy má tvar term
. - dotaz má tvar samotného těla, uvozuje se
?- - direktiva má jen tělo, například
:- consult(soubor).
- pravidlo má tvar hlava
- tělo se skládá z termů spojených spojkami
- jako spojka se používá především konjunkce (
,) a někdy také disjunkce (;) - term je proměnná, konstanta, nebo funktor s parametry
- proměnná začíná velkým písmenem nebo podtržítkem a má platnost (scope) jen v rámci jedné klauzule
- jako konstanty slouží především numerické a řetězcové literály, například
3.14a"foobar" - funktor je dán svým názvem a aritou, v textu se tedy často značí způsobem
length/2 - název funktoru může mít tři různé tvary:
- standardní začínají malým písmenem a pokračují libovolnými písmeny, číslicemi a podtržítky
- speciální jsou složeny z posloupnosti speciálních znaků
- řetězcové jsou tvořeny libovolným řetězcem v apostrofech
- nulární funktor se nazývá atom
- některé funktory mají speciální význam a některé lze zapisovat infixně vzhledem ke svým parametrům
- komentáře jsou jednořádkové uvozené znakem
%a víceřádkové uzavřené mezi/*a*/ - procedura je název pro soubor všech klauzulí se stejným funktorem v hlavě (musí mít i stejné arity)
Dvojí význam funktorů
- vnější funktory mají význam predikátových symbolů - reprezentují vztah mezi objekty (svými parametry)
- vnitřní funktory mají význam objektů - datových struktur
Standardní seznamové predikáty
is_list(+Seznam)length(?Seznam, ?Cislo)member(?Prvek, ?Seznam)append(?S1, ?S2, ?Zretezeni)aappend(+SeznamSeznamu, ?Zretezeni)select(?Prvek, ?Seznam, ?ZbytekSeznamu)sort(+Seznam, -Setrideny), používá zavináčové uspořádání termů a odstraňuje duplikátyprefix/2,delete/3,nth0/3,nth1/3,last/2,reverse/2,permutation/2,flatten/2,sumlist/2,same_length/2, …
Aritmetika
- aritmetické výrazy jsou reprezentovány strukturami s přirozenými názvy funktorů
- binární operátory jsou jen syntaktický cukr, takže například
1+2*3+4 == +(+(1, *(2, 3)), 4) - porovnávací operátory nejprve vyhodnotí oba argumenty a deterministicky rozhodnou výsledek:
=:=,=\=,>,>=,<,=<(sic) - operátor
isvyhodnotí pravou stranu a zunifikuje s levou, typické použití jeN1 is N+1 - pokud se Prolog pokusí vyhodnotit nesmyslnou strukturu (například s volnými proměnnými), vyvolá běhovou chybu
pozor: unifikace (
=/2) nevyhodnocuje výrazy, porovnává jako struktury?- 1+1=2. false.- operace pro všechna čísla:
+,-,*,abs,sign,** - float výsledek:
/,sqrt,pi,log,exp,sin, … - celočíselný výsledek:
div,mod,//,rem,round,floor, … - bitové operátory:
>>,<<,\/,/\,xor,\ - speciální celočíselné predikáty:
between/3,succ/2,plus/3 (nestandardizované, ale běžné) další časté (ale nestandardizované) operátory:
min/2 amax/2,gcd/2,random/1,integer/1,float/1
Zavináčové uspořádání
Je k dispozici úplné uspořádání na všech termech:
- operátory
==,\==,@>,@>=,@<,@=< - pořadí: proměnné (dle adresy)
@<čísla (dle hodnoty)@<funktory (dle arity, jména a rekurzivního uspořádání parametrů v pořadí) pozor: unifikací se pořadí nezákladních termů může změnit, např.:
?- X=Y, X==Y. X = Y. ?- X==Y, X=Y. false. ?- X@<Y, X=2, Y=1, X@>Y. X = 2, Y = 1.
Rozdílové seznamy
- nekompletní datová struktura (obsahuje volnou proměnnou) zobecňující koncept akumulátoru
- syntax:
S-KkdeKje proměnná unifikovaná s koncem seznamuS, například[1,2,3|K]-K
Řízení vyhodnocování
call/1 interpretuje argument jako predikát a zkusí ho splnit.once/1 navíc bere jen první úspěšné řešení a dál nebacktrackuje.- operátor
\+uspěje právě když cíl nejde splnit (notje zastaralé). fail/0 nikdy neuspěje,repeat/0 uspěje nekonečněkrát.
Spolu s “If -> Then; Else” se hodí na imperativní kód.- řez (
!) zničí všechny doposud vytvořené alternativy v dané instanci procedury. - zjištění všech odpovědí na daný dotaz:
findall(+Vzor,+Cíl,-SeznamVzorů)
Odbroukovací nástroje
- jsou pouze de-facto standardem, níže dle SWI-Prologu
nastavení módu pomocí
debug/0 anodebug/0: vypnutí různých optimalizací a další nastavení unadňující hledání chyb- lze sledovat různé události na procedurách: vstup, splnění, opakování a neúspěch
- módy spy a trace: spy pouze vypisuje události, trace navíc vždy zastaví a zeptá se co dělat
- přepínání módů na všech procedurách:
trace/0,spy/0,notrace/0,nospy/0 trace/1 aspy/1 nastaví sledování zadané proceduryGUI pro hledání chyb:
guitracer/0 anoguitracer/0
Rozdíly od predikátové logiky (ToDo)
- unique-names assumption
- closed-world assumption
- domain closure
- [AIMA 3ed: pg. 299, 343] name: database semantics