Prolog -=-=-=-= The connection between the language in which we think/program and the problems and solutions we can imagine is very close. For this reason restricting language features with the intent of eliminating programmer errors is at best dangerous. - Bjarne Stroustrup in "The C++ Programming Language" Prolog vychází z logického kalulu. Podporuje jenom spojku & a definování predikátů, ale to úplně stačí. Má algoritmus, který sám najde řešení pro napsanou formuli. Každý program se zkládá ze dvou částí - popisu světa a dotazů. Definice světa - tedy predikátů se zkládá z několika řádek ve formátu: predikat(parametry). Každému takovému zápisu se říká term. Prolog si je uloží do své databáze. Například mu tam můžu uložit rubriky výhně: rubrika(uvodnik). rubrika(software). rubrika(freesoft). rubrika(demo). rubrika(hudba). rubrika(nazory). rubrika(pocitac). rubrika(tvorivost). rubrika(konecnik). Nyní prolog ví, že existuje predikát rubrika s jedním parametrem, který je 1 pro parametry uvodnik, software, freesoft atd. Můžu uložit i některé články, které jsem do výhně napsal spolu s rubrikou a číslem vydání: clanek(gnu,software,7). clanek(gcc,freesoft,8). clanek(cotoje,freesoft,8). clanek(x11,freesoft,8). clanek(cm,pocitac,9). clanek(lisp,software,9). clanek(prolog,software,9). Vlastní prolog funguje vpodstatě jako chytrá databáze. Můžu vznášet různé dotazy na svět, který jsem mu popsal. Například pokud se chci zeptat, jestli existuje rubrika pocitac, napíšu: ?- rubrika(pocitac). Yes ?- je prompt a prolog odpověděl na můj dotaz Yes. Tedy, že predikát je pravdivý. Pokud naopak chci zjistit, jaké existují rubriky napíšu: ?- rubrika(X). X = uvodnik X je volná proměná (proměné se poznají podle velkého písmena, nebo _ na začátku). Proměné v prologu fungují trochu jinak, než proměné v procedurálních jazycích. Zde zatím prolog nezná hodnotu proměné X a proto může nabývat libovolné hodnoty. Prolog prohledal svoji databázi a našel první možnost - uvodnik a nabízí mi ji. Teď můžu zmáčknout enter, a ukončit vyhledávání, nebo středník a najít další možnost: ?- rubrika(pocitac). Yes 4 ?- rubrika(X). X = uvodnik ; X = software ; X = freesoft ; X = demo ; X = hudba ; X = nazory ; X = pocitac ; X = tvorivost ; X = konecnik ; No Tady jsem nebyl spokojen ani z jednou odpovědí a prolog tedy vyhledával další a další možnosti až nakonec nic nového nenašel a odpovědel No. Pokud potřebuju vědět v jakém čísle byl vydán článek x11, napíšu: ?- clanek(x11,X,Y). Y = 8 X = freesoft ; A prolog vyhledá číslo i rubriku. Pokud mě rubrika nezajímá, můžu použít anonymní proměnou _: ?- clanek(x11,_,Y). Y = 8 Nejzajímavější ale je, že můžu definovat nové predikáty nejen výčtem, ale také pomocí dotazů. Například můžu napsat predikát, který zjistí, jestli jsem do dané rubriky v daném čísle něco napsal. Můžu do definice světa přidat: rubrika(Rubrika,Cislo) :- rubrika(Rubrika),clanek(_,Rubrika,Cislo). Operátor :- je vlastně obrácená implikace a čárka znamena AND. Celé to tedy říká, že pokud je Rubrika rubrikou a existuje nějaký článek (_) z rubriky Rubrika v číle číslo, je rubrika neprázdná. Toto je definice predikátu rubrika se dvěma parametry. Ten nemá nic společného z predikátem rubrika s jedním parametrem, který je použit pro výčet rubrik. Nyní tento nový predikát můžu použít pro zjištění seznamu všech neprázdných rubrik v jednotlivých číslech: ?- rubrika(X,Y). Y = 7 X = software ; Y = 9 X = software ; Y = 9 X = software ; Y = 8 X = freesoft ; Y = 8 X = freesoft ; Y = 8 X = freesoft ; Y = 9 X = pocitac ; Výpisy se opakují, protože pokaždé se pro dočasnou proměnou z jménem článku použl jiný článek. Může také zjistit, jaké rubriky byly v čísle 8: ?- rubrika(X,8). X = freesoft ; X = freesoft ; X = freesoft ; O jiné rubrice, než freesoft neví. Nebo se můžu naopak ptát, ve kterých číslech byla rubrika freesoft: ?- rubrika(freesoft,X). X = 8 ; X = 8 ; X = 8 ; Jak vidíte každý predikát lze použít mnoha způsoby. Pokud máte predikát na sčítání, máte vlastně i predikát na odčítání a dělení na dva díly apod. Prostě predikáty v prologu jsou mnohem obecnější, než funkce ve strukturovaných jazycích. výheň