VESTAVĚNÉ PREDIKÁTY JAZYKA PROLOG
V Prologu si každý programátor definuje vlastní predikáty podle potřeby. Pro pohodlnější
práci nabízejí konkrétní implementace Prologu řadu předdefinovaných predikátů, které
nazýváme vestavěné predikáty.
Vestavěné predikáty mají stejnou syntaxi jako predikáty definované programátorem. Jejich
pozitivní vyhodnocení potom vyvolá nějakou systémovou funkci, např. výpis textu na
obrazovku, přečtení znaku z klávesnice, sečtení dvou čísel, atd.
V různých implementacích Prologu jsou i různé vestavěné predikáty. Proto by si každý
uživatel měl zjistit co všechno nabízí implementace, kterou používá. Existují však vestavěné
predikáty, které jsou považovány za standardní a jsou obsaženy v (téměř) každé
implementaci. S těmi se setkáte v této kapitole.
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
odřádkování
nl
tab(N) výpis N mezer
cti:- read(X), write(X),nl. |: ahoj.
?- cti.
ahoj
cti_znak:-get(X), put(X),nl. |: ahoj
?- cti_znak.
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á
je_atom(X):- atom(X).
?-je_atom(ahoj).
yes
je_term(X):- atomic(X).
?-je_term(ahoj).
yes
je_cislo(X):- integer(X).
?- je_cislo(k).
no
Konverze termů
Struktura=..Seznam
konverze struktury na seznam, nebo naopak
name(Term,Seznam)
vytvoří z termu seznam v ASCII kódu, nebo naopak
arg(N,Struktura,X)
functor(Struktura,Jmeno,Arita)
vybere n-tý argument ze struktury a naváže ho na
proměnou X
vrací jméno a aritu struktury, nebo vytvoří strukturu
daného jména a arity
?- Struktura(a,b,c)=..Seznam.
?- name(X,[112,114,111,108,111,103]).
?- arg(2,Clovek(jmeno,vek,pohlavi),X).
?- functor(Clovek(jmeno,vek,pohlavi),Jmeno,Arita).
Seznam = [Struktura,a,b,c]
X = prolog
X = vek
Jmeno = Clovek, Arita = 3
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
definice pravidla
nejčastější použití
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.
jan
petr
dalibor
vypis2:-repeat, read(X), (X=stop,!; nl,write(X), fail).
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).
retractall(H).
listing.
listing(P).
výmaz klauzule která se dá unifikovat s C
výmaz všech klauzulí, jejichž hlavy se unifikují s P. V některých
implementacích (např. v Arity Prologu) se jmenuje abolish
výpis celé databáze
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
Zdroje:
Jirků P.: Logické programování I - Programovací jazyk Prolog. Vysoká škola ekonomická,
Praha 1995
Pavlíček P., Mikulecký P., Hynek J.: Logické programování a Prolog. Gaudeamus, Hradec
Králové 1995
http://iris.uhk.cz/
Download

VESTAVĚNÉ PREDIKÁTY JAZYKA PROLOG