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.14
a"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
is
vyhodnotí 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-K
kdeK
je 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 (not
je 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