TEORIE VESTAVĚNÝCH PREDIKÁTŮ

Vstup a výstup

write(X) výpis termu X
read(X) načtení termu X
get(X) načte jeden nebílý znak a X je instanciováno na ASCII kód načteného znaku
put(X) vypíše znak odpovídající ASCII kódu X
nl odřádkování
tab(N) výpis N mezer

cti:- read(X), write(X),nl.
?- cti.
cti_znak:-get(X), put(X),nl.
?- cti_znak.
|: ahoj.
ahoj
|: ahoj
a

Klasifikace termů

atom(X) X je atom
atomic(X) X je term (atom, řetězec, číslo)
integer(X) X je celé číslo
var(X) X je volná proměnná
nonvar(X) X není volná proměnná

var(X) - cíl uspěje, jestliže X je neinstanciovaná proměnná
nonvar(X) - cíl uspěje, jestliže X je term jiný než proměnná nebo X je instanciovaná proměnná
atom(X) - cíl uspěje, jestliže X je atom nebo proměnná, která má za hodnotu atom
integer(X) - viz výše
real(X) - cíl uspěje, jestliže X je reálné číslo nebo proměnná, jejíž hodnota je reálné číslo
atomic(X) - cíl uspěje, jestliže X je integer nebo atom resp. proměnná, jejíž hodnota je atom nebo integer

je_atom(X):- atom(X).
?-je_atom(ahoj).
je_term(X):- atomic(X).
?-je_term(ahoj).
je_cislo(X):- integer(X).
?- je_cislo(k).

yes

yes

no

Grupování termů

bagof(T,C,S) vytvoří seznam S ze všech termů T pro něž je splněn cíl C
setof(T,C,S) podobné jako bagof; každý term se však může v seznamu vyskytovat pouze jednou
findall(T,C,S) podobné jako bagof; v seznamu jsou všechny dostupné řešení


Ladící predikáty *

trace krokování programu
notrace ukončení krokování
spy(P) krokování pouze tzv. testovacích bodů; testovacími body můžou být atomy,struktury nebo predikáty
nospy ruší nastavení krokovacích bodů

*Většina Prologovských interpretů má tyto predikáty také zabudované v nabídce.

Standardně definované operátory

:-op(1200, xfx, ':-').
:-op(1200, fx,[ :-, ?-]).
:-op(1100, xfy, ';').
:-op(1000, xfy, ',').
:-op(700, xfx, [ =, \=, is, <, >, =<, >=, ==, =\=, \==, =:=]).
:-op(500, yfx, [ +, -]).
:-op(500, fx, [ +, -, not]).
:-op(400, yfx, [ *, /, div]).
:-op(300, xfx, mod).

Významy operátorů:

operátor význam nejčastější použití
:- definice pravidla viz dříve
?- otázka viz dříve
; logické nebo otázky, nebo pravidla
, logické a otázky, nebo pravidla
= porovnání viz *
\= opak = stejné jako u =
is vyčíslení pravidla
<, >, =<, >=, porovnání pravidla
==, \== porovnání bez přiřazení pravidla
=:=, =\= porovnání s vyhodnocením pravidla
+, -, *, /, mod, div ** standardní matematické funkce pravidla
not negace pravidla

Tyto operátory považujeme za standardní,nemusíme je defino-vat. Kromě těchto vestavěných operátorů si můžeme tvořit i libovolné vlastní operátory. Tyto operátory definujeme následujícím způsobem: :-op(priorita,specifikator,jmeno).

Řízení výpočtu

fail predikát, který nemůže být nikdy splněn
! (řez) - zabraňuje navracení
call(C) je pravdivý, když cíl C je pravdivý
repeat vždy splněný predikát (i při navracení)
not negace

muz(jan).
muz(petr).
muz(dalibor).
zena(petra).
vypis:-muz(X),write(X),nl,fail.
?- vypis.

vypis2:-repeat, read(X), (X=stop,!; nl,write(X), fail).

jan
petr
dalibor



Poslední pravidlo vypisuje načtené výrazy, dokud nezadáme slovo stop.

Databázové predikáty

Každý program v Prologu je složen z množiny relací. Všechny relace pak můžeme považovat za relační databázi, která obsahuje fakta a pravidla. Prolog nám povoluje při běhu programu tuto databázi upravovat pomocí vestavěných predikátů.

Databáze

assert(C). přidá klauzuli vázanou na proměnou C do databáze. Cíl C je možno splnit pouze jednou. Z toho důvodu není možné jej při navracení splnit znovu
asserta(C). plní stejnou funkci jako assert(C). Klauzule C se vloží na začátek databáze
assertz(C). plní stejnou funkci jako assert(C). Klauzule C se přidá na konec databáze.
consult(Soubor). do databáze se načtou klauzule ze souboru
retract(C). výmaz klauzule která se dá unifikovat s C
retractall(H). výmaz všech klauzulí, jejichž hlavy se unifikují s P. V některých implementacích (např. v Arity Prologu) se jmenuje abolish
listing. výpis celé databáze
listing(P). výpis všech klauzulí definující predikát P
listing(P/Arita). výpis všech klauzulí definující predikát P pevně určené arity