Prolog
Paradigma | Logik |
---|---|
Entworfen von | Alain Colmerauer, Robert Kowalski |
Erstmals erschienen | 1972 |
Stabile Version | Teil 1: General Core-Edition 1 (Juni 1995 )Teil 2: Modules-Edition 1 (Juni 2000 )) |
Disziplin tippen | Untyped (sein Einzeldatentyp ist "Begriff") |
Dateiname -Erweiterungen | .pl , .Profi , .P |
Webseite | Teil 1: www Teil 2: www |
Haupt Implementierungen | |
B-Prolog, Ciao, Finsternis, Gnu Prolog, Papplog Prolog, P#,, Quintus Prolog, Sicstus, Erdbeere, Swi-Prolog, Tau Prolog, Tuprolog, Gewinnen-Prolog, Xsb, KLÄFFEN. | |
Dialekte | |
ISO Prolog, Edinburgh Prolog | |
Beeinflusst von | |
Planer | |
Beeinflusst | |
Chr, Clojure, Datenprotokoll, Erlang, KL0, KL1, Quecksilber, Oz, Strand, Visueller Prolog, Xsb | |
|
Prolog ist ein Logikprogrammierung Sprache verbunden mit künstliche Intelligenz und Computerlinguistik.[1][2][3]
Prolog hat seine Wurzeln in Logik erster Ordnung, a formelle Logikund im Gegensatz zu vielen anderen Programmiersprachen, Prolog ist in erster Linie als deklarative Programmierung Sprache: Die Programmlogik wird in Bezug auf Beziehungen, dargestellt als Fakten und Regeln. EIN Berechnung wird durch Ausführen a initiiert Anfrage über diese Beziehungen.[4]
Die Sprache wurde 1972 in Marseille, Frankreich, entwickelt und implementiert Alain Colmerauer mit Philippe Roussel, basierend auf Robert Kowalski's prozedurale Interpretation von Hornklauseln bei Universität von Edinburgh.[5][6][7]
Prolog war eine der ersten logischen Programmiersprachen[8] und bleibt heute die beliebteste Sprache mit mehreren kostenlosen und kommerziellen Implementierungen. Die Sprache wurde für verwendet Theorem beweisen,[9] Expertensysteme,[10] Begriff umschreiben,[11] Typsysteme,[12] und automatisierte Planung,[13] sowie sein ursprünglich beabsichtigtes Gebrauchsfeld, Verarbeitung natürlicher Sprache.[14][15] Moderne Prologumgebungen unterstützen die Schaffung von Grafische Benutzeroberflächensowie administrative und vernetzte Anwendungen.
Der Prolog eignet sich gut für bestimmte Aufgaben, die von regelbasierten logischen Abfragen wie der Suche profitieren Datenbanken, Stimmenkontrolle Systeme und Füllvorlagen.
Syntax und Semantik
In Prolog wird die Programmlogik in Bezug auf die Beziehungen ausgedrückt, und eine Berechnung wird durch Ausführen von a initiiert Anfrage über diese Beziehungen. Beziehungen und Abfragen werden mit dem einzelnen Datentyp von Prolog konstruiert, der Begriff.[4] Beziehungen werden durch definiert durch Klauseln. Bei einer Abfrage versucht der Prolog Engine, a zu finden Auflösung Widerlegung der negierten Abfrage. Wenn die negierte Abfrage widerlegt werden kann, d. H. Eine Instanziierung für alle freien Variablen, die die Vereinigung von Klauseln und das Singleton -Set, das aus der negierten Abfrage besteht logische Konsequenz des Programms. Dies macht Prolog (und andere logische Programmiersprachen) besonders nützlich für die Datenbank. Symbolische Mathematik, und Sprachanalyseanwendungen. Weil Prolog unrein zulässt Prädikate, Überprüfen der Wahrheitswert von bestimmten besonderen Prädikaten kann einige absichtlich haben Nebeneffekt, wie zum Beispiel einen Wert auf den Bildschirm drucken. Aus diesem Grund darf der Programmierer eine gewisse konventionelle Menge verwenden Imperative Programmierung Wenn das logische Paradigma unpraktisch ist. Es hat eine rein logische Untergruppe, die als "reiner Prolog" bezeichnet wird, sowie eine Reihe extralogischer Merkmale.
Datentypen
Prologs Single Datentyp ist der Begriff. Begriffe sind entweder Atome, Zahlen, Variablen oder zusammengesetzte Begriffe.
- Ein Atom ist ein Allzweckname ohne inhärente Bedeutung. Beispiele für Atome umfassen
x
,rot
,'Taco'
, und"Etwas Atom"
. - Zahlen kann sein schwimmt oder Ganzzahlen. ISO -Standard -kompatible Prolog -Systeme können das Prolog -Flag "begrenzt" überprüfen. Die meisten der wichtigsten Prolog -Systeme unterstützen beliebige Ganzzahlzahlen.
- Variablen werden mit einer Zeichenfolge bezeichnet, die aus Buchstaben, Zahlen und Unterstrichen besteht und mit einem Buchstaben oder Unterstrichen aus dem oberen Fall beginnt. Variablen ähneln stark Variablen in der Logik, da sie Platzhalter für willkürliche Begriffe sind.
- A zusammengesetzter Begriff besteht aus einem Atom, das als "Functor" und einer Reihe von "Argumenten" bezeichnet wird, die erneut Begriffe sind. Verbindliche Begriffe werden normalerweise als Funkartor geschrieben, gefolgt von einer von Kommas getrennten Liste von Argumentenbegriffen, die in Klammern enthalten sind. Die Anzahl der Argumente wird als Begriff bezeichnet Arity. Ein Atom kann als zusammengesetzter Begriff mit angesehen werden Arity Null. Ein Beispiel für einen zusammengesetzten Term ist
Person_friends (Zelda, [Tom, Jim])
.
Sonderfälle von zusammengesetzten Begriffen:
- A Aufführen ist eine geordnete Sammlung von Begriffen. Es wird durch quadratische Klammern mit den durch Kommas getrennten Begriffen oder im Fall der leeren Liste mitgeteilt
[]
. Zum Beispiel,[1,2,3]
oder[rot grün blau]
. - Saiten: Eine Abfolge von Zeichen, die von Zitaten umgeben sind
Anführungszeichen
. Zum Beispiel,"sein oder nicht sein"
.[16]
ISO Prolog Bietet die Atom/1
, Nummer 1
, Ganzzahl/1
, und float/1
Prädikate für Typ Überprüfung.[17]
Regeln und Fakten
Prolog -Programme beschreiben Beziehungen, definiert durch Klauseln. Reines Prolog ist auf beschränkt auf Hornklauseln. Es gibt zwei Arten von Klauseln: Fakten und Regeln. Eine Regel ist von der Form
Kopf :- Körper.
und wird als "Kopf ist wahr, wenn der Körper wahr ist" gelesen. Der Körper einer Regel besteht aus Aufrufen von Prädikaten, die als Regel bezeichnet werden Tore. Das eingebaute logical operator ,/2
(was eine Arity 2 bedeutet Operator mit Namen ,
) bezeichnet Verbindung von Zielen und ;/2
bezeichnet disjunktion. Konjunktionen und Unterbrechungen können nur im Körper erscheinen, nicht im Kopf einer Regel.
Klauseln mit leeren Körpern werden genannt Fakten. Ein Beispiel für eine Tatsache ist:
Katze(Tom).
das entspricht der Regel:
Katze(Tom) :- Stimmt.
Das integrierte Prädikat true/0
ist immer wahr.
Angesichts der oben genannten Tatsache kann man fragen:
Ist Tom eine Katze?
?- Katze(Tom). Ja
Welche Dinge sind Katzen?
?- Katze(X). X = Tom
Klauseln mit Körpern werden genannt Regeln. Ein Beispiel für eine Regel ist:
Tier(X) :- Katze(X).
Wenn wir diese Regel hinzufügen und fragen Welche Dinge sind Tiere?
?- Tier(X). X = Tom
Aufgrund der relationalen Natur vieler eingebauter Prädikate können sie normalerweise in verschiedene Richtungen verwendet werden. Zum Beispiel, Länge/2
kann verwendet werden, um die Länge einer Liste zu bestimmen (Länge (Liste, l)
, gegeben eine Liste Aufführen
) sowie ein Listen -Skelett einer bestimmten Länge zu generieren (Länge (x, 5)
) und auch zusammen zu generieren, um Skelette und ihre Längen zusammen zu generieren (zusammen (Länge (x, l)
). Ähnlich, anhängen/3
kann beide verwendet werden, um zwei Listen anzuhängen (append (lista, listb, x)
gegebene Listen LISTA
und Listb
) sowie um eine bestimmte Liste in Teile aufzuteilen ((anhängen (x, y, Liste)
, gegeben eine Liste Aufführen
). Aus diesem Grund reicht eine vergleichsweise kleine Reihe von Bibliotheksprädikaten für viele Prolog -Programme aus.
Als Allzwecksprache bietet Prolog auch verschiedene integrierte Prädikate, um Routineaktivitäten wie durchzuführen Input-Outputmit Grafiken und ansonsten mit dem Betriebssystem kommunizieren. Diese Prädikate erhalten keine relationale Bedeutung und sind nur für die Nebenwirkungen nützlich, die sie auf dem System zeigen. Zum Beispiel das Prädikat Schreiben Sie/1
Zeigt einen Begriff auf dem Bildschirm an.
Ausführung
Die Ausführung eines Prolog -Programms wird durch die Veröffentlichung eines einzelnen Ziels durch den Benutzer initiiert, der als Abfrage bezeichnet wird. Logischerweise versucht der Prolog Engine, a zu finden Auflösung Widerlegung der negierten Abfrage. Die von Prolog verwendete Auflösungsmethode wird genannt SLD -Resolution. Wenn die negierte Abfrage widerlegt werden kann, ist folgt, dass die Abfrage mit den entsprechenden variablen Bindungen eine logische Folge des Programms ist. In diesem Fall werden alle generierten variablen Bindungen an den Benutzer gemeldet, und die Abfrage soll erfolgreich gewesen sein. Operativ kann die Ausführungsstrategie von Prolog als Verallgemeinerung von Funktionsaufrufen in anderen Sprachen betrachtet werden. Ein Unterschied besteht darin, dass mehrere Klauselköpfe mit einem bestimmten Anruf übereinstimmen können. In diesem Fall erstellt das System einen Auswahlpunkt, sich vereint Das Ziel mit dem Klauselkopf der ersten Alternative und setzt sich mit den Zielen dieser ersten Alternative fort. Wenn ein Ziel im Verlauf der Ausführung des Programms fehlschlägt, werden alle variablen Bindungen, die seit dem jüngsten Auswahlpunkt erstellt wurden, rückgängig gemacht, und die Ausführung wird mit der nächsten Alternative dieses Auswahlpunkts fortgesetzt. Diese Ausführungsstrategie wird als chronologisch bezeichnet Backtracking. Zum Beispiel:
mutter_child(Trude, Ausfall). vater_child(Tom, Ausfall). vater_child(Tom, Erica). vater_child(Mike, Tom). Geschwister(X, Y) :- parent_child(Z, X), parent_child(Z, Y). parent_child(X, Y) :- vater_child(X, Y). parent_child(X, Y) :- mutter_child(X, Y).
Dies führt dazu, dass die folgende Abfrage als wahr bewertet wird:
?- Geschwister(Ausfall, Erica). Ja
Dies wird wie folgt erhalten: zunächst der einzige Matching-Klausel für die Abfrage Geschwister (Sally, Erica)
ist der erste, so dass das Beweisen der Abfrage dem Bestreben des Körpers dieser Klausel mit den entsprechenden variablen Bindungen entspricht, d. H. Die Konjunktion (parent_child (z, sally), parent_child (z, erica))
. Das nächste Ziel, das nachgewiesen werden muss, ist die größte dieser Konjunktion, d. H. parent_child (z, sally)
. Zwei Klauselköpfe passen zu diesem Ziel. Das System erstellt einen Auswahlpunkt und versucht die erste Alternative, deren Körper ist Vater_Child (Z, Sally)
. Dieses Ziel kann mit der Tatsache nachgewiesen werden Vater_Child (Tom, Sally)
so die Bindung Z = Tom
wird erzeugt, und das nächste Ziel ist der zweite Teil der obigen Konjunktion: Eltern_Child (Tom, Erica)
. Dies kann auch durch die entsprechende Tatsache beweist werden. Da alle Ziele nachgewiesen werden konnten, ist die Abfrage erfolgreich. Da die Abfrage keine Variablen enthielt, werden dem Benutzer keine Bindungen gemeldet. Eine Abfrage mit Variablen wie:
?- vater_child(Vater, Kind).
Zählt alle gültigen Antworten auf Backtracking.
Beachten Sie, dass die Abfrage mit dem Code wie oben angegeben ?- Geschwister (Sally, Sally).
Auch erfolgreich. Man würde zusätzliche Ziele einfügen, um die relevanten Beschränkungen zu beschreiben, falls gewünscht.
Schleifen und Rekursion
Iterative Algorithmen können mit rekursiven Prädikaten implementiert werden.[18]
Negation
Das eingebaute Prolog-Prädikat \+/1
bietet Negation als Misserfolgwas erlaubt nicht monoton Argumentation. Das Ziel \+ illegal (x)
in der Regel
legal(X) :- \+ illegal(X).
wird wie folgt bewertet: Prolog Versuche zu beweisen illegal (x)
. Wenn ein Beweis für dieses Ziel gefunden werden kann, ist das ursprüngliche Ziel (d. H., \+ illegal (x)
) scheitert. Wenn kein Beweis gefunden werden kann, ist das ursprüngliche Ziel erfolgreich. deshalb, die \+/1
Der Präfixbetreiber wird seit der Abfrage als "nicht nachweisbar" -Operator bezeichnet ?- \+ Ziel.
Erfolg, wenn das Ziel nicht nachweisbar ist. Diese Art von Negation ist Klang Wenn sein Argument ist "Boden" (d. H. Enthält keine Variablen). Solidness geht verloren, wenn das Argument Variablen enthält und das Beweisverfahren abgeschlossen ist. Insbesondere die Abfrage ?- legal (x).
Jetzt kann man nicht verwendet werden, um alle Dinge aufzuzählen, die legal sind.
Programmierung im Prolog
Im Prolog wird das Ladecode als bezeichnet als Beratung. Prolog kann interaktiv verwendet werden, indem Abfragen an der Prolog -Eingabeaufforderung eingegeben werden ?-
. Wenn es keine Lösung gibt, schreibt Prolog nein
. Wenn eine Lösung vorhanden ist, wird sie gedruckt. Wenn die Abfrage mehrere Lösungen gibt, können diese durch Eingeben eines Halbkolons angefordert werden ;
. Es gibt Richtlinien für eine gute Programmierpraxis, um die Code -Effizienz, Lesbarkeit und Wartbarkeit zu verbessern.[19]
Hier folgen Sie einigen Beispielprogrammen, die in Prolog geschrieben wurden.
Hallo Welt
Ein Beispiel für eine Frage:
?- schreiben('Hallo Welt!'), nl. Hallo Welt! Stimmt. ?-
Compiler -Optimierung
Jede Berechnung kann deklarativ als eine Abfolge von Zustandsübergängen ausgedrückt werden. Als Beispiel eine Compiler optimieren Mit drei Optimierungspässen konnte als Beziehung zwischen einem ersten Programm und seiner optimierten Form implementiert werden:
Programm_Optimized(Prog0, Prog) :- optimization_pass_1(Prog0, Prog1), optimization_pass_2(Prog1, Prog2), optimization_pass_3(Prog2, Prog).
oder äquivalent verwenden DCG Notation:
Programm_Optimized -> optimization_pass_1, optimization_pass_2, optimization_pass_3.
Schnelle Sorte
Das schnelle Sorte Sortieren von Algorithmus, in Bezug auf eine Liste mit seiner sortierten Version:
Trennwand([], _, [],, []). Trennwand[X|Xs], Drehzahl, kleine, Größen) :- ( X @< Drehzahl -> kleine = [X|Sich ausruhen], Trennwand(Xs, Drehzahl, Sich ausruhen, Größen) ; Größen = [X|Sich ausruhen], Trennwand(Xs, Drehzahl, kleine, Sich ausruhen) ). schnelle Sorte([]) -> []. schnelle Sorte[X|Xs])) -> { Trennwand(Xs, X, Kleiner, Größer) }, schnelle Sorte(Kleiner), [X], schnelle Sorte(Größer).
Entwurfsmuster von Prolog
A Designmuster ist eine allgemeine wiederverwendbare Lösung für ein häufig vorkommendes Problem in Software-Design. Einige Designmuster im Prolog sind Skelette, Techniken,[20][21] Klischees,[22] Programmschemata,[23] Logik Beschreibung Schemata,[24] und Programmierung höherer Ordnung.[25]
Programmierung höherer Ordnung
Ein Prädikat höherer Ordnung ist ein Prädikat, das ein oder mehrere andere Prädikate als Argumente nimmt. Obwohl die Unterstützung für die Programmierung höherer Ordnung Prolog außerhalb der Domäne der Logik erster Ordnung nimmt, was keine Quantifizierung über Prädikate zulässt,[26] ISO Prolog hat jetzt einige Prädikate höherer Ordnung wie z. Anruf/1
, Rufen Sie/2
, Rufen Sie/3
, findall/3
, setof/3
, und Bagof/3
.[27] Da willkürliche Prologsziele zur Laufzeit konstruiert und bewertet werden können, ist es einfach, Prädikate höherer Ordnung zu schreiben wie MAPLISTE/2
, was ein willkürliches Prädikat auf jedes Mitglied einer bestimmten Liste anwendet, und Sublist/3
, welche Elemente filtern, die ein bestimmtes Prädikat erfüllen, und auch zulässt Currying.[25]
Um Lösungen aus der zeitlichen Darstellung (Antwortersatz für Backtracking) in die räumliche Darstellung (Begriffe) umzuwandeln, hat Prolog verschiedene All-Solutions-Prädikate, die alle Antwortsubstitutionen einer bestimmten Abfrage in einer Liste sammeln. Dies kann für verwendet werden Listenverständnis. Zum Beispiel, Perfekte Zahlen gleich die Summe ihrer richtigen Divisors:
perfekt(N) :- zwischen(1, Inf, N), U ist N // 2, finde alle(D, (zwischen(1,U,D), N Mod D =: = 0), Ds), Summe(Ds, N).
Dies kann verwendet werden, um perfekte Zahlen aufzuzählen und zu überprüfen, ob eine Zahl perfekt ist.
Als ein weiteres Beispiel das Prädikat Mapliste
wendet ein Prädikat an P
zu allen entsprechenden Positionen in einem Paar von Listen:
Mapliste(_, [],, []). Mapliste(P, [X|Xs], [Y|Ys])) :- Anruf(P, X, Y), Mapliste(P, Xs, Ys).
Wann P
ist ein Prädikat, das für alle X
, P (x, y)
sich vereint Y
mit einem einzigen einzigartigen Wert, MAPLISTE (P, XS, YS)
ist gleichbedeutend mit der Anwendung der Karte Funktion in Funktionelle Programmierung wie Ys = map (Funktion, xs)
.
Der Programmierstil höherer Ordnung im Prolog wurde Pionierarbeit in Hilog und λprolog.
Module
Zum Programmierung im großen, Prolog liefert a Modulsystem. Das Modulsystem ist durch ISO standardisiert.[28] Allerdings unterstützen nicht alle Prolog -Compiler Module, und es gibt Kompatibilitätsprobleme zwischen den Modulsystemen der Haupt -Prolog -Compiler.[29] Folglich werden Module, die auf einen Prolog -Compiler geschrieben wurden, nicht unbedingt an anderen arbeiten.
Parsing
Es gibt eine besondere Notation, die genannt wird bestimmte Klauselgrammatiken (DCGS). Eine Regel, die über definiert ist ->/2
Anstatt von :-/2
wird vom Präprozessor erweitert (expon_term/2
, eine Einrichtung, die in anderen Sprachen zu Makros analog ist) nach einigen einfachen Umschreibungsregeln, was zu gewöhnlichen Prolog -Klauseln führt. Vor allem das Umschreiben verwertet das Prädikat mit zwei zusätzlichen Argumenten, die verwendet werden können, um den Zustand implizit zu fädeln.[Klarstellung erforderlich] analog zu Monaden in anderen Sprachen. DCGs werden häufig zum Schreiben von Parsers oder Listengeneratoren verwendet, da sie auch eine bequeme Schnittstelle zu Differenzlisten bieten.
Meta-Interpretierer und Reflexion
Prolog ist a homoikonisch Sprache und bietet viele Einrichtungen für Betrachtung. Die implizite Ausführungsstrategie ermöglicht es, einen kurzen Schreiben zu schreiben Meta-kreisförmiger Bewerter (auch genannt Meta-Interpreter) Für einen reinen Prologcode:
lösen(Stimmt). lösen((Subgoal1,Subgoal2)) :- lösen(Subgoal1), lösen(Subgoal2). lösen(Kopf) :- Klausel(Kopf, Körper), lösen(Körper).
wo Stimmt
repräsentiert eine leere Konjunktion, und Klausel (Kopf, Körper)
vereinigt mit Klauseln in der Datenbank des Formulars Kopf:- Körper
.
Da Prolog -Programme selbst Sequenzen von Prologsbegriffen sind (:-/2
ist ein Infix Operator), die mit integrierten Mechanismen leicht gelesen und inspiziert werden können (wie Lesen/1
) Es ist möglich, maßgeschneiderte Dolmetscher zu schreiben, die Prolog mit domänenspezifischen Funktionen erweitern. Zum Beispiel präsentieren Sterling und Shapiro einen Meta-Interpreter, der hier mit Unsicherheiten argumentiert, die hier mit leichten Modifikationen reproduziert werden:[30]: 330
lösen(Stimmt, 1) :- ! lösen((Subgoal1,Subgoal2), Sicherheit) :- !, lösen(Subgoal1, Gewissheit1), lösen(Subgoal2, Gewissheit2), Sicherheit ist Mindest(Gewissheit1, Gewissheit2). lösen(Tor, 1) :- gebaut(Tor), !, Tor. lösen(Kopf, Sicherheit) :- Clause_cf(Kopf, Körper, Gewissheit1), lösen(Körper, Gewissheit2), Sicherheit ist Gewissheit1 * Gewissheit2.
Dieser Dolmetscher verwendet eine Tabelle mit integrierten Prolog-Prädikaten der Form[30]: 327
gebaut(A ist B). gebaut(lesen(X)). % etc.
und Klauseln dargestellt als Clause_cf (Kopf, Körper, Gewissheit)
. Angesichts dieser kann es als als genannt werden Lösen (Ziel, Sicherheit)
ausführen Tor
und erhalten Sie ein Maß für die Gewissheit über das Ergebnis.
Vollständigkeit
Reines Prolog basiert auf einer Teilmenge erster Ordnung erster Ordnung Prädikatlogik, Hornklauseln, welches ist Turing-Complete. Die Vollständigkeit des Prologs kann durch die Verwendung einer Turing -Maschine angezeigt werden:
Turing(Tape0, Band) :- ausführen(Q0, [],, Ls, Tape0, Rs), umkehren(Ls, LS1), anhängen(LS1, Rs, Band). ausführen(Qf, Ls, Ls, Rs, Rs) :- ! ausführen(Q0, LS0, Ls, Rs0, Rs) :- Symbol(Rs0, Sym, Rsrest), einmal(Regel(Q0, Sym, Q1, Nachrichten, Aktion)), Aktion(Aktion, LS0, LS1, [Nachrichten|Rsrest], RS1), ausführen(Q1, LS1, Ls, RS1, Rs). Symbol([], b, []). Symbol[Sym|Rs], Sym, Rs). Aktion(links, LS0, Ls, Rs0, Rs) :- links(LS0, Ls, Rs0, Rs). Aktion(bleibe, Ls, Ls, Rs, Rs). Aktion(Rechts, LS0, [Sym|LS0], [Sym|Rs], Rs). links([], [],, Rs0, [b|Rs0]). links[L|Ls], Ls, Rs, [L|Rs]).
Eine einfache Beispiel -Turing -Maschine wird durch die Fakten angegeben:
Regel(Q0, 1, Q0, 1, Rechts). Regel(Q0, b, Qf, 1, bleibe).
Diese Maschine führt eine Inkrementierung durch eine von einer Zahl in der Unarm -Codierung durch: Es schaltet sich über eine beliebige Anzahl von "1" -Zellen ab und findet am Ende zusätzliche "1" an. Beispielabfrage und Ergebnis:
?- Turing[1,1,1], Ts). Ts = [1, 1, 1, 1] ;
Dies zeigt, wie jede Berechnung als eine Abfolge von Zustandsübergängen deklarativ ausgedrückt werden kann, die im Prolog als Beziehung zwischen aufeinanderfolgenden Interessenszuständen implementiert werden.
Implementierung
ISO Prolog
Das ISO Der Prolog Standard besteht aus zwei Teilen. ISO/IEC 13211-1,[27][31] Das 1995 veröffentlichte Ziel, zielt darauf ab, die vorhandenen Praktiken der vielen Implementierungen der Kernelemente des Prologs zu standardisieren. Es hat Aspekte der Sprache geklärt, die zuvor mehrdeutig waren und zu tragbaren Programmen führen. Es gibt drei Corrigenda: Cor.1: 2007,[32] Kor.2: 2012,[33] und Kor.3: 2017.[34] ISO/IEC 13211-2,[27] Im Jahr 2000 veröffentlicht, fügt sie den Standard zu unterstützen. Der Standard wird von der aufrechterhalten ISO/IEC JTC1/SC22/Wg17[35] Arbeitsgruppe. ANSI X3J17 ist die US -amerikanische technische Beratungsgruppe für den Standard.[36]
Zusammenstellung
Für die Effizienz wird der Prologcode normalerweise mit dem abstrakten Maschinencode kompiliert, der häufig von der registrierungsbasierten Registrierung beeinflusst wird Warren abstrakte Maschine (WAM) Anweisungssatz.[37] Einige Implementierungen werden verwendet Abstrakte Interpretation Um Typ- und Modusinformationen von Prädikaten zur Kompilierung Zeit abzuleiten oder für hohe Leistung mit realem Maschinencode zu kompilieren.[38] Effiziente Implementierungsmethoden für den Prolog Code zu entwickeln, ist ein Bereich der aktiven Forschung in der Logikprogrammiergemeinschaft, und in einigen Implementierungen werden verschiedene andere Ausführungsmethoden verwendet. Dazu gehören Klauselbinarisierung und Stackbasierte virtuelle Maschinen.
Schwanzrekursion
Prologsysteme implementieren typischerweise eine bekannte Optimierungsmethode genannt Schwanzanrufoptimierung (TCO) für deterministische Prädikate, die ausgestellt werden Schwanzrekursion Oder allgemeiner Schwanzaufrufe: Der Stapelrahmen einer Klausel wird vor dem Ausführen eines Aufrufs in einer Schwanzposition verworfen. Daher werden deterministische schwanzrezisive Prädikate mit konstantem Stapelraum wie Schleifen in anderen Sprachen ausgeführt.
Termindexierung
Das Finden von Klauseln, die mit einem Begriff in einer Abfrage nicht ifierbar sind, ist linear in der Anzahl der Klauseln. Termindexierung verwendet a Datenstruktur das ermöglicht Sublineare Zeit Lookups.[39] Die Indexierung beeinflusst nur die Programmleistung, sondern wirkt sich nicht auf die Semantik aus. Die meisten Prologen verwenden nur die Indexierung für den ersten Term, da die Indexierung zu allen Begriffen teuer ist, aber Techniken basieren auf feldkodierte Wörter oder überlagert Codewörter Geben Sie die schnelle Indexierung über die gesamte Abfrage und den Kopf an.[40][41]
Hashing
Einige Prologsysteme wie z. Gewinnen-Prolog und Swi-Prolog implementieren jetzt Hashing, um große Datensätze effizienter zu verarbeiten. Dies führt dazu, dass bei der Arbeit mit großen Korpora wie sehr große Leistungsgewinne wie z. Wordnet.
Tabling
Einige Prologsysteme, (B-Prolog, Xsb, Swi-Prolog, KLÄFFEN, und Ciao), implementieren a Memoisierung Methode aufgerufen Tabling, was den Benutzer von der manuellen Speicherung von Zwischenergebnissen befreit. Tabling ist a Weltraum -Zeit -Kompromiss; Die Ausführungszeit kann reduziert werden, indem mehr Speicher verwendet wird, um Zwischenergebnisse zu speichern:[42][43]
Die in einer Abfragebewertung aufgetretenen Subgosse werden in einer Tabelle zusammen mit den Antworten auf diese Unterteile aufrechterhalten. Wenn eine Subzogin erneut erzielt wird, gibt die Bewertung Informationen aus der Tabelle wieder aus, anstatt die Auflösung gegen Programmklauseln erneut zu bearbeiten.[44]
Die Tabellen können in verschiedene Richtungen verlängert werden. Es kann rekursive Prädikate durch SLG-Auflösung oder lineare Tabling unterstützen. In einem Multi-Thread-Prolog-System-Tabling können die Ergebnisse in einem Thread privat gehalten oder unter allen Threads geteilt werden. Und bei inkrementellen Einstellungen kann die Einstellung auf Veränderungen reagieren.
Implementierung in Hardware
Während der Computersystemprojekte der fünften GenerationEs gab Versuche, Prolog in Hardware zu implementieren, um eine schnellere Ausführung mit speziellen Architekturen zu erreichen.[45][46][47] Darüber hinaus verfügt Prolog über eine Reihe von Eigenschaften, die eine Geschwindigkeit durch parallele Ausführung ermöglichen.[48] Ein neuerer Ansatz bestand darin, eingeschränkte Prolog -Programme zu a zu erstellen Feldprogrammierbares Gate -Array.[49] Der schnelle Fortschritt in der allgemeinen Hardware hat jedoch konsequent spezialisierte Architekturen überholt.
Sega Implementierter Prolog für die Verwendung mit dem SEGA AI -Computer, der 1986 für den japanischen Markt veröffentlicht wurde. Prolog wurde zum Lesen verwendet Natürliche Sprache Eingänge in der japanische Spracheüber ein Touchpad.[50]
Einschränkungen
Obwohl Prolog in Forschung und Bildung weit verbreitet ist, hatten Prolog und andere Logikprogrammiersprachen im Allgemeinen keinen wesentlichen Einfluss auf die Computerindustrie.[51] Die meisten Anwendungen sind nach industriellen Maßstäben gering, wobei nur wenige Codezeilen mehr als 100.000 Zeilen.[51][52] Programmierung im großen wird als kompliziert angesehen, da nicht alle Prolog -Compiler Module unterstützen, und es gibt Kompatibilitätsprobleme zwischen den Modulsystemen der Haupt -Prolog -Compiler.[29] Die Portabilität des Prologscodes über die Implementierung hinweg war ebenfalls ein Problem, aber die Entwicklungen seit 2007 haben dazu geführt: "Die Portabilität in der Familie von Edinburgh/Quintus abgeleitete Prolog-Implementierungen ist gut genug, um die Aufrechterhaltung tragbarer realer Anwendungen zu ermöglichen."[53]
In Prolog entwickelte Software wurde im Vergleich zu herkömmlichen Programmiersprachen wegen einer hohen Leistungsstrafe kritisiert. Insbesondere kann die nicht deterministische Bewertungsstrategie von Prolog bei der Programmierung deterministischer Berechnungen oder bei der Verwendung von "Nicht-Determinismus nicht" (wobei eine einzige Wahl getroffen wird, anstatt alle Möglichkeiten zurückzukehren). Schnitte und andere Sprachkonstrukte müssen möglicherweise verwendet werden, um eine wünschenswerte Leistung zu erzielen und eine der Hauptattraktionen des Prologs zu zerstören, die Fähigkeit, Programme "rückwärts und nach vorne" auszuführen.[54]
Prolog ist nicht rein deklarativ: aufgrund von Konstrukten wie der Operator geschnittenEs ist eine prozedurale Lektüre eines Prolog -Programms erforderlich, um es zu verstehen.[55] Die Reihenfolge der Klauseln in einem Prolog -Programm ist erheblich, da die Ausführungsstrategie der Sprache davon abhängt.[56] Andere logische Programmiersprachen, wie z. Datenprotokoll, sind wirklich deklarativ, aber die Sprache einschränken. Infolgedessen werden viele praktische Prolog -Programme geschrieben, um den Prologs zu entsprechen Tiefe-First-Suche Reihenfolge eher als rein deklarative Logikprogramme.[54]
Erweiterungen
Aus Prolog wurden verschiedene Implementierungen entwickelt, um die Logikprogrammierfunktionen in zahlreiche Richtungen zu erweitern. Diese beinhalten Typen, Modi, Einschränkung der Logikprogrammierung (CLP), objektorientierte logische Programmierung (OOLP), Parallelität, lineare Logik (LLP), funktional und Logik höherer Ordnung Programmierfunktionen sowie Interoperabilität mit Wissensbasis:
Typen
Prolog ist eine unglaubliche Sprache. Versuche, die Typen einzuführen, stammen aus den 1980er Jahren.[57][58] Und ab 2008 gibt es immer noch Versuche, Prolog mit Typen zu erweitern.[59] Typinformationen sind nicht nur für nützlich für Geben Sie Sicherheit ein aber auch für Argumentation über Prolog -Programme.[60]
Modi
Modusspezifizierer | Deutung |
---|---|
+ | Nicht -Var Beim Eintritt |
- | var Beim Eintritt |
? | Unbestimmt |
Die Syntax von Prolog gibt nicht an, welche Argumente eines Prädikats Eingänge sind und welche Ausgaben.[61] Diese Informationen sind jedoch erheblich und es wird empfohlen, in die Kommentare aufgenommen zu werden.[62] Modi liefern wertvolle Informationen, wenn Sie zu Prolog -Programmen denken[60] und kann auch verwendet werden, um die Ausführung zu beschleunigen.[63]
Einschränkungen
Einschränkung der Logikprogrammierung erweitert Prolog um Konzepte aus Einschränkung Zufriedenheit.[64][65] Ein Einschränkungslogikprogramm ermöglicht Einschränkungen im Körper von Klauseln wie: A (x, y):- x+y> 0.
Es eignet sich für groß an Kombinatorische Optimierung Probleme[66] und ist somit nützlich für Anwendungen in industriellen Umgebungen, wie z. B. automatisierte Zeittabelle und Produktionsplanung. Die meisten Prolog -Systeme werden mit mindestens einem Einschränkungslöser für endliche Bereiche und häufig auch mit Löser für andere Domänen wie rationale Zahlen geliefert.
Objektorientierung
Flora-2 ist ein objektorientiertes Wissensdarstellungs- und Argumentationssystem basierend auf F-Logic und eingebaut Hilog, Transaktionslogik, und Überlegungsfähige Argumentation.
Logtalk ist eine objektorientierte logische Programmiersprache, die die meisten Prolog-Implementierungen als Back-End-Compiler verwenden kann. Als Multi-Paradigm-Sprache beinhaltet es die Unterstützung sowohl für Prototypen als auch für Klassen.
Othog ist eine kleine, tragbare, objektorientierte Erweiterung des Prologs von Margaret McDougall von EDCAAD, Universität von Edinburgh.
Objlog war eine rahmenbasierte Sprache, die Objekte und Prolog II aus CNRs, Marseille, Frankreich, kombinierte.
Prolog ++ wurde entwickelt von Logikprogrammierverbände und erstmals 1989 für MS-DOS-PCs veröffentlicht. Die Unterstützung für andere Plattformen wurde hinzugefügt, und 1995 wurde eine zweite Version veröffentlicht. 1994 wurde ein Buch über Prolog ++ von Chris Moss veröffentlicht. 1994 wurde von Addison-Wesley veröffentlicht.
Visueller Prolog ist eine Multi-Paradigm-Sprache mit Schnittstellen, Klassen, Implementierungen und Objektausdrücken.
Grafik
Prologsysteme, die a liefern Grafikbibliothek sind Swi-Prolog,[67] Visueller Prolog, Gewinnen-Prolog, und B-Prolog.
Parallelität
Prolog-MPI ist eine Open-Source Swi-Prolog Erweiterung für verteiltes Computer über die Schnittstelle zur Nachrichtenübergabe.[68] Außerdem gibt es verschiedene gleichzeitige Prolog -Programmiersprachen.[69]
Web Programmierung
Einige Prolog -Implementierungen, insbesondere Visueller Prolog, Swi-Prolog und Ciao, Unterstützung Server-Seite Web Programmierung Mit Unterstützung für Webprotokolle, Html und Xml.[70] Es gibt auch Erweiterungen zu unterstützen Semantisches Web Formate wie RDF und EULE.[71][72] Prolog wurde auch als vorgeschlagen Client-Seite Sprache.[73] Zusätzlich unterstützt visuelle Prolog unterstützt JSON-RPC und Websockets.
Adobe Flash
Zeder ist ein freier und grundlegender Prolog -Dolmetscher. Aus Version 4 und über Cedar verfügt Cedar über eine FCA -Unterstützung (Flash Cedar App). Dies bietet eine neue Plattform für das Programmieren im Prolog durch Aktionen.
Sonstiges
- F-Logic erweitert Prolog mit Frames/Objekten für Wissensrepräsentation.
- Transaktionslogik Erweitert das Prolog mit einer logischen Theorie staatlicher Aktualisierungsbetreiber. Es hat sowohl eine modelltheoretische als auch prozedurale Semantik.
- OW Prolog wurde erstellt, um Prologs mangelnde Grafik und Schnittstelle zu beantworten.
Schnittstellen zu anderen Sprachen
Es gibt Frameworks, die zwischen Prolog und anderen Sprachen überbrücken können:
- Das LPA Intelligence Server erlaubt das Einbetten von LPA -Prolog für Windows Innerhalb von C, C#, C ++, Java, VB, Delphi, .NET, Lua, Python und anderen Sprachen. Es nutzt den dedizierten String-Datentyp, den LPA-Prolog bietet
- Die Logic Server -API ermöglicht sowohl die Erweiterung als auch die Einbettung von Prolog in C, C ++, Java, VB, Delphi, .NET und jede Sprache/Umgebung, die eine .dll oder .so aufrufen kann. Es ist für Amzi implementiert! Prolog Amzi! Prolog + Logikserver Die API -Spezifikation kann jedoch für jede Implementierung zur Verfügung gestellt werden.
- Jpl ist eine bidirektionale Java-Prolog-Brücke, die standardmäßig mit Swi-Prolog versandt und es Java und Prolog ermöglicht, sich (rekursiv) gegenseitig anzurufen. Es ist bekannt, dass es eine gute Unterstützung bei der Parallelität hat und aktiv entwickelt wird.
- Interprolog, eine Programmierbibliotheksbrücke zwischen Java und Prolog, implementieren bidirektionales Prädikat/Methode zwischen beiden Sprachen. Java -Objekte können in Prolog -Begriffe zugeordnet werden und umgekehrt. Erlaubt die Entwicklung von GUIS und andere Funktionen in Java während der Logikverarbeitung in der Prologschicht. Unterstützung Xsbmit Unterstützung für Swi-Prolog und KLÄFFEN Geplant für 2013.
- Prova Bietet native Syntax -Integration mit Java-, Agent -Messaging- und Reaktionsregeln. Prova positioniert sich als regelbasiertes Skriptsystem (RBS) für Middleware. Die Sprache bricht bei der Kombination neuer Boden Imperativ und deklarative Programmierung.
- Lol Ein einbettbarer Prolog -Motor für Java. Es enthält eine kleine IDE und einige Bibliotheken.
- Gnu Prolog für Java ist eine Implementierung von ISO Prolog als Java -Bibliothek (GNU.PROG)
- Ciao Bietet Schnittstellen zu C, C ++, Java und relationalen Datenbanken.
- C#-PROG ist ein Prolog -Dolmetscher (verwaltet) c#. Kann leicht in C# -Programme integriert werden. Merkmale: Zuverlässiger und ziemlich schneller Interpreter, Befehlszeilenschnittstelle, Windows-Schnittface, integriertes DCG, XML-Vorbereitungen, SQL-Vorbereitungen, extendierbar. Der vollständige Quellcode ist verfügbar, einschließlich eines Parser -Generators, der zum Hinzufügen von Spezialverlängerungen verwendet werden kann.
- Eine Warren abstrakte Maschine für PHP Ein Prolog -Compiler und Dolmetscher in PHP 5.3. Eine Bibliothek, die eigenständig oder innerhalb des Symfony2.1 -Frameworks verwendet werden kann, das übersetzt wurde Stephan Buettcher's Arbeiten in Java, die gefunden werden kann [hier Stefan
.buettcher .org /cs /wam /Index .html] - Tuprolog ist ein leichtes Prolog-System für verteilte Anwendungen und Infrastrukturen, die absichtlich um einen minimalen Kern entwickelt wurden und durch Laden/Entladen von Bibliotheken von Prädikaten statisch oder dynamisch konfiguriert werden sollen. Tuprolog unterstützt multi-paradigm-Programme nativ und bietet ein sauberes, nahtloses Integrationsmodell zwischen Prolog und Mainstream-objektorientierten Sprachen-nämlich Java für die Tuprolog-Java-Version und jede .NET-basierte Sprache (C#, F#..) für Tuprolog. Netzversion.[74]
Geschichte
Der Name Prolog wurde von Philippe Roussel als Abkürzung für ausgewählt programmation en logique (Französisch zum Programmierung in Logik). Es wurde um 1972 von 1972 geschaffen Alain Colmerauer mit Philippe Roussel, basierend auf Robert Kowalski's prozedurale Interpretation von Hornklauseln. Es war teilweise durch den Wunsch motiviert, die Verwendung von Logik als deklarative Sprache der Wissensrepräsentation mit der prozeduralen Repräsentation des Wissens in Nordamerika in den späten 1960er und frühen 1970er Jahren in Einklang zu bringen. Entsprechend Robert KowalskiDas erste Prolog -System wurde 1972 von Colmerauer und Phillipe Roussel entwickelt.[5] Die erste Implementierung von Prolog war ein Dolmetscher von Gerard Battani und Henri Meloni. David H. D. Warren nahm diesen Dolmetscher zu Universität von Edinburghund dort ein alternatives Front-End implementiert, das die Syntax „Edinburgh Prolog“ definierte, die von den meisten modernen Implementierungen verwendet wurde. Warren implementierte auch den ersten Compiler für Prolog und schuf den einflussreichen DEC-10-Prolog in Zusammenarbeit mit Fernando Pereira. Warren verallgemeinert später die Ideen hinter dem DEC-10-Prolog, um die zu erstellen Warren abstrakte Maschine.
Europäische KI -Forscher bevorzugten Prolog, während die Amerikaner bevorzugten LispelnBerichten zufolge viele nationalistische Debatten über die Vorzüge der Sprachen.[75] Ein Großteil der modernen Entwicklung des Prologs kam aus dem Impuls der Computersystemprojekte der fünften Generation (FGCS), das eine Variante des Prologs namens entwickelte Kernelsprache für seine erste Betriebssystem.
Reiner Prolog wurde ursprünglich auf die Verwendung von a beschränkt Auflösung Theorem Prover mit Hornklauseln of the form:
H:- b1, ..., Bn.
Die Anwendung der Theorem-Prover behandelt Klauseln wie Verfahren:
um H zu zeigen/zu lösen, zeigen/lösen B1 und ... und bn.
Pure Prolog wurde jedoch bald erweitert, um einzuschließen Negation als Misserfolg, in welchen negativen Bedingungen der Form nicht (b)i) werden gezeigt, indem die entsprechenden positiven Bedingungen b versuchen und nicht gelöst werden können Bi.
Nachfolgende Extensionen des Prologs durch das ursprüngliche Team eingeführt Einschränkung der Logikprogrammierung Fähigkeiten in die Implementierungen.
Verwendung in der Industrie
Prolog wurde in verwendet Watson. Watson verwendet die DeepQA -Software von IBM und den Apache Uima (Unstrukturierte Informationsmanagementarchitektur) Framework. Das System wurde in verschiedenen Sprachen geschrieben, einschließlich Java, C ++ und Prolog, und läuft auf dem SUSE Linux Enterprise Server 11 Betriebssystem verwendet Apache Hadoop Framework zur Bereitstellung von verteiltem Computer. Prolog wird für verwendet Musteranpassung über natürliche Sprache analysieren Bäume. Die Entwickler haben erklärt: "Wir haben eine Sprache benötigt, in der wir bequeme Muster -Matching -Regeln für die Parse -Bäume und andere Anmerkungen (z. war die ideale Wahl für die Sprache aufgrund ihrer Einfachheit und Ausdruckskraft. "[15] Prolog wird in der Plattform mit niedriger Codeentwicklung verwendet Genexus, was sich auf KI konzentriert.[76] Open Source Grafikdatenbank Terminusdb wird in Prolog implementiert.[77] TerminusDB ist für das gemeinsame Aufbau und die Kuratierung konzipiert Wissensgrafiken.
Siehe auch
- Vergleich der Prolog -Implementierungen
- Logico-linguistische Modellierung. Eine Methode zum Aufbau von wissensbasiertem System, das Prolog verwendet.
- Antwort -Set -Programmierung. Ein vollständig deklarativer Ansatz für die logische Programmierung.
- Assoziation für die Logikprogrammierung
Verwandte Sprachen
- Das Gödel Sprache ist eine stark typisierte Implementierung von Gleichzeitige Einschränkung der Logikprogrammierung. Es basiert auf Sicstus Prolog.
- Visueller Prolog, früher bekannt als PDC Prolog und Turbo Prolog, ist a stark tippt objektorientierter Prolog -Dialekt, der sich stark vom Standard -Prolog unterscheidet. Als Turbo -Prolog wurde es von Borland vermarktet, wird aber jetzt vom dänischen Unternehmen PDC (Prolog Development Center) entwickelt und vermarktet, das es ursprünglich produziert hat.
- Datenprotokoll ist eine Untergruppe von Prolog. Es beschränkt sich auf Beziehungen, die geschichtet werden können und keine zusammengesetzten Begriffe zulässt. Im Gegensatz zu Prolog ist Datalog nicht Turing-Complete.
- Quecksilber ist ein Ableger des Prologs, das im Großen mit einem statischen, polymorphen System sowie einem Modus- und Determinismus -System auf Software -Engineering ausgerichtet ist.
- GraphTalk ist eine proprietäre Implementierung der abstrakten Maschine von Warren mit zusätzlichen objektorientierten Eigenschaften.
- In mancher Hinsicht[die?] Prolog ist eine Teilmenge von Planer. Die Ideen im Planer wurden später weiterentwickelt in der Wissenschaftliche Gemeinschaftsmetapher.
- Agentenspeak ist eine Variante von Prolog für das Verhalten des Programmieragents in Multi-Agent-Systeme.
- Erlang begann das Leben mit einer prologbasierten Implementierung und behält einen Großteil der Vereinigung von Prolog bei.
- Pilog ist eine deklarative Sprache, die auf der Spitze aufgebaut ist PicolispDas hat die Semantik des Prologs, verwendet aber die Syntax von Lisp.
Verweise
- ^ Clocksin, William F.; Mellish, Christopher S. (2003). Programmierung im Prolog. Berlin; New York: Springer-Verlag. ISBN 978-3-540-00678-7.
- ^ Bratko, Ivan (2012). Prolog -Programmierung für künstliche Intelligenz (4. Aufl.). Harlow, England; New York: Addison Wesley. ISBN 978-0-321-41746-6.
- ^ Covington, Michael A. (1994). Verarbeitung natürlicher Sprache für Prolog -Programmierer. Englewood Cliffs, N.J.: Prentice Hall. ISBN 978-0-13-629213-5.
- ^ a b Lloyd, J. W. (1984). Grundlagen der logischen Programmierung. Berlin: Springer-Verlag. ISBN 978-3-540-13299-8.
- ^ a b Kowalski, R. A. (1988). "Die frühen Jahre der logischen Programmierung" (PDF). Kommunikation der ACM. 31: 38. doi:10.1145/35043.35046. S2CID 12259230.
- ^ Colmerauer, a.; Roussel, P. (1993). "Die Geburt des Prologs" (PDF). ACM Sigplan nennt. 28 (3): 37. doi:10.1145/155360.155362.
- ^ "Prolog: Eine kurze Geschichte". Abgerufen 21. November 2021.
- ^ Sehen Logikprogrammierung § Verlauf.
- ^ Stickel, M. E. (1988). "Ein Prolog Technology Theorem Prover: Implementierung durch einen erweiterten Prolog -Compiler". Journal of Authoricated Argumenting. 4 (4): 353–380. Citeseerx 10.1.1.47.3057. doi:10.1007/bf00297245. S2CID 14621218.
- ^ Merritt, Dennis (1989). Bauen von Expertensystemen im Prolog. Berlin: Springer-Verlag. ISBN 978-0-387-97016-5.
- ^ Filty, Amy. "Ein logischer Programmieransatz zur Implementierung höherer Ordnung umschreibt." Erweiterungen der Logikprogrammierung (1992): 135-161.
- ^ Kent D. Lee (19. Januar 2015). Grundlagen von Programmiersprachen. Springer. S. 298–. ISBN 978-3-319-13314-0.
- ^ Ute Schmid (21. August 2003). Induktive Synthese von Funktionsprogrammen: Universelle Planung, Faltung endlicher Programme und Schema -Abstraktion durch analoges Denken. Springer Science & Business Media. ISBN 978-3-540-40174-2.
- ^ Fernando C. N. Pereira; Stuart M. Shieber (2005). Analyse Prolog und natürliche Sprache. Mikrotom.
- ^ a b Adam Lally; Paul Fodor (31. März 2011). "Natürliche Sprachverarbeitung mit Prolog im IBM Watson -System". Assoziation für Logikprogrammierung. Siehe auch Watson (Computer).
- ^ ISO/IEC 13211-1: 1995 Prolog, 6.3.7 Begriffe - doppelte Zitatlistennotation. Internationale Standardisierungsorganisation, Genf.
- ^ "Überprüfen Sie die Art eines Begriffs - Swi -Prolog".
- ^ Carlsson, Mats (27. Mai 2014). SICSTUS PROLOGER -Benutzerhandbuch 4.3: Kernreferenzdokumentation. BSB - Bücher auf Anfrage. ISBN 9783735737441 - über Google Books.
- ^ Covington, Michael A.; Bagnara, Roberto; O'Keefe, Richard A.; Wielemaker, Jan; Preis, Simon (2011). "Codierungsrichtlinien für Prolog". Theorie und Praxis der Logikprogrammierung. 12 (6): 889–927. Arxiv:0911.2899. doi:10.1017/s1471068411000391. S2CID 438363.
- ^ Kirschenbaum, M.; Sterling, L.S. (1993). "Anwenden von Techniken auf Skelette". Konstruktionslogikprogramme, (Hrsg. J.M. J. Jacquet): 27–140. Citeseerx 10.1.1.56.7278.
- ^ Sterling, Leon (2002). "Muster für die Prolog -Programmierung". Computerlogik: Logikprogrammierung und darüber hinaus. Vorlesungen in Informatik- / Vorlesungsnotizen in künstlicher Intelligenz. Vol. 2407. S. 17–26. doi:10.1007/3-540-45628-7_15. ISBN 978-3-540-43959-2.
- ^ D. Barker-Plummer. Klischeeprogrammierung im Prolog. In M. Bruynooghe, Herausgeber, Proc. Zweiter Workshop zur Metaprogrammierung in Logik, Seiten 247--256. Abteilung von Comp. Sci., Kathholieke Univ. Leuven, 1990.
- ^ Gegg-Harrison, T. S. (1995). Darstellung der Logikprogrammschemata im Prolog. Procs Twelfth International Conference on Logic Programing. S. 467–481.
- ^ Deville, Yves (1990). Logikprogrammierung: Systematische Programmentwicklung. Wokingham, England: Addison-Wesley. ISBN 978-0-201-17576-9.
- ^ a b Naish, Lee (1996). Logische Programmierung höherer Ordnung im Prolog (Bericht). Abteilung für Informatik, Universität von Melbourne. Citeseerx 10.1.1.35.4505.
- ^ "In Bezug auf Prolog -Variablen sind Variablen nur im Kopf implizit universell quantifiziert, und die nur im Körper sind implizit existenziell quantifiziert.". Abgerufen 2013-05-04.
- ^ a b c ISO/IEC 13211: Informationstechnologie - Programmiersprachen - Prolog. Internationale Standardisierungsorganisation, Genf.
- ^ ISO/IEC 13211-2: Module.
- ^ a b Moura, Paulo (August 2004), "LogTalk", Assoziation der Logikprogrammierung, 17 (3)
- ^ a b Shapiro, ehud y.; Sterling, Leon (1994). Die Kunst des Prologs: Fortgeschrittene Programmierungstechniken. Cambridge, Massachusetts: MIT Press. ISBN 978-0-262-19338-2.
- ^ A. ed-dbali; Deransart, Pierre; L. Cervoni (1996). Prolog: Der Standard: Referenzhandbuch. Berlin: Springer. ISBN 978-3-540-59304-1.
- ^ "ISO/IEC 13211-1: 1995/cor 1: 2007 -".
- ^ "ISO/IEC 13211-1: 1995/cor 2: 2012 -".
- ^ "ISO/IEC 13211-1: 1995/cor 3: 2017 -".
- ^ "ISO/IEC JTC1 SC22 WG17".[Permanent Dead Link]
- ^ "X3J17 und der Prolog Standard". Archiviert von das Original am 2009-08-23. Abgerufen 2009-10-02.
- ^ David H. D. Warren. "Ein abstrakter Prolog -Befehlssatz". Technischer Hinweis 309, SRI International, Menlo Park, CA, Oktober 1983.
- ^ Van Roy, P.; Despain, A. M. (1992). "Hochleistungs-Logikprogrammierung mit dem Wassermann Prolog Compiler". Computer. 25: 54–68. doi:10.1109/2.108055. S2CID 16447071.
- ^ Graf, Peter (1995). Termindexierung. Springer. ISBN 978-3-540-61040-3.
- ^ Wise, Michael J.; Powers, David M. W. (1986). Indexierung von Prolog -Klauseln über überlagerte Codewörter und Feldcodierte Wörter. Internationales Symposium für Logikprogramme. S. 203–210.
- ^ Colomb, Robert M. (1991). "Verbesserung der Vereinigung im Prolog durch Klausel -Indexierung". Das Journal of Logic Programming. 10: 23–44. doi:10.1016/0743-1066 (91) 90004-9.
- ^ Swift, T. (1999). "Tabling für nichtmonotonische Programmierung". Annalen der Mathematik und künstliche Intelligenz. 25 (3/4): 201–240. doi:10.1023/a: 1018990308362. S2CID 16695800.
- ^ Zhou, Neng-Fa; Sato, Taisuke (2003). "Effiziente Fixpoint -Berechnung in linearen Tabellen" (PDF). Verfahren der 5. ACM Sigplan Internationalen Konferenz über Grundsätze und Praxis der deklarativen Programmierung: 275–283.
- ^ Swift, T.; Warren, D. S. (2011). "XSB: Prolog mit erstellter Logikprogrammierung erweitern". Theorie und Praxis der Logikprogrammierung. 12 (1–2): 157–187. Arxiv:1012.5123. doi:10.1017/s1471068411000500. S2CID 6153112.
- ^ Abe, S.; Bandoh, T.; Yamaguchi, S.; Kurosawa, K.; Kiriyama, K. (1987). "Hochleistungs integrierter Prolog -Prozessor IPP". Proceedings des 14. jährlichen internationalen Symposiums über Computerarchitektur - ISCA '87. p. 100. doi:10.1145/30350.30362. ISBN 978-0818607769. S2CID 10283148.
- ^ Robinson, Ian (1986). Ein Prolog -Prozessor basierend auf einem Muster -Matching -Speichergerät. Dritte internationale Konferenz für Logikprogramme. Vorlesungsnotizen in Informatik. Vol. 225. Springer. S. 172–179. doi:10.1007/3-540-16492-8_73. ISBN 978-3-540-16492-0.
- ^ Taki, K.; Nakajima, K.; Nakashima, H.; Ikeda, M. (1987). "Leistung und architektonische Bewertung der PSI -Maschine". ACM Sigplan nennt. 22 (10): 128. doi:10.1145/36205.36195.
- ^ Gupta, G.; Pontelli, E.; Ali, K. A. M.; Carlsson, M.; Hermenegildo, M. V. (2001). "Parallele Ausführung von Prolog -Programmen: Eine Umfrage". ACM -Transaktionen zu Programmiersprachen und Systemen. 23 (4): 472. doi:10.1145/504083.504085. S2CID 2978041.
- ^ "Statisch zugewiesene Systeme".
- ^ "Software, die Spiele ernst nimmt". Neuer Wissenschaftler. Reed -Geschäftsinformationen. 26. März 1987. p. 34 - via Google Bücher.
{{}}
: CS1 Wartung: URL-Status (Link) - ^ a b Logische Programmierung für die reale Welt. Zoltan Somogyi, Fergus Henderson, Thomas Conway, Richard O'Keefe. Verfahren des ILPS'95 -Postkonferenz -Workshops über Visionen für die Zukunft der logischen Programmierung.
- ^ "FAQ: Prolog Resource Guide 1/2 [monatliches Posting] Abschnitt - [1-8] Die Prolog 1000 -Datenbank".
- ^ Jan Wielemaker und Vıtor Santos Costa: Portabilität von Prolog-Programmen: Theorie und Fallstudien. Ciclops-wlpe Workshop 2010.
- ^ a b Kiselyov, Oleg; Kameyama, Yukiyoshi (2014). Prolog neu denken. Proc. 31. Treffen der Japan Society for Software Science and Technology.
- ^ Franzen, Torkel (1994), "Deklarativ vs prozedural", Assoziation der Logikprogrammierung, 7 (3)
- ^ Dantsin, Evgeny; Eiter, Thomas; Gottlob, Georg; Voronkov, Andrei (2001). "Komplexität und ausdrucksstarke Kraft der logischen Programmierung". ACM Computing -Umfragen. 33 (3): 374–425. Citeseerx 10.1.1.616.6372. doi:10.1145/502807.502810. S2CID 518049.
- ^ Mycroft, a.; O'Keefe, R. A. (1984). "Ein polymorphes Typsystem für Prolog". Künstliche Intelligenz. 23 (3): 295. doi:10.1016/0004-3702 (84) 90017-1.
- ^ Pfenning, Frank (1992). Typen in der Logikprogrammierung. Cambridge, Massachusetts: MIT Press. ISBN 978-0-262-16131-2.
- ^ Schrijvers, Tom; Santos Costa, Vitor; Wielemaker, Jan; Demoen, Bart (2008). "In Richtung Typed Prolog". In Maria Garcia de la Banda; Enrico Pontelli (Hrsg.). Logikprogrammierung: 24. Internationale Konferenz, ICLP 2008, Udine, Italien, 9. bis 13. Dezember 2008: Proceedings. Vorlesungsnotizen in Informatik. Vol. 5366. S. 693–697. doi:10.1007/978-3-540-89982-2_59. ISBN 9783540899822.
- ^ a b Apt, K. R.; Marchiori, E. (1994). "Argumentation über Prolog -Programme: Von Modi über Typen bis hin zu Behauptungen". Formale Aspekte des Computers. 6 (S1): 743. Citeseerx 10.1.1.57.395. doi:10.1007/bf01213601. S2CID 12235465.
- ^ O'Keefe, Richard A. (1990). Das Handwerk des Prologs. Cambridge, Massachusetts: MIT Press. ISBN 978-0-262-15039-2.
- ^ Michael Covington; Roberto Bagnara; et al. (2010). "Codierungsrichtlinien für Prolog". Arxiv:0911.2899 [cs.pl].
- ^ Roy, P.; Demoen, b.; Willems, Y. D. (1987). "Verbesserung der Ausführungsgeschwindigkeit von kompiliertem Prolog mit Modi, Klauselauswahl und Determinismus". Tapsoft '87. Vorlesungsnotizen in Informatik. Vol. 250. pp.111. doi:10.1007/bfb0014976. ISBN 978-3-540-17611-4.
- ^ Jaffar, J. (1994). "Einschränkungslogikprogrammierung: Eine Umfrage". Das Journal of Logic Programming. 19–20: 503–581. doi:10.1016/0743-1066 (94) 90033-7.
- ^ Colmerauer, Alain (1987). "Öffnen des Prolog III -Universums". Byte. August.
- ^ Wallace, M. (2002). "Einschränkungslogikprogrammierung". Computerlogik: Logikprogrammierung und darüber hinaus. Vorlesungsnotizen in Informatik. Vol. 2407. S. 512–556. doi:10.1007/3-540-45628-7_19. ISBN 978-3540456285.
- ^ "XPCE Graphics Library".
- ^ "Prolog-MPI". Apps.lumii.lv. Abgerufen 2010-09-16.
- ^ Ehud Shapiro. Die Familie der gleichzeitigen logischen Programmiersprachen ACM Computing -Umfragen. September 1989.
- ^ Wielemaker, J.; Huang, Z.; Van der Meij, L. (2008). "Swi-Prolog und das Web" (PDF). Theorie und Praxis der Logikprogrammierung. 8 (3): 363. doi:10.1017/s1471068407003237. S2CID 5404048.
- ^ Jan Wielemaker und Michiel Hildebrand und Jacco Van Ossenbruggen (2007), S. Heymans; A. Pollen; E. Ruckhaus; D. Pearse; G. Gupta (Hrsg.), "Verwenden Sie {Prolog} als Grundlage für Anwendungen im semantischen Web" (PDF), Proceedings des 2. Workshops über Anwendungen der Logikprogrammierung und zum Web-, semantischen Web- und semantischen Webdiensten, CEUR Workshop Proceedings, Porto, Portugal: CEUR-Ws.org, Vol. 287, S. 84–98
- ^ Verarbeitung von OWL2 -Ontologien mit Thea: eine Anwendung der Logikprogrammierung. Vangelis Vassiliadis, Jan Wielemaker und Chris Mungall. Proceedings of the 5. International Workshop über OWL: Erfahrungen und Richtungen (geschuldet 2009), Chantilly, VA, USA, 23. bis 24. Oktober 2009
- ^ Loke, S. W.; Davison, A. (2001). "Sicherer prologbasierter mobiler Code". Theorie und Praxis der Logikprogrammierung. 1 (3): 321. Arxiv:CS/0406012. Citeseerx 10.1.1.58.6610. doi:10.1017/s1471068401001211. S2CID 11754347.
- ^ "Archivierte Kopie". Archiviert von das Original Am 2019-03-17. Abgerufen 2019-06-08.
{{}}
: CS1 Wartung: Archiviertes Kopie als Titel (Link) - ^ Pountain, Dick (Oktober 1984). "Pop und Snap". BYTE. p. 381. Abgerufen 23. Oktober 2013.
- ^ "Wikipedia genexus Seite".
- ^ terminusdb/terminusdb, Terminusdb, 2020-12-13, abgerufen 2020-12-15
Weitere Lektüre
- Blackburn, Patrick; Bos, Johan; Striegz, Kristina (2006). Lerne jetzt Prolog!. ISBN 978-1-904987-17-8.
- Ivan Bratko, Prolog -Programmierung für künstliche Intelligenz, 4. Aufl., 2012, ISBN978-0-321-41746-6. Buchpräparate und Quellcode[Permanent Dead Link]
- William F. Clocksin, Christopher S. Mellish: Programmierung im Prolog: Verwendung des ISO -Standards. Springer, 5. Aufl., 2003, ISBN978-3-540-00678-7. (Diese Ausgabe ist für ISO Prolog aktualisiert. Frühere Ausgaben beschrieben Edinburgh Prolog.)
- William F. Clocksin: Klausel und Wirkung. Prolog -Programmierung für den Arbeitsprogrammierer. Springer, 2003, ISBN978-3-540-62971-9.
- Michael A. Covington, Donald Nute, Andre Vellino, Prolog -Programmierung ausführlich, 1996, ISBN0-13-138645-x.
- Michael A. Covington, Verarbeitung natürlicher Sprache für Prolog -Programmierer, 1994, ISBN978-0-13-629213-5
- M. S. Dawe und C.M.Dawe, Prolog für Computerwissenschaften, Springer Verlag 1992.
- ISO/IEC 13211: Informationstechnologie - Programmiersprachen - Prolog. Internationale Standardisierungsorganisation, Genf.
- Feliks Kluźniak und Stanisław Szpakowicz (mit einem Beitrag von Janusz S. Bień). Prolog für Programmierer. Academic Press Inc. (London), 1985, 1987 (erhältlich unter a Creative Commons Lizenz bei Standorte
.Google .com /Seite? ˅ /PrologforProgrammer /[Permanent Dead Link]). ISBN0-12-416521-4. - Richard O'Keefe, Das Handwerk des Prologs, ISBN0-262-15039-5.
- Robert Smith, John Gibson, Aaron Sloman: "Poplogs zweistufige virtuelle Maschinenunterstützung für interaktive Sprachen" in Forschungsrichtungen in der kognitiven Wissenschaft Band 5: künstliche Intelligenz, Eds D. Sleeman und N. Bernsen, Lawrence Erlbaum Associates, S. 203–231, 1992.
- Leon Sterling und Ehud Shapiro, Die Kunst des Prologs: Fortgeschrittene Programmierungstechniken, 1994, ISBN0-262-19338-8.
- David H D Warren, Luis M. Pereira und Fernando Pereira, Prolog - Die Sprache und ihre Implementierung im Vergleich zu Lisp. ACM Sigart Bulletin Archiv, Ausgabe 64. Proceedings of the 1977 Symposium über künstliche Intelligenz- und Programmiersprachen, S. 109–115.