Prolog - Prolog
Paradigma | Logika |
---|---|
Navrhl | Alain Colmerauer , Robert Kowalski |
Poprvé se objevil | 1972 |
Stabilní uvolnění | Část 1: Obecná základní edice 1 (červen 1995 ) Část 2: Moduly-edice 1 (červen 2000 )
|
Disciplína psaní | Netypovaný (jeho jediným datovým typem je „termín“) |
Rozšíření názvu souboru |
.pl , .pro ,.P
|
webová stránka | Část 1: www Část 2: www |
Hlavní implementace | |
B-Prolog , Ciao , ECLiPSe , GNU Prolog , Poplog Prolog, P# , Quintus Prolog , SICStus , Strawberry , SWI-Prolog , Tau Prolog , tuProlog, WIN-PROLOG , XSB , YAP . | |
Nářečí | |
ISO Prolog, Edinburgh Prolog | |
Ovlivněn | |
Plánovač | |
Ovlivněn | |
CHR , Clojure , Datalog , Erlang , KL0 , KL1 , Mercury , Oz , Strand , Visual Prolog , XSB | |
|
Prolog je logický programovací jazyk spojený s umělou inteligencí a výpočetní lingvistikou .
Prolog má své kořeny v logice prvního řádu , formální logice , a na rozdíl od mnoha jiných programovacích jazyků je Prolog určen především jako deklarativní programovací jazyk: logika programu je vyjádřena ve vztazích , reprezentována jako fakta a pravidla . Výpočet je iniciováno spuštěním dotazu nad těmito vztahy.
Jazyk byl vyvinut a implementován v Marseille ve Francii v roce 1972 Alainem Colmerauerem s Philippe Rousselem na základě procedurální interpretace klauzulí Horn Roberta Kowalského .
Prolog byl jedním z prvních logických programovacích jazyků a dnes zůstává nejpopulárnějším takovým jazykem, k dispozici je několik bezplatných i komerčních implementací. Jazyk byl použit pro dokazování vět , expertní systémy , přepisování termínů , typové systémy a automatizované plánování , stejně jako jeho původní zamýšlená oblast použití, zpracování přirozeného jazyka . Moderní prostředí Prolog podporují vytváření grafických uživatelských rozhraní i administrativních a síťových aplikací.
Prolog je vhodný pro specifické úkoly, které těží z logických dotazů založených na pravidlech, jako je vyhledávání v databázích , systémy hlasového ovládání a vyplňování šablon.
Syntaxe a sémantika
V Prologu je logika programu vyjádřena relacemi a výpočet je zahájen spuštěním dotazu přes tyto vztahy. Vztahy a dotazy jsou konstruovány pomocí jediného datového typu Prolog, výrazu . Vztahy jsou definovány klauzulemi . Vzhledem k dotazu se modul Prolog pokusí najít vyvrácení rozlišení negovaného dotazu. Pokud lze negovaný dotaz vyvrátit, tj. Je nalezena instance pro všechny volné proměnné, díky níž je spojení klauzulí a sady singletonů sestávajících z negovaného dotazu nepravdivé, vyplývá z toho, že původní dotaz s aplikovanou nalezenou instancí je logický důsledek programu. Díky tomu je Prolog (a další logické programovací jazyky) zvláště užitečný pro databáze, symbolickou matematiku a aplikace pro analýzu jazyků. Protože Prolog umožňuje nečisté predikáty , může mít kontrola pravdivosti určitých speciálních predikátů záměrný vedlejší účinek , například tisk hodnoty na obrazovku. Z tohoto důvodu může programátor použít určité množství konvenčního imperativního programování, když je logické paradigma nepohodlné. Má čistě logickou podmnožinu, nazývanou „čistý Prolog“, a také řadu extralogických funkcí.
Typy dat
Jediným datovým typem Prologu je termín . Pojmy jsou buď atomy , čísla , proměnné nebo složené výrazy .
- Atom je název pro všeobecné použití bez vlastní význam. Příklady atomů zahrnují
x
,red
,'Taco'
, a'some atom'
. - Čísla mohou být plovoucí nebo celá . Systémy Prolog kompatibilní se standardem ISO mohou kontrolovat příznak Prolog „ohraničený“. Většina hlavních systémů Prolog podporuje celočíselná čísla libovolné délky.
- Proměnné jsou označeny řetězcem skládajícím se z písmen, číslic a podtržítek a začínají velkým písmenem nebo podtržítkem. Proměnné se logicky velmi podobají proměnným v tom, že jsou zástupnými symboly pro libovolné výrazy.
- Sloučenina termín se skládá z atomu nazývá „funktor“ a řada „argumenty“, které jsou opět podmínek. Složené výrazy se obvykle zapisují jako funktor následovaný seznamem argumentů oddělených čárkami, který je obsažen v závorkách. Počet argumentů se nazývá arita pojmu . Atom lze považovat za složený termín s nulovou arititou . Příkladem složeného výrazu je
person_friends(zelda,[tom,jim])
.
Zvláštní případy složených výrazů:
- Seznam je objednaný soubor podmínek. Je označen hranatými závorkami s výrazy oddělenými čárkami nebo v případě prázdného seznamu znakem
[]
. Například,[1,2,3]
nebo[red,green,blue]
. -
Řetězce : Sekvence znaků obklopená uvozovkami je ekvivalentní buď seznamu (číselných) kódů znaků, seznamu znaků (atomy délky 1) nebo atomu v závislosti na hodnotě příznaku Prolog
double_quotes
. Například"to be, or not to be"
.
ISO Prolog poskytuje atom/1
, number/1
, integer/1
a float/1
predikáty pro typu kontroly .
Pravidla a fakta
Programy Prolog popisují vztahy definované pomocí klauzulí. Pure Prolog je omezen na klauzule Horn . Existují dva typy klauzulí: fakta a pravidla. Pravidlo je ve formě
Head :- Body.
a čte se jako „Hlava je pravdivá, pokud je tělo pravdivé“. Tělo pravidla se skládá z volání predikátů, kterým se říká cíle pravidla . Vestavěný logický operátor ,/2
(což znamená arity 2 operátora se jménem ,
) označuje konjunkci cílů, a ;/2
označuje disjunkci . Spojení a rozpojení se mohou objevit pouze v těle, nikoli v hlavě pravidla.
Klauzule s prázdnými těly se nazývají fakta . Příkladem skutečnosti je:
cat(crookshanks).
což je ekvivalentní pravidlu:
cat(crookshanks) :- true.
Vestavěný predikát true/0
je vždy pravdivý.
Vzhledem k výše uvedenému faktu se lze ptát:
je gauners kočka?
?- cat(crookshanks).
Yes
jaké věci jsou kočky?
?- cat(X).
X = crookshanks
Klauzule s těly se nazývají pravidla . Příkladem pravidla je:
animal(X) :- cat(X).
Pokud přidáme toto pravidlo a zeptáme se, jaké věci jsou zvířata?
?- animal(X).
X = crookshanks
Vzhledem k relační povaze mnoha vestavěných predikátů je lze obvykle použít v několika směrech. Lze například length/2
použít k určení délky seznamu ( length(List, L)
daný seznam List
) a také ke generování kostry seznamu o dané délce ( length(X, 5)
) a také ke generování koster seznamu a jejich délek dohromady ( length(X, L)
). Podobně append/3
lze použít jak k připojení dvou seznamů ( append(ListA, ListB, X)
daných seznamů ListA
a ListB
), tak k rozdělení daného seznamu na části ( append(X, Y, List)
daný seznam List
). Z tohoto důvodu pro mnoho programů Prolog stačí poměrně malá sada predikátů knihovny.
Prolog jako obecný jazyk také poskytuje různé vestavěné predikáty k provádění rutinních činností, jako je vstup/výstup , pomocí grafiky a jiné komunikace s operačním systémem. Tyto predikáty nemají vztahový význam a jsou užitečné pouze pro vedlejší efekty, které v systému vykazují. Predikát například write/1
zobrazuje na obrazovce výraz.
Provedení
Provedení programu Prolog je zahájeno odesláním uživatele jediného cíle, nazývaného dotaz. Logicky se modul Prolog pokusí najít vyvrácení rozlišení negovaného dotazu. Metoda rozlišení používaná Prologem se nazývá rozlišení SLD . Pokud lze negovaný dotaz vyvrátit, vyplývá z toho, že dotaz s příslušnými proměnnými vazbami je logickým důsledkem programu. V takovém případě jsou uživateli generovány všechny generované proměnné vazby a dotaz je údajně úspěšný. Operačně lze strategii provádění Prologu chápat jako zobecnění volání funkcí v jiných jazycích, přičemž jedním rozdílem je, že danému volání může odpovídat více hlav klauzulí. V takovém případě systém vytvoří bod volby, sjednotí cíl s klauzulí vedoucí první alternativy a pokračuje v cílech této první alternativy. Pokud se některý cíl během provádění programu nezdaří, všechny variabilní vazby, které byly vytvořeny od vytvoření posledního bodu výběru, budou vráceny zpět a provádění pokračuje další alternativou tohoto bodu výběru. Tato strategie provádění se nazývá chronologické zpětné sledování . Například:
mother_child(trude, sally).
father_child(tom, sally).
father_child(tom, erica).
father_child(mike, tom).
sibling(X, Y) :- parent_child(Z, X), parent_child(Z, Y).
parent_child(X, Y) :- father_child(X, Y).
parent_child(X, Y) :- mother_child(X, Y).
Výsledkem je, že následující dotaz bude vyhodnocen jako pravdivý:
?- sibling(sally, erica).
Yes
Toho dosáhneme následovně: Zpočátku je jedinou odpovídající klauzulí klauzule pro dotaz sibling(sally, erica)
první, takže prokázání dotazu je ekvivalentní prokázání těla této klauzule s příslušnými proměnnými vazbami na místě, tj. Spojkou (parent_child(Z,sally), parent_child(Z,erica))
. Další cíl, který je třeba dokázat, je z této spojky úplně vlevo, tj parent_child(Z, sally)
. Tomuto cíli odpovídají dvě klauzule. Systém vytvoří bod výběru a vyzkouší první alternativu, jejíž tělo je father_child(Z, sally)
. Tento cíl může být prokázán pomocí skutečnosti father_child(tom, sally)
, takže vazba Z = tom
je generován a další cíle, které mají být prokázáno, je druhá část výše uvedeného spojení: parent_child(tom, erica)
. Opět to lze dokázat odpovídající skutečností. Protože všechny cíle lze prokázat, dotaz uspěje. Protože dotaz neobsahoval žádné proměnné, nejsou uživateli hlášeny žádné vazby. Dotaz s proměnnými, jako například:
?- father_child(Father, Child).
vyjmenovává všechny platné odpovědi při zpětném sledování.
Všimněte si, že s kódem, jak je uvedeno výše, dotaz ?- sibling(sally, sally).
také uspěje. V případě potřeby by bylo možné vložit další cíle k popisu příslušných omezení.
Smyčky a rekurze
Iterační algoritmy lze implementovat pomocí rekurzivních predikátů.
Negace
Vestavěný predikát Prolog \+/1
poskytuje negaci jako selhání , což umožňuje nemonotónní uvažování. Cíl \+ illegal(X)
v pravidle
legal(X) :- \+ illegal(X).
se hodnotí následovně: Prolog se pokouší dokázat illegal(X)
. Pokud lze pro tento cíl najít důkaz, původní cíl (tj. \+ illegal(X)
) Selže. Pokud nelze najít žádný důkaz, původní cíl uspěje. Proto se \+/1
provozovatel prefix se nazývá „provable“ operátor, protože dotaz ?- \+ Goal.
úspěšný, pokud cíl není prokazatelný. Tento druh negace je zdravý, pokud je jeho argument „pozemní“ (tj. Neobsahuje žádné proměnné). Správnost je ztracena, pokud argument obsahuje proměnné a je dokončen proces kontroly. Zejména dotaz ?- legal(X).
nyní nelze použít k výčtu všech věcí, které jsou legální.
Programování v Prologu
V Prologu se načítání kódu označuje jako poradenství . Prolog lze použít interaktivně zadáním dotazů na výzvu Prolog ?-
. Pokud neexistuje řešení, píše Prolog no
. Pokud řešení existuje, vytiskne se. Pokud existuje více řešení dotazu, pak je lze požadovat zadáním středníku ;
. Existují pokyny pro správnou programovací praxi ke zlepšení účinnosti, čitelnosti a udržovatelnosti kódu.
Zde postupujte podle několika příkladů programů napsaných v Prologu.
Ahoj světe
Příklad dotazu:
?- write('Hello World!'), nl.
Hello World!
true.
?-
Optimalizace kompilátoru
Jakýkoli výpočet lze vyjádřit deklarativně jako posloupnost stavových přechodů. Jako příklad by mohl být implementován optimalizační kompilátor se třemi optimalizačními průchody jako vztah mezi počátečním programem a jeho optimalizovanou formou:
program_optimized(Prog0, Prog) :-
optimization_pass_1(Prog0, Prog1),
optimization_pass_2(Prog1, Prog2),
optimization_pass_3(Prog2, Prog).
nebo ekvivalentně pomocí DCG notace:
program_optimized --> optimization_pass_1, optimization_pass_2, optimization_pass_3.
Rychlé řazení
Quicksort třídící algoritmus, které se týkají seznamu na své vytříděného verzi:
partition([], _, [], []).
partition([X|Xs], Pivot, Smalls, Bigs) :-
( X @< Pivot ->
Smalls = [X|Rest],
partition(Xs, Pivot, Rest, Bigs)
; Bigs = [X|Rest],
partition(Xs, Pivot, Smalls, Rest)
).
quicksort([]) --> [].
quicksort([X|Xs]) -->
{ partition(Xs, X, Smaller, Bigger) },
quicksort(Smaller), [X], quicksort(Bigger).
Návrhy prologu
Návrhový vzor je obecný znovu použitelný řešení běžně se vyskytující problém v návrhu softwaru . Některé návrhové vzory v Prologu jsou kostry, techniky, klišé, programová schémata, schémata logického popisu a programování vyššího řádu .
Programování vyššího řádu
Predikát vyššího řádu je predikát, který jako argument bere jeden nebo více dalších predikátů. Ačkoliv podpora pro programování vyššího řádu trvá Prolog mimo oblast logiky prvního řádu, která neumožňuje kvantifikaci přes predikáty, ISO Prolog má nyní nějaký vestavěný vyššího řádu predikáty, jako je call/1
, call/2
, call/3
, findall/3
, setof/3
a bagof/3
. Kromě toho, protože libovolné cíle Prologu lze konstruovat a vyhodnocovat za běhu, je snadné psát predikáty vyššího řádu jako maplist/2
, které aplikují libovolný predikát na každého člena daného seznamu a sublist/3
které filtrují prvky, které splňují daný predikát , také umožňující kari .
Chcete-li převést řešení z časové reprezentace (substituce odpovědí na zpětné sledování) na prostorovou reprezentaci (termíny), má Prolog různé predikáty všech řešení, které shromažďují všechny substituce odpovědí daného dotazu v seznamu. Toho lze využít k porozumění seznamu . Například dokonalá čísla se rovnají součtu jejich správných dělitelů:
perfect(N) :-
between(1, inf, N), U is N // 2,
findall(D, (between(1,U,D), N mod D =:= 0), Ds),
sumlist(Ds, N).
To lze použít k výčtu dokonalých čísel a také ke kontrole, zda je číslo dokonalé.
Jako další příklad predikát maplist
použije predikát P
na všechny odpovídající pozice ve dvojici seznamů:
maplist(_, [], []).
maplist(P, [X|Xs], [Y|Ys]) :-
call(P, X, Y),
maplist(P, Xs, Ys).
Když P
je predikát, že pro všechny X
, P(X,Y)
sjednocuje Y
s jediným jedinečnou hodnotu, maplist(P, Xs, Ys)
je ekvivalentní k aplikování mapu funkce ve funkčním programování jako Ys = map(Function, Xs)
.
Programovací styl vyššího řádu v Prologu byl propagován v HiLog a λProlog .
Moduly
Pro programování ve velkém poskytuje Prolog modulový systém . Systém modulů je standardizován ISO. Ne všechny kompilátory Prolog podporují moduly a mezi systémy modulů hlavních kompilátorů Prolog jsou problémy s kompatibilitou. V důsledku toho moduly napsané na jednom kompilátoru Prolog nemusí nutně fungovat na ostatních.
Analýza
Existuje speciální notace, která se nazývá gramatiky určitých klauzulí (DCG). Pravidlo definované -->/2
místo namísto :-/2
je rozšířeno preprocesorem ( expand_term/2
zařízení analogické makrům v jiných jazycích) podle několika jednoduchých pravidel přepisování, což má za následek běžné klauzule Prologu. Nejpozoruhodnější je, že přepis vybaví predikát dvěma dalšími argumenty, které lze použít k implicitnímu navlečení stavu kolem, analogicky k monádám v jiných jazycích. DCG se často používají k zápisu analyzátorů nebo generátorů seznamů, protože také poskytují pohodlné rozhraní pro seznamy rozdílů.
Meta-tlumočníci a reflexe
Prolog je homoikonický jazyk a poskytuje mnoho možností k zamyšlení . Jeho implicitní strategie spouštění umožňuje napsat stručný meta-kruhový vyhodnocovač (nazývaný také meta-interpret ) pro čistý kód Prologu:
solve(true).
solve((Subgoal1,Subgoal2)) :-
solve(Subgoal1),
solve(Subgoal2).
solve(Head) :-
clause(Head, Body),
solve(Body).
kde true
představuje prázdnou spojku a clause(Head, Body)
sjednocuje se s klauzulemi v databázi formuláře Head :- Body
.
Protože programy Prolog jsou samy sekvencemi výrazů Prologu ( :-/2
je operátorem infixu ), které lze snadno číst a kontrolovat pomocí vestavěných mechanismů (jako read/1
), je možné psát přizpůsobené tlumočníky, které rozšiřují Prolog o funkce specifické pro doménu. Například Sterling a Shapiro představují meta-interpret, který provádí uvažování s nejistotou, reprodukované zde s mírnými úpravami:
solve(true, 1) :- !.
solve((Subgoal1,Subgoal2), Certainty) :-
!,
solve(Subgoal1, Certainty1),
solve(Subgoal2, Certainty2),
Certainty is min(Certainty1, Certainty2).
solve(Goal, 1) :-
builtin(Goal), !,
Goal.
solve(Head, Certainty) :-
clause_cf(Head, Body, Certainty1),
solve(Body, Certainty2),
Certainty is Certainty1 * Certainty2.
Tento tlumočník používá tabulku vestavěných predikátů prologu formuláře
builtin(A is B).
builtin(read(X)).
% etc.
a klauzule reprezentované jako clause_cf(Head, Body, Certainty)
. Vzhledem k tomu je lze nazvat solve(Goal, Certainty)
provedením Goal
a získáním míry jistoty ohledně výsledku.
Turingova úplnost
Pure Prolog je založen na podmnožině predikátové logiky prvního řádu , klauzule Horn , která je Turingova-úplná . Turingovu úplnost Prologu lze ukázat pomocí simulace Turingova stroje:
turing(Tape0, Tape) :-
perform(q0, [], Ls, Tape0, Rs),
reverse(Ls, Ls1),
append(Ls1, Rs, Tape).
perform(qf, Ls, Ls, Rs, Rs) :- !.
perform(Q0, Ls0, Ls, Rs0, Rs) :-
symbol(Rs0, Sym, RsRest),
once(rule(Q0, Sym, Q1, NewSym, Action)),
action(Action, Ls0, Ls1, [NewSym|RsRest], Rs1),
perform(Q1, Ls1, Ls, Rs1, Rs).
symbol([], b, []).
symbol([Sym|Rs], Sym, Rs).
action(left, Ls0, Ls, Rs0, Rs) :- left(Ls0, Ls, Rs0, Rs).
action(stay, Ls, Ls, Rs, Rs).
action(right, Ls0, [Sym|Ls0], [Sym|Rs], Rs).
left([], [], Rs0, [b|Rs0]).
left([L|Ls], Ls, Rs, [L|Rs]).
Jednoduchý příklad Turingova stroje je specifikován fakty:
rule(q0, 1, q0, 1, right).
rule(q0, b, qf, 1, stay).
Tento stroj provádí inkrementaci o jedno z čísel v unárním kódování: Smyčkuje přes libovolný počet buněk „1“ a na konec připojí další „1“. Příklad dotazu a výsledku:
?- turing([1,1,1], Ts).
Ts = [1, 1, 1, 1] ;
To ukazuje, jak lze jakýkoli výpočet deklarativně vyjádřit jako posloupnost přechodů stavů, implementovaných v Prologu jako vztah mezi po sobě jdoucími stavy zájmu.
Implementace
ISO prolog
ISO norma Prolog se skládá ze dvou částí. ISO/IEC 13211-1, publikovaná v roce 1995, si klade za cíl standardizovat stávající postupy mnoha implementací základních prvků Prologu. Objasnilo aspekty jazyka, které byly dříve nejednoznačné a vedou k přenosným programům. Existují tři opravy: Cor.1: 2007, Cor.2: 2012 a Cor.3: 2017. ISO/IEC 13211-2, publikovaná v roce 2000, přidává do modulu podporu modulů. Standardní je udržován ISO / IEC JTC1 / SC22 pracovní skupiny / WG17. ANSI X3J17 je americká technická poradní skupina pro tento standard.
Sestavení
Z důvodu efektivity je kód Prolog obvykle kompilován do abstraktního strojového kódu, často ovlivňovaného registrovou sadou instrukcí Warren Abstract Machine (WAM). Některé implementace využívají abstraktní interpretaci k odvození informací o typu a režimu predikátů v době kompilace nebo kompilace do skutečného strojového kódu pro vysoký výkon. Vymýšlení efektivních implementačních metod pro kód Prolog je oblastí aktivního výzkumu v komunitě logického programování a v některých implementacích jsou použity různé další způsoby provádění. Patří sem binarizace klauzule a virtuální stroje založené na zásobníku .
Rekurze ocasu
Systémy Prolog typicky implementují dobře známou optimalizační metodu nazvanou TCO ( call call optimization ) pro deterministické predikáty vykazující rekurzi ocasu nebo obecněji volání ocasu: Rámeček klauzule klauzule je vyřazen před provedením volání v poloze ocasu. Proto jsou deterministické rekurzivní predikáty prováděny s konstantním prostorem zásobníku, jako smyčky v jiných jazycích.
Indexování termínů
Hledání klauzulí, které jsou unifikovatelné s termínem v dotazu, je lineární v počtu klauzulí. Terminační indexování používá datovou strukturu, která umožňuje sublineární časová vyhledávání. Indexování ovlivňuje pouze výkon programu, neovlivňuje sémantiku. Většina Prologů používá indexování pouze na prvním výrazu, protože indexování všech výrazů je drahé, ale techniky založené na slovech zakódovaných v poli nebo překrývajících se kódových slov poskytují rychlé indexování v celém dotazu a hlavičce.
Hashování
Některé systémy Prolog, jako například WIN-PROLOG a SWI-Prolog, nyní implementují hašování, které pomáhá efektivněji zpracovávat velké soubory dat. Při práci s velkými korpusy, jako je WordNet, to obvykle přináší velmi velké zvýšení výkonu .
Podávání tabulek
Některé Prolog systémy, ( B-Prolog , XSB , SWI-Prolog , YAP a Ciao ), implementovat memoization metodu nazvanou stolů , které zbavují uživatele ruční ukládání mezivýsledků. Tabling je časoprostorový kompromis ; dobu provádění lze zkrátit použitím více paměti k uložení průběžných výsledků:
Dílčí cíle vyskytující se při vyhodnocování dotazů jsou udržovány v tabulce spolu s odpověďmi na tato dílčí cíle. Pokud se znovu objeví dílčí cíl, vyhodnocení znovu použije informace z tabulky, nikoli znovu provede řešení proti klauzulím programu.
Tabling lze prodloužit v různých směrech. Může podporovat rekurzivní predikáty pomocí rozlišení SLG nebo lineárního tablingu. Ve vícevláknovém systému Prolog mohly být výsledky tabelování uchovávány jako soukromé pro vlákno nebo sdílené mezi všemi vlákny. A v přírůstkových tabulkách může tabulka reagovat na změny.
Implementace v hardwaru
Během projektu Páté generace počítačových systémů došlo k pokusům implementovat Prolog do hardwaru s cílem dosáhnout rychlejšího provádění s vyhrazenými architekturami. Prolog má navíc řadu vlastností, které mohou umožnit zrychlení prostřednictvím paralelního spouštění. Novějším přístupem bylo kompilovat omezené programy Prolog do pole programovatelných hradel . Rychlý pokrok v hardwaru pro všeobecné použití však důsledně předběhl specializovanější architektury.
Omezení
Ačkoli je Prolog široce používán ve výzkumu a vzdělávání, Prolog a další logické programovací jazyky neměly významný dopad na počítačový průmysl obecně. Většina aplikací je podle průmyslových standardů malá a několik překračuje 100 000 řádků kódu. Programování ve velkém je považováno za komplikované, protože ne všechny překladače Prolog podporují moduly a mezi systémy modulů hlavních překladačů Prolog jsou problémy s kompatibilitou. Přenositelnost kódu Prolog napříč implementacemi byla také problémem, ale vývoj od roku 2007 znamenal: „přenositelnost v rámci rodiny implementací Prologu odvozených z Edinburghu/Quintusu je dostatečně dobrá, aby umožňovala udržování přenosných aplikací v reálném světě“.
Software vyvinutý v Prologu byl kritizován kvůli vysoké penalizaci výkonu ve srovnání s konvenčními programovacími jazyky. Zejména nedeterministická hodnotící strategie Prologu může být problematická při programování deterministických výpočtů nebo dokonce při použití „nezáleží na nedeterminismu“ (kde se místo zpětného sledování všech možností provádí jediná volba). K dosažení požadovaného výkonu může být nutné použít škrty a jiné jazykové konstrukce, které zničí jednu z hlavních atrakcí Prologu, schopnost spouštět programy „dozadu a dopředu“.
Prolog není čistě deklarativní: kvůli konstrukcím, jako je operátor cut , je pro jeho pochopení nutné procedurální čtení programu Prolog. Pořadí klauzulí v programu Prolog je významné, protože na něm závisí strategie provádění jazyka. Jiné logické programovací jazyky, jako například Datalog , jsou skutečně deklarativní, ale omezují jazyk. Výsledkem je, že mnoho praktických programů Prolog je napsáno tak, aby odpovídalo pořadí hledání hloubky prvního Prologu , nikoli jako čistě deklarativní logické programy.
Rozšíření
Z Prologu byly vyvinuty různé implementace k rozšíření možností logického programování v mnoha směrech. Patří sem typy , režimy, logické programování s omezením (CLP), objektově orientované logické programování (OOLP), souběžnost, lineární logika (LLP), funkce logického programování a logiky vyššího řádu plus interoperabilita se znalostními bázemi :
Typy
Prolog je netypový jazyk. Pokusy o zavedení typů pocházejí z 80. let minulého století a od roku 2008 stále existují pokusy rozšířit Prolog o typy. Informace o typu jsou užitečné nejen pro bezpečnost typu, ale také pro úvahy o programech Prolog.
Režimy
Specifikátor režimu | Výklad |
---|---|
+
|
nonvar při vstupu
|
-
|
var při vstupu
|
?
|
Nespecifikováno |
Syntaxe Prologu neurčuje, které argumenty predikátu jsou vstupy a které jsou výstupy. Tyto informace jsou však významné a doporučujeme je zahrnout do komentářů. Režimy poskytují cenné informace při zvažování programů Prolog a lze je také použít k urychlení provádění.
Omezení
Logické programování omezení rozšiřuje Prolog tak, aby zahrnoval koncepty z uspokojení omezení . Program s logikou omezení umožňuje omezení v těle klauzulí, jako například: A(X,Y) :- X+Y>0.
Je vhodný pro rozsáhlé problémy kombinatorické optimalizace, a je tedy užitečný pro aplikace v průmyslovém prostředí, jako je automatické vytváření tabulek času a plánování výroby . Většina systémů Prolog je dodávána s alespoň jedním omezovačem omezení pro konečné domény a často také s řešiči pro jiné domény, jako jsou racionální čísla.
Objektová orientace
Flora-2 je objektově orientovaný systém reprezentace znalostí a uvažování založený na F-logice a zahrnuje HiLog , transakční logiku a proveditelné uvažování .
Logtalk je objektově orientovaný logický programovací jazyk, který může použít většinu implementací Prologu jako back-end kompilátor. Jako jazyk s více paradigmaty obsahuje podporu pro prototypy i třídy.
Oblog je malé, přenosné, objektově orientované rozšíření Prologu od Margaret McDougall z EdCAAD, University of Edinburgh.
Objlog byl rámcový jazyk kombinující objekty a Prolog II od CNRS, Marseille, Francie.
Prolog ++ byl vyvinut společností Logic Programming Associates a poprvé vydán v roce 1989 pro počítače MS-DOS. Byla přidána podpora pro další platformy a druhá verze byla vydána v roce 1995. Knihu o Prolog ++ od Chris Moss vydalo nakladatelství Addison-Wesley v roce 1994.
Visual Prolog je víceparadigmatický jazyk s rozhraními, třídami, implementacemi a výrazy objektů.
Grafika
Systémy Prolog, které poskytují grafickou knihovnu, jsou SWI-Prolog , Visual Prolog , WIN-PROLOG a B-Prolog .
Konkurence
Prolog-MPI je open-source rozšíření SWI-Prolog pro distribuované výpočty přes rozhraní pro předávání zpráv . Existují také různé souběžné programovací jazyky Prolog.
Webové programování
Některé implementace Prologu, zejména Visual Prolog , SWI-Prolog a Ciao , podporují webové programování na straně serveru s podporou webových protokolů, HTML a XML . Existují také rozšíření pro podporu sémantických webových formátů, jako jsou RDF a OWL . Prolog byl také navržen jako jazyk na straně klienta . Visual Prolog navíc podporuje JSON-RPC a Websockety .
Adobe Flash
Cedar je bezplatný a základní tlumočník Prologu. Od verze 4 a výše má Cedar podporu FCA (Flash Cedar App). To poskytuje novou platformu pro programování v Prologu pomocí ActionScriptu .
jiný
- F-logic rozšiřuje Prolog o rámce/objekty pro reprezentaci znalostí .
- Transakční logika rozšiřuje Prolog o logickou teorii stavových operátorů aktualizace. Má jak modelovou teoretickou, tak procedurální sémantiku.
- OW Prolog byl vytvořen s cílem reagovat na nedostatek grafiky a rozhraní Prologu.
Rozhraní do jiných jazyků
Existují rámce, které mohou překlenout mezi Prologem a jinými jazyky:
- LPA Intelligence Server umožňuje vkládání LPA Prolog pro Windows v C, C #, C ++, Java, VB, Delphi, .NET, Lua, Python a jiné jazyky. Využívá vyhrazený datový typ řetězce, který poskytuje LPA Prolog
- Rozhraní Logic Server API umožňuje jak rozšíření, tak vložení Prologu do jazyků C, C ++, Java, VB, Delphi, .NET a jakéhokoli jazyka/prostředí, které lze volat .dll nebo .so. Je implementován pro Amzi! Prolog Amzi! Prolog + Logic Server, ale specifikaci API lze zpřístupnit pro jakoukoli implementaci.
- JPL je obousměrný most Java Prolog, který je standardně dodáván se softwarem SWI-Prolog, což umožňuje vzájemné volání jazyků Java a Prolog (rekurzivně). Je známo, že má dobrou podporu souběžnosti a je v aktivním vývoji.
- InterProlog , most programovací knihovny mezi Javou a Prologem, implementující obousměrné volání predikátu/metody mezi oběma jazyky. Objekty Java lze mapovat do výrazů Prolog a naopak. Umožňuje vývoj GUI a dalších funkcí v Javě a ponechává logické zpracování ve vrstvě Prolog. Podporuje XSB , s podporou SWI-Prolog a YAP plánovanou na rok 2013.
- Prova poskytuje integraci nativní syntaxe s Javou, zasíláním zpráv agentům a pravidly reakce. Prova se staví jako skriptovací systém (RBS) založený na pravidlech pro middleware. Jazyk přináší nové základy v kombinaci imperativního a deklarativního programování .
- PROL Integrovatelný engine Prolog pro Javu. Obsahuje malé IDE a několik knihoven.
- GNU Prolog for Java je implementací ISO Prolog jako knihovny Java (gnu.prolog)
- Ciao poskytuje rozhraní pro C, C ++, Java a relační databáze.
- C#-Prolog je překladač Prolog napsaný v (spravovaném) C#. Lze snadno integrovat do programů C#. Charakteristika: spolehlivý a poměrně rychlý tlumočník, rozhraní příkazového řádku, rozhraní Windows, vestavěný DCG, predikáty XML, predikáty SQL, rozšiřitelné. K dispozici je kompletní zdrojový kód včetně generátoru analyzátoru, který lze použít k přidávání rozšíření pro speciální účely.
-
Warrenův abstraktní stroj pro PHP Kompilátor a překladač Prolog v PHP 5.3. Knihovna, kterou lze použít samostatně nebo v rámci Symfony2.1, která byla přeložena z práce Stephana Buettchera v Javě, kterou najdete [zde stefan
.buettcher ].org /cs /wam /index .html - tuProlog je lehký systém Prolog pro distribuované aplikace a infrastruktury, záměrně navržený kolem minimálního jádra, který má být buď staticky nebo dynamicky konfigurován načítáním/vykládáním knihoven predikátů. tuProlog nativně podporuje programování s více paradigmaty a poskytuje čistý, bezproblémový integrační model mezi Prologem a mainstreamovými objektově orientovanými jazyky-jmenovitě Java, pro verzi Java tuProlog, a jakýkoli jazyk založený na .NET (C#, F#..), pro tuProlog. NET verze.
Dějiny
Název Prolog zvolil Philippe Roussel jako zkratku pro programmation en logique ( francouzština pro programování v logice ). Byl vytvořen kolem roku 1972 Alainem Colmerauerem s Philippem Rousselem na základě procedurální interpretace Hornových doložek Roberta Kowalského . Částečně to bylo motivováno touhou sladit používání logiky jako deklarativního jazyka reprezentace znalostí s procedurální reprezentací znalostí, které byly populární v Severní Americe na konci 60. a na začátku 70. let. Podle Roberta Kowalského byl první systém Prolog vyvinut v roce 1972 Colmerauerem a Phillipe Rousselem. První implementací Prologu byl tlumočník napsaný ve Fortranu Gerardem Battani a Henri Meloni. David HD Warren vzal tohoto tlumočníka do Edinburghu a tam implementoval alternativní front-end, který definoval syntaxi „Edinburgh Prolog“ používanou většinou moderních implementací. Warren také implementoval první kompilátor pro Prolog a vytvořil vlivný DEC-10 Prolog ve spolupráci s Fernandem Pereirou. Warren později zobecnil myšlenky za DEC-10 Prolog, aby vytvořil Warren Abstract Machine .
Evropští vědci AI upřednostňovali Prolog, zatímco Američané upřednostňovali Lisp , což údajně vyvolávalo mnoho nacionalistických debat o výhodách jazyků. Hodně z moderního vývoje Prologu pocházelo z podnětu projektu Páté generace počítačových systémů (FGCS), který pro svůj první operační systém vyvinul variantu Prologu s názvem Kernel Language .
Pure Prolog byl původně omezen na použití prověrky věty o rozlišení s klauzulemi Horn ve tvaru:
H :- B1, ..., Bn.
Aplikace věty považuje takové doložky za postupy:
to show/solve H, show/solve B1 and ... and Bn.
Čistý Prolog byl brzy rozšířen, aby zahrnoval negaci jako selhání , ve kterém jsou negativní podmínky formy ne (B i ) ukázány pokusem a neúspěchem vyřešit odpovídající pozitivní podmínky B i .
Následná rozšíření Prologu původním týmem zavedla do implementací schopnosti logiky programování omezení .
Použití v průmyslu
Prolog byl použit ve Watsonu . Watson používá software DeepQA společnosti IBM a rámec Apache UIMA ( Unstructured Information Management Architecture). Systém byl napsán v různých jazycích, včetně jazyků Java, C ++ a Prolog, a běží na operačním systému SUSE Linux Enterprise Server 11 využívajícím rámec Apache Hadoop k poskytování distribuovaných počítačů. Prolog se používá pro párování vzorů nad stromy analyzovanými přirozeným jazykem. Vývojáři uvedli: „Vyžadovali jsme jazyk, ve kterém bychom mohli pohodlně vyjadřovat pravidla shody vzorů nad stromy analýzy a dalšími anotacemi (například výsledky rozpoznávání pojmenovaných entit), a technologií, která by mohla tato pravidla velmi efektivně provádět. Zjistili jsme, že Prolog byla ideální volbou pro jazyk díky jeho jednoduchosti a expresivitě. “ Prolog je používán v Low-Code Development Platform GeneXus , která se zaměřuje na AI. Open source grafová databáze TerminusDB je implementována v prologu. TerminusDB je navržen pro společné vytváření a správu grafů znalostí .
Viz také
- Porovnání implementací Prologu
- Logicko-lingvistické modelování . Metoda pro budování systému založeného na znalostech, který používá Prolog.
- Programování sady odpovědí . Plně deklarativní přístup k logickému programování.
- Asociace pro logické programování
Související jazyky
- Jazyk Gödel je silně typovaná implementace souběžného programování logiky omezení . Je postaven na SICStus Prolog.
- Visual Prolog , dříve známý jako PDC Prolog a Turbo Prolog, je silně typovaný objektově orientovaný dialekt Prologu, který se velmi liší od standardního Prologu. Jako Turbo Prolog byl uveden na trh společností Borland, ale nyní jej vyvíjí a prodává dánská firma PDC (Prolog Development Center), která jej původně vyrobila.
- Datalog je podmnožinou Prologu. Je omezena na vztahy, které mohou být stratifikované a neumožňuje složené termíny. Na rozdíl od Prologu není Datalog dokončen Turingem .
- Merkur je odnož Prologu zaměřená na softwarové inženýrství ve velkém se statickým systémem polymorfního typu a také režimem a systémem determinismu.
- GraphTalk je patentovaná implementace Warrenova abstraktního stroje s dalšími objektově orientovanými vlastnostmi.
- V některých ohledech je Prolog podmnožinou Planneru . Myšlenky v Planneru byly později dále rozvinuty v metaforě Vědecké komunity .
- AgentSpeak je variantou Prologu pro programování chování agentů v systémech s více agenty .
- Erlang začal život implementací založenou na Prologu a udržuje velkou část syntaxe založené na sjednocení Prologu.
- Pilog je deklarativní jazyk postavený na PicoLispu , který má sémantiku Prologu, ale používá syntaxi Lispu.
Reference
Další čtení
- Blackburn, Patrick; Bos, Johan; Striegnitz, Kristina (2006). Naučte se Prolog hned! . ISBN 978-1-904987-17-8.
- Ivan Bratko , Prolog Programming for Artificial Intelligence , 4. vyd., 2012, ISBN 978-0-321-41746-6 . Rezervovat přílohy a zdrojový kód
- William F. Clocksin, Christopher S. Mellish: Programování v Prologu: Použití normy ISO . Springer, 5. vydání, 2003, ISBN 978-3-540-00678-7 . (Toto vydání je aktualizováno pro ISO Prolog. Předchozí edice popsaly Edinburgh Prolog.)
- William F. Clocksin: Doložka a účinek. Programování prologu pro pracujícího programátora . Springer, 2003, ISBN 978-3-540-62971-9 .
- Michael A. Covington , Donald Nute, Andre Vellino, Prolog Programming in Depth , 1996, ISBN 0-13-138645-X .
- Michael A. Covington, zpracování přirozeného jazyka pro programátory Prolog , 1994, ISBN 978-0-13-629213-5
- MS Dawe a CMDawe, Prolog pro počítačové vědy , Springer Verlag 1992.
- ISO/IEC 13211: Informační technologie - Programovací jazyky - Prolog . Mezinárodní organizace pro normalizaci , Ženeva.
- Feliks Kluźniak a Stanisław Szpakowicz (s příspěvkem Janusze S. Bieńa). Prolog pro programátory . Academic Press Inc. (Londýn), 1985, 1987 (dostupné pod licencí Creative Commons na stránkách
.google ). ISBN 0-12-416521-4 ..com /site /prologforprogrammers / - Richard O'Keefe , The Craft of Prolog , ISBN 0-262-15039-5 .
- Robert Smith, John Gibson, Aaron Sloman : „Podpora dvouúrovňových virtuálních strojů POPLOG pro interaktivní jazyky“, v Research Directions in Cognitive Science Volume 5: Artificial Intelligence , Eds D. Sleeman and N. Bernsen, Lawrence Erlbaum Associates, pp 203– 231, 1992.
- Leon Sterling a Ehud Shapiro , The Art of Prolog: Advanced Programming Techniques , 1994, ISBN 0-262-19338-8 .
- David HD Warren, Luis M. Pereira a Fernando Pereira, Prolog - jazyk a jeho implementace ve srovnání s Lisp. Archiv bulletinu ACM SIGART, číslo 64. Sborník příspěvků ze sympozia 1977 o umělé inteligenci a programovacích jazycích, s. 109–115.