A Prolog könyvtárhierarchiája nagyon terebélyes, és gyakorlatilag minden lényeges funkció megvalósított, az I/O műveletektől az ablakozó-rendszerig. A szabványosság kérdése ugyanakkor nem megoldott, ahány implementáció annyiféle könyvtár-hierarchia.
Adott forrásfájl vagy tárgykód betöltését jelenti a Prolog fejlesztői környezetbe. Szabványos predikátuma az ensure_loaded/1, paramétere egy fájlnév, vagy fájlnevek listája. Minden fájlra nézve ellenőrzi annak korát, és csak akkor tölti be, ha szükséges.
A kifejezések írása és olvasásakor fontos szerepet játszanak az operátorok. Fontos, hogy ügyeljünk arra, hogy a kiíráskor élő operátorok beolvasáskor is éljenek, különben a beolvasás nem (vagy nem megfelelően) fog sikerülni.
A write/1 és write_term/2 predikátumok segítségével tetszőleges Prolog termet írathatunk ki a képernyőre. A write_term/2 második argumentuma, egy Prolog lista, formázási opciókat tartalmazhat.
Opciók:
A writeq/1 úgy működik, mint a write/1 azzal a különbséggel, hogy szükség esetén a nevek idézőjelek közé kerüljenek, ha a read-nek szüksége van erre, a helyes beolvasáshoz. A kiírt operátoroknak a beolvasáskor deklarálva kell lenniük. A write_canonical/1 is hasonló, ám az operátorok nem infix, hanem szabványos formában kerülnek a kimenetre (pl.: 1+2 → +(1,2)).
A print/1 alapértelmezésben azonos write-tal. Ha a felhasználó definiál egy portray/1 eljárást, akkor a rendszer minden a print-tel kiírandó részkifejezésre meghívja azt. Ha ez a hívás sikerül, akkor feltételezi, hogy a portray elvégezte a szükséges kiírást. Ha meghiúsul, akkor maga írja ki a részkifejezést.
A portray/1 olyan, a felhasználó által definiált (kampó) eljárás (hook predicate), amely saját formát ad egyes termeknek. Ha az eljárás meghiúsul, a Prolognak magának kel kiírnia az argumentumban szereplő kifejezést. Például a portray(szemely(Nev,_,_)):-write(szemely(Nev,...)). predikátum a szemely(kiss,istvan,1960) termet szemely(kiss,...) formában fogja kiírni.
A format/2 predikátum az első paraméterben megadottak szerint kiírja a második paraméterként kapott termet. A formátum-paraméter alakja ~<szám><formázójel>, a fontosabb formázójelek pedig a következők:
Például
Eredménye
A read/1 és a read_term/2 beolvas egy ponttal lezárt kifejezést, egyesíti azt az első argumentummal és kitölti a megadott opció-listát (read_term második argumentum). A read(X) megegyezik a read_term(X,[]) predikátum-hívással.
Opciók:
A char_conversion(X,Y) predikátum hozzáveszi a az érvényben levő konverziós táblához az X,Y párt. Ezután minden kifejezés beolvasásakor X összes nem idézőjelek közti előfordulását lecseréli Y-ra. Ha a két argumentum megegyezik, akkor a korábbi Y karakterhez tartozó konverziós párt eltávolítja a leképezésből.
A current_char_conversion(X,Y) predikátum lekérdezi a konverziós táblát, és megnézi, szerepel-e benne az X,Y pár. Használható még az X-hez vagy Y-hoz tartozó konverziós pár lekérdezésére is.
A szövegfájlokat háromféle módban lehet megnyitni, ezek: read, write, append. Megnyitás az open/3 művelettel történik, argumentumai sorra: fájl neve, megnyitás módja és a csatorna neve.
Például, ha az F fájlból akarunk olvasni:
Ezután műveleteink az R csatornára vonatkoznak, egészen a csatorna lezárásáig. Ezt a close/1 művelettel tehetjük meg. A szabványos bemeneti és kimeneti csatornákra user néven hivatkozhatunk, ezeket nem kell (és nem is lehet) megnyitni és lezárni.
Az I/O utasítások lehetnek karakter, vagy term szintűek.
Karakter szintű utasítások:
Term szintű utasítások:
Például ha egy fájl végéhez hozzá akarunk fűzni egy másik fájlt, az elsőt append módban, a másodikat read módban nyissuk meg. Érdemes karakterenként beolvasni, és kiírni, ha nem tudjuk, hogy a bemenet termenként olvasható-e. A „-1”-es karakterkód jelenti a fájl végét, ekkor zárjuk le a csatornákat.
Dr. Ásványi Tibor több munkájában is foglalkozik a Prolog PLN (ProLog with Narrowing) adta funkcionális bővítésével. Az egyszerű PLN-beli függvények <head> = <expression> [ :- <condition> ]. alakúak, és néhány operátor segítségével használatukat problémamentesen integrálni lehet a nyelvbe (lásd: Ásványi, Tibor: User's Functions in Standard Prolog). Az alábbi kis példa a Fibonacci-sor egy elemének kiszámításán keresztül szemlélteti a PLN-függvények használatát.
Ezzel a definícióval és a ?X=fib(2) kifejezés használatával (? jelöli egy PLN-kefejezés kiértékelését) a Prolog először minden argumentumot kifejt, így X megmarad helyettesítetlen változónak, míg fib(2) előbb fib(2-1)+fib(2-2), majd fib(1)+fib(2-2), azután 1+fib(2-2), 1+fib(0), 1+1, végül 1+1, azaz 2 lesz, amit így illeszthetünk (X=2 maiatt) X-szel.
Az egyszerű függvényeken kívük esetszétválasztásos függvények is implementálhatók, a szokásos Prolog jelölések használatával, így ez az eszköz igen általános, hasznos bővítése az ISO Prolog nyelvnek.
A Prolog visszalépéses keresési rendszere alkalmas nyelvtani ellenőrzések, fordítóprogramok készítésére. Érdekes módon a rendszer önmagát használja saját inputja felismerésére, s ha már egyszer adott ez az eszköz, elérhetővé is teszi a felhasználó számára. A neve Definite Clause Grammar (DCG), ami magyarul talán a tisza klóznyelvtannak felel meg. Nézzük hát, hogyan is néz ki egy DCG-kifejezés. Jelrendszere a standard Prolog kifejezésekre épül. A fej után egy nyilat követve jön az aktuális blokk kifejtése, esetleges kapcsos zárójelek közti Prolog kifejezéssel. A num(N) --> [N], {integer(N), N>=0}. DCG-predikátum például egy nemnegatív egészet értelmez le az inputról és ezzel tér vissza.
Vegyük például az alábbi négy alapműveletes számolást leíró nyelvet, és írjunk rá egy programot, ami nemcsak értelmezi az inputot, de ki is számolja az eredményt.
<arith> ::= <expr> {+,-} <arith> | <expr> <expr> ::= <num> {*,/} <expr> | <num> <num> ::= {a natural number}
A nyelv tehát nem bonyolult, a fordítóprogramunk pedig még kevésbé lesz az. Mit is kell csinálnunk az első esetben? A bemenetet, mint expr értelmezzk, és ha van még utána valami hát megnézzük, hátha + vagy - jel, ami után biztosan egy arith alakú kifejezés következik. Ha nem +, és nem is -, a visszalépéses keresés továbblép, és expr-ként tekint az input egészére. Az érdekes az ezután következő Prolog-blokk, ami a már fölismert inputra ad megkötéseket, illetve értelmezést (pl.: {integer(N), N>=0} vagy {X is X1 * X2}).
A Prolog nyelvén egy-egy ilyen szabály mindig gyarapszik még két argumentumal, az input listával és az értelmezés után fennmaradtal. Tehát ha ellenőrizni szeretnénk, programunk működését az arith(X,[1,+,2,*,3],[]) célhoz hasonló kérdést kell a Prologhoz intéznünk. Nem maradt más hátra, mint hogy megnézzük, hogy is néz ki a DCG kissé kusza formális definíciója.
<DCG_formula> ::= <DCG_clause> '-->' <DCG_clause> | <DCG_clause> '-->' <DCG_clause> ',' '{'<Prolog_expression>'}' <DCG_clause> ::= '['<term>']' | '['<term>']' ',' <DGC_clause> | <name>['('<var_list>')'] | <name>['('<var_list>')'] ',' <DGC_clause> <var_list> ::= <var> | <var>',' <var_list> <var> ::= {Prolog változó} <name> ::= {Prolog névkonstans} <term> ::= {Prolog term} <Prolog_expression> ::= {tetszőleges Prolog kifejezés}