PROLOG Program popisuje "svět" Prologu = databáze faktů a pravidel. fakta: predikát(arg1, arg2, ...argN). cíle: ?- predikát(arg1, arg2, ...argN). pravidla: hlava :- tělo. predikát(argumenty) :- fakta. Elementy programu: konstanty, proměnné, struktury \____________________________/ termy Unifikace - porovná-li se volná proměnná s konstantou, naváže se na tuto konstantu, - porovnají-li se dvě volné (neinstalované) proměnné, stanou se synonymy, - porovná-li se volná proměnná s termem, naváže se na tento term, - porovnají-li se termy, které nejsou volnými proměnnými, musí být pro úspěšné porovnání stejné. Zásady při plnění cílů - Dotaz může být složen z několika cílů. - Při konjunkci cílů jsou cíle plněny postupně zleva. - Pro každý cíl je při jeho plnění prohledávána databáze od začátku. - Při úspěšném porovnání klauzule s cílem je její místo v databázi označeno ukazatelem. Každý z cílů má vlastní ukazatel. - Při úspěšném porovnání cíle s hlavou pravidla, pokračuje výpočet plněním cílů zadaných tělem pravidla. - Cíl je splněn, je-li úspěšně porovnán s faktem databáze, nebo s hlavou pravidla databáze a jsou splněny podcíle těla pravidla. - Není-li během exekuce některý cíl splněn ani po prohlédnutí celé databáze, je aktivován mechanismus návratu. - Splněním jednotlivých cílů dotazu je splněn globální cíl a systém vypíše hodnoty proměnných zadaných v dotazu. - Zjistí-li se při výpočtu, že globální cíl nelze splnit, je výsledkem no. Mechanismus návratu - exekuce se vrací k předchozímu splněnému cíli, zruší se instalace proměnných a pokouší se opětovně splnit tento cíl prohledáváním databáze dále od ukazatele pro tento cíl, - splní-li se opětovně tento cíl, pokračuje se plněním dalšího, (předtím nesplněného) vpravo stojícího cíle, - nesplní-li se předchozí cíl, vrací se výpočet opětovně zpět. Důležité predikáty I/O operace: write(X) zápis termu do výstupního proudu nl odřádkování tab(X) výstup X mezer display(X) výstup jako write, ale ve funkční notaci read(X) čtení termu ze vstupního proudu put(X) výstup znaku na jehož ASCII kod je X instalováno get(X) vstup ASCII kódu zobrazitelného znaku (32 a výše) get0(X) jako get, ale i pro nezobrazitelné znaky skip(X) přeskakuje vstupující znaky, dokud úspěšně neporovná znak s X tell(X) přepnutí výstupu do souboru X told uzavření souboru a přepnutí výstupu na user see(X) přepnutí vstupu na soubor X seen současný vstupní soubor je uzavřen a vstup přepnut na user setdrive(X) nastavení driveru X getdrive(X) zjištění jména aktuálního driveru chdir(X) nastavení pracovního adresáře Řídící predikáty a testy true vždy splněný cíl fail vždy nesplněný cíl var(X) splněno, je-li X volnou proměnnou nonvar(X) splněno, není-li X neinstalovanou proměnnou atom(X) splněno, je-li X instalováno na atom integer(X) splněno, je-li X instalováno na integer atomic(X) splněno, je-li X instalováno na attom nebo integer not(X) X musí být interpretovatelné jako cíl. Uspěje pokud X není splněn call(X) X musí být interpretovatelné jako cíl. Uspěje pokud X je splněn halt ukončí výpočet X = Y pokus o porovnání X s Y X \= Y opak = X == Y striktní rovnost X \== Y úspěšně splněn, neplatí-li == ! změna mechanismu návratu repeat nekonečněkrát splnitelný cíl X , Y konjunkce cílů X ; Y disjunkce cílů Predikáty pro práci s aritmetickými výrazy X is E E musí být aritm. výraz, který se vyhodnotí a porovná s X E1 + E2 při instalovaných argumentech (pod. ?, *, /, mod) E1 > E2 při instalovaných argumentech (pod. >=,<,=<,\=,=) E1 =:= E2 uspěje, jsou-li si hodnoty E1, E2 rovny E1 =\= E2 uspěje, nejsou-li si hodnoty E1, E2 rovny Predikáty pro manipulaci s databází a s klauzulemi listing(X) výpis všech klauzulí na jejichž jméno je X instalováno listing výpis celého programu clause(X, Y) porovnání X a Y s hlavou a s tělem klauzule asserta(X) přidání klauzule instalované na X na začátek databáze assertz(X) totéž, ale přidává se na konec databáze retract(X) odstranění prvého výskytu klauzule X z databáze findall(X,Y.Z) všechny výskyty termu X v databázi, které splňují cíl Y jsou vloženy do seznamu Z Predikáty pro práci se strukturami funktor(T, F, A) vytvoří strukturu T s funktorem F a aritou A arg(N, T, A) porovná A s N-tým argumentem struktury T X =.. L tzv."univ". Provádí porovnání termu X se seznamem L, který je složen z funktoru termu X, následovaném argumenty X name(A, L) je-li A instalováno, převede jméno atomu A na seznam znaků a ten porovná s L. Není-li A instalováno, instaluje je znaky podle seznamu L lenght(L, A) zjistí délku seznamu a porovná ji s A