WikiDer > Prolog
Prolog | ||||
| Paradigma | Logikprogrammierung | |||
| erschien | 1973 | |||
| Entworfen von | Alain Colmerauer | |||
| Implementierungen | SICStus-Prolog, SWI-Prolog, KLÄFFEN, GNU Prolog, Visueller Prolog und andere | |||
| Dialekte | ISO-Prolog | |||
| Einfluss auf | Merkur, Unze, Erlang | |||
| Betriebssystem | Multiplattform | |||
| ||||
Prolog (Fr. Programmierung und Logik, "Programmieren mit Logik") ist ein logischProgrammiersprache. Die Sprache basiert auf Prädikatslogik und hat eine starke deklarativ Charakter. Anstelle der Schritte, die zur Lösung eines Problems führen, werden die Bedingungen, die die Lösung erfüllen muss, logisch beschrieben. Daher ist Prolog ein (weitgehend) deklarativ Sprache.[1]
Entwicklung
Prolog wurde ursprünglich 1971-72 veröffentlicht[2][3] entworfen von Alain Colmerauer und seine Abteilung an der Universität Marseille (Frankreich). Es war die erste Umsetzung der Ideen von Robert Kowalski über die Verwendung von Hornklauseln als Basis für eine Programmiersprache. Die erste Version der neuen Sprache wurde von Colmerauers Kollege Philippe Roussel in algol, im Herbst 1972; seine Frau hat sich den Namen der neuen Sprache ausgedacht. Die erste Anwendung war ein einfaches Dialogsystem, das sich mit einem Benutzer auf Französisch unterhalten konnte. 1973 erhielt Colmerauers Gruppe genug Geld, um eine zweite Implementierung zu entwickeln: a Dolmetscher, geschrieben in fortran.[2]
Ein weiterer Meilenstein wurde mit einem Prolog-System erreicht, das DEZPDP-10 des Universität von Edinburgh gedreht. Bestimmtes David H. D. Labyrinth spielte eine wichtige Rolle bei der Entwicklung der Warren Abstrakte Maschine. Diese Version von Prolog bot viele Optimierungen und Erweiterungen und war die erste, die nach DEC-10 kompiliert wurde.Maschinensprache. Edinburgh-Prolog ist in vielerlei Hinsicht noch immer ein Leitprinzip. 1995 wurde Prolog von der veröffentlicht ISO standardisiert, mit dem EdinburghIOSystem und viele Prädikate wurden ersetzt. Dies führte zu etwas Kritik[4] und hat zu vielen modernen Implementierungen geführt, die beide Versionen unterstützen.
Edinburgh-Standard
Da viel Arbeit an frühen Compilern und Interpretern auf dem Universität von Edinburgh stattfand, erhielt die endgültige Umsetzung den Status de facto Standard für frühe Implementierungen, die Edinburgh-Standard. Dies hinterlässt immer noch Spuren, obwohl mittlerweile ein formaler Standard existiert. Große Teile dieses Standards werden noch von modernen Implementierungen unterstützt.
Warren Abstrakte Maschine
1983 entworfen David H. D. Labyrinth ein virtuelle Maschine fokussiert auf die Sprache Prolog: a Befehlssatz die Prolog-Compiler als Vermittler zwischen der Semantik von Prolog verwenden können, die auf dem Durchsuchen einer Sammlung möglicher Lösungen für ein logisches Problem basiert, und dem Betrieb von Computerprozessoren. WAM-Programme können dann direkt von a Dolmetscher, oder weiter in Maschinencode übersetzt. Warrens Arbeit war die erste, die die Ausführung von Logikprogrammen schnell genug für den allgemeinen Gebrauch machte.[5]
Obwohl es auch möglich ist, gebürtigMaschinensprache zu kompilieren, sind WAMs noch recht verbreitet. Die Vorteile von a gebürtig Implementierung sind begrenzt, weil viele Funktionalitäten irgendwann in Support-Funktionen umgesetzt werden müssen und das Rad immer wieder neu erfunden werden muss.[6] Auch Maschinenabhängigkeiten (Maschinenabhängigkeiten) eingeführt, was bedeutet, dass die Portabilität profitiert nicht.[Quelle?]
Quintus und SICStus
Weil Standards fehlten oder noch in den Kinderschuhen steckten,[6] Es gab eine Vielzahl von Dialekten, wobei jeder Anbieter seinen eigenen Dialekt verwendete. Durch die industrielle Qualität und die vielen Innovationen, Quintus Prolog, das in enger Zusammenarbeit mit der University of Edinburgh entwickelt wurde, ist ein De-facto-Standard. Zu den wichtigsten Neuerungen zählen die fremdsprachige Schnittstelle, die die Entwicklung von Software in anderen Computersprachen und ein System zum Importieren von Prolog-Quellcode ermöglichte Module und erleichtern so die Entwicklung großer Systeme.
In den Jahren 1985 bis 1990 wurde eine ähnliche Zusammenarbeit in Schweden, an dem auch andere Abteilungen und Wirtschaftsbeteiligte beteiligt waren, das Institut SICS (Schwedisches Institut für Informatik). Das Hauptziel der Studie war die Messung der Arbeitsbelastung über mehrere Prozessoren zu teilen, oder-parallel, wobei mehrere Alternativen gleichzeitig in Betracht gezogen werden. Dies wurde mit der AuroraProjekt, bei dem auch Warren eine wichtige Rolle spielte. Ab 1988 wurde das Projekt von der schwedischen Regierung und Marktparteien subventioniert, um SICStus Prolog für industrielle Anwendungen geeignet zu machen, was 1991 in Version 3 mündete.
1998 übernahm SICStus das Unternehmen Quintus und gab bekannt, "Großer einheitlicher Compiler" zu (eine Anspielung auf die Große Einheitliche Theorie von dem Physik), eine Fusion von Quintus- und SICStus-Technologie, die nie auf den Markt kam. Erst 2007 führten die Bemühungen zu den Versionen 4 und 4.1 im Jahr 2009. SICStus ist der größte Anbieter von Prolog-Compilern und Innovationen in Parallelisierung und Skalierbarkeit sind wegweisend.[7] SWI-Prolog beispielsweise implementiert wichtige Teile der Quintus/SICStus-Spezifikation.[8]
Standardisierung
Die ersten Versuche, die Sprache zu standardisieren, gehen auf das Jahr 1985 zurück, als die AFNORO gründete die erste Prolog-Arbeitsgruppe.[4] 1987 wurde die ISO eine Arbeitsgruppe (ISO/IEC JTC1/SC22 Gruppe WG17). Zu spät, denn verschiedene Anbieter hatten ihre eigenen Versionen und Kundschaft entwickelt und ihre Dialekte wütend gegen zu drastische Eingriffe verteidigt.
Die vielen hitzigen, manchmal bissigen Debatten[6] führte schließlich zum Standard ISO/IEC 13211-1 die 1995 erschienen ist. Das Dokument standardisiert nicht nur die Syntax und formell Semantik der Sprache, sondern definiert auch Vereinigung, ein zentrales Konzept, neu definiert IO-Prädikate und führt einige Konstruktionen für . ein Ausnahmebehandlung. Insbesondere die Neudefinition von I/O-Prädikaten hat Kritik auf sich gezogen, weil sie sich drastisch von den Edinburgh-Implementierungen unterscheidet und somit viele alte Prolog-Programme bricht.
Trotz ISO/IEC 13211-1 spricht Covington et al. in ihrem Codierungsrichtlinien für Prolog eine Verwendung zu einem umfassenden Standard für die Sprache; Ihnen zufolge ist die kleine Prolog-Community fragmentiert und hauptsächlich um ihre verschiedenen Implementierungen herum organisiert, von denen keine dominant ist.[9]
Benutzen
Da Prolog auf formaler Logik basiert und a . verwendet Inferenz-Engine selbstständig Schlussfolgerungen ziehen kann, eignet sich diese Sprache, um Wissen zu modellieren und Menschen dabei zu unterstützen, Schlussfolgerungen aus Daten zu ziehen. Sprache ist daher ein weit verbreitetes Werkzeug zur Verarbeitung natürlicher Sprache,[1][10]Data-Mining,[11][12][13] Interpretation der Ergebnisse von Messungen, Modelle und Simulationen[Quelle?] und bauen Expertensysteme und forschen nach künstliche Intelligenz.
Obwohl sich die Nutzung von Prolog zunächst auf die akademische Welt, wurden die Implementierungen allmählich so stabil, dass die Sprache kommerziell genutzt werden konnte. In den frühen 1990er Jahren hatte sich Prolog eine "stabile Nische" auf dem Markt für Programmiersprachen erarbeitet.[14]Zu den Anwendern in der Industriewelt gehörten Boeing, dass mit a Expertensystem zusammengestellte Steckverbinder-Montagehandbücher mit Listen der erforderlichen Werkzeuge, Materialien, Teile und Verfahren. Es Nationales Zentrum für Atmosphärenforschung in dem USA verwendet Prolog-basierte Software zur Erstellung von kurzfristigen Wetterberichten, in Budapest a Prolog-Anwendung überwacht die Konzentrationen von Schadstoffen und empfiehlt zusätzliche Filter, die bei Überschreitung und im Vereinigtes Königreich Ein Antrag beriet das Personal der Wasserversorgungsunternehmen über den optimalen Einsatz von Pumpen, damit der Druck im Wasserversorgungssystem gleichmäßig verteilt wird.[15]Ungefähr zur gleichen Zeit veröffentlichten jedoch Forscher, die an der Entwicklung der Logikprogrammierung beteiligt waren, einen Artikel, in dem es hieß, dass dieses Paradigma "trotz seiner theoretischen Vorteile" nicht gebrochen sei: Von den 500 Anwendungen auf der öffentlichen Liste "Prolog-1000" waren nur wenige von mehr als hundert Menschen genutzt.[16] Eine Schätzung aus dem Jahr 2003 bezifferte die Zahl der Prolog-Benutzer auf Hunderttausende.[17]
Die Mächtigen Inferenz-Engine, Die Möglichkeit von zurückverfolgen ("backtrack") und die Einfachheit und Flexibilität der Sprache machen sie gut geeignet für Rapid-Prototyping, zumal komplizierte Regeln relativ einfach ausgedrückt werden können. Dadurch eignet sie sich auch sehr gut zum Interpretieren und Produzieren sprachlicher Äußerungen, natürlicher oder anderer Art. Daher wird häufig Prolog für diesen Zweck verwendet. Diese Sprache hat bereits Mechanismen, um Syntax zu definieren, wie Grammatiken für bestimmte Klauseln, macht sie für diesen Zweck hervorragend geeignet. Es Internationale Raumstation ISS hast Clarissa,[18] einer in Prolog written geschrieben "vollständig sprachgesteuerter Verfahrensbrowser" um die Astronauten bei den Tausenden von Prozeduren zu unterstützen, die erforderlich sind, um die Raumstation am Laufen zu halten.
Ein neueres Beispiel ist die Verwendung in Watson, das Computersystem von IBM dass das amerikanische quiz Gefahr! gewonnen.[10] Im niederländischen Sprachraum gibt es das Analyseprogramm Alpino, das in Prolog geschrieben ist.[19]
Beeinflussen
Die Anwendung formaler Logik auf Modellwissen hat zu vielen verschiedenen Sprachen und Anwendungen geführt, die jedoch oft auf die akademische und industrielle Welt beschränkt sind.
Die für Prolog entwickelten Techniken sind mittlerweile ziemlich weit verbreitet und beschränken sich nicht auf erste Bestellung, sondern konzentriere dich auch auf Logik zweiter Ordnung und automatisierter Satzbeweis, beweisen mathematische Theoreme durch Software. Sprachen wie Gödel implementieren ziemlich viele Prolog-Funktionen.
In den 1980er Jahren brachte BorlandTurbo-Prolog auf dem Markt, noch unter dem Namen Visueller Prolog wird eingesetzt. Diese Sprache, die sich viel mehr an Bastler als an professionelle Anwender richtet,[Quelle?] unterscheidet sich jedoch stark von anderen Dialekten. Der Hauptunterschied besteht darin, dass Typen in Turbo-Prolog statisch verifiziert und muss daher deklariert werden.
Die Programmiersprache Erlang wurde ursprünglich in Prolog implementiert; die Designer der Sprache argumentieren, dass Erlang ohne Prolog und seine Eignung für Rapid-Prototyping, hätte es nicht gegeben.[20] Erlang war ursprünglich ein Dialekt oder eine Erweiterung von Prolog und die beiden Sprachen haben immer noch oberflächliche Ähnlichkeiten (insbesondere in der Syntax), aber Erlang wurde später von Prolog getrennt und zu einem entwickelt funktionale Sprache eher als logisch.[21]
Auch in der Literatur hat die Sprache einige Spuren hinterlassen. Im Roman Dirk Gentlys ganzheitliche Detektei von Douglas Adams Ein auf Prolog basierendes Expertensystem kommt ins Spiel, das automatisch Argumente entwickelt, um die Idee für jedes gewünschte politische Ziel zu unterstützen.
Datentypen
Variablen
Eine Variable in Prolog wird groß geschrieben und ist ein Objekt, das mit allem vereinheitlicht werden kann. Es ist hier wichtig zu beachten, dass, sobald eine Variable an einen bestimmten Wert gebunden ist (durch Vereinheitlichung), diese Bindung nicht mehr rückgängig gemacht werden kann.
Atome (Atom)
EIN Atom (aus dem Griechischen atomos, unteilbar) ist eine eindeutige Zeichenfolge, die ein einzelnes Objekt darstellt. Ein Atom kann auf zwei Arten dargestellt werden:
- Ohne Anführungszeichen, wenn das Atom mit einem Kleinbuchstaben beginnt und ansonsten nur Buchstaben, Zahlen und unterstreichen enthält (Auto, LKW, Fahrrad, this_is_an_atom).
- Mit Anführungszeichen, wenn das Atom mit einem Großbuchstaben oder einer Zahl beginnt oder unzulässige Zeichen enthält ('2CV', 'jan-willem', 'das ist auch ein Atom').
Ganzzahlen und Floats
Ganzzahlen und Gleitkommazahlen stehen für verschiedene Zahlen. Die Notation unterscheidet sich nicht von der in anderen Sprachen.
Strukturen (Struktur)
Eine Struktur ist eine komplexe, geordnete Sammlung von Daten. Diese werden dargestellt durch a Funktion gefolgt von einer Liste von Elementen in Klammern. Strukturen können verschachtelt werden.
Kunde(Name('Pietje', 'Puk'), Adresse('Dorfstraße', 1, '9999ZZ', 'Ergenshuizen'), Telefon('0123', '4567890')).Listen (aufführen)
Eine Liste ist eine spezialisierte Struktur basierend auf den vordefinierten Funktion '.' (Punkt), die aus zwei Elementen besteht: dem Kopf (Kopf) und der Schwanz (Schwanz), wobei der Schwanz eine andere Liste ist. Das Ende des letzten Elements wird durch eine leere Liste dargestellt: '[]'.
Eine Liste sieht also so aus:
.(Affe, .(Anmerkung, .(mies, [])))
Da diese Notation jedoch ziemlich umständlich ist, wird sie am häufigsten verwendet, wenn die Liste durch durch Kommas getrennte Elemente zwischen einem [- und einem ]-Zeichen dargestellt wird. Das Folgende ist äquivalent zu dem oben Gesagten und hat die gleiche interne Darstellung:
[Affe,Hinweis,Schwester]Verwenden des '|' Operator die Kopfzeile der Liste wird unterschieden, so dass verschiedene Formen der Vereinheitlichung möglich sind:
?- [Kopf|Schwanz] = [Affe, Nuss, Mies]. Kopf=Affe Schwanz=[Anmerkung, Mies] wahr ?- [K1, K2|Schwanz] = [Affe, Nuss, Mies]. K1=Affe K2=Note Tail=[mies] true
Fakten, Regeln und die Prolog-Datenbank
Das Herzstück der Prolog-Sprache ist eine Datenbank, in der Fakten (Fakten) und Regeln (Klauseln) gespeichert. Jede Tatsache und jede Regel hat eine arität, die Anzahl der Argumente, die die Klausel notwendig.
Beispiel, einige Fakten (Fakten) mit arität 2:
Fahrzeug(LKW,'scania').Fahrzeug(Wagen,'2CV').Fahrzeug(Motor,'Harley Davidson').Fahrzeug(Moped,'puch').Fahrzeug(Fahrrad,'batavus').EIN Klausel (Regel) verknüpft zwei oder mehr Tatsachen. Beispiel: Für X ist ein Führerschein 'c' erforderlich, wenn X ein Fahrzeug und X ein LKW ist.
FührerscheinErforderlich(c,X):-Fahrzeug(LKW,X).Der Unterschied zwischen Fakten und Klauseln ist der ':-'-Operator, de Hals, die die Überschrift (Kopf) des Klausel trennt sich von der Definition, die Körper. Tatsächlich, a Tatsache ein besonderes Klausel der immer Erfolg hat.
Auftrag
Fakten und Regeln in der Datenbank haben einen festen Auftrag. Wenn mehrere Klauseln mit dem gleichen Namen und arität (gleiche Anzahl von Argumenten), werden sie in der Reihenfolge ausgewertet, in der sie im Quellcode erwähnt werden. Klauseln gleichen Namens und gleicher Bedeutung werden gruppiert, um ihre Kohärenz zu betonen, und werden als ein zusammenhängendes Ganzes betrachtet. Moderne Compiler geben einen Fehler aus, wenn sie nicht gruppiert sind.
Behaupten und einfahren
Fakten und Regeln müssen nicht im Programmtext definiert werden, sondern können auch mit dem behaupten ("bestimmen") Prädikate behaupten und behauptenz, die sie als "erster" bzw. "letzter" definieren. Verwendung der Prädikate einfahren und abschaffen es ist möglich, Fakten und Regeln wieder aus der Datenbank zu entfernen, so dass die Datenbank ohne Änderung des Quellcodes an sich ändernde Gegebenheiten angepasst werden kann.
Fragen, Vereinigung und ungebundene Variablen
Mit den oben genannten Fakten und Regeln in der Datenbank ist es möglich, die Prolog-Datenbank mit einer Prolog-"Frage" abzufragen (Frage).
?-Fahrzeug(V, 'Scania').V=trucktrue
Unsere Frage enthält eine Variable 'V', die zunächst "ungebunden" ist, a ungebundene Variable. Das heißt, 'V' hat keinen bestimmten Wert. Passe wie 'V' damit zusammen Atom 'LKW' ist vereinheitlicht, 'V' hat einen Wert. Sobald eine Variable einen Wert hat, kann sie nicht wieder unterbrochen werden.
Es ist verlockend, die Vereinigung als Zuschreibung zu sehen (Zuordnung) auf eine Variable wie die in zwingende Sprachen üblich, aber die Vereinigung ist wesentlich anders. Wenn eine Zuweisung immer erfolgreich ist, schlägt eine Vereinigung fehl, es sei denn, die folgenden Regeln werden erfüllt.
- Ungebundene Variablen können immer mit anderen ungebundenen Variablen vereinigt werden.
- Ungebundene Variablen können immer mit verwendet werden Atome, Zahlen, Listen oder Strukturen werden vereinheitlicht. Danach ist die Variable nicht mehr ungebunden, sondern hat einen bestimmten Wert.
- Atome (Atome) und Zahlen können nur mit anderen Atomen von ähnlichem Wert vereinigt werden. Der Atom-"Truck" kann mit einem anderen Atom-"Truck" vereinigt werden, aber nicht mit einem Atom-"Auto" oder "Fahrrad".
- Listen können mit anderen Listen vereinheitlicht werden, wenn alle einzelnen Elemente vereinheitlicht werden können.
- Strukturen können nur mit anderen Strukturen vereint werden, wenn sie
- das gleiche arität habe und
- alle Elemente der Struktur können vereinheitlicht werden.
Beachten Sie, dass die Vereinheitlichung von Listen und Strukturen rekursiv ist definiert, da jedes Mitglied der Struktur selbst eine Struktur sein kann.
Direktionalität
Da ein Prolog-Programm in Bezug auf logische Beziehungen und nicht auf eine Folge von Anweisungen definiert ist, umfasst die Vereinigung keine Ressource, deren Wert zugewiesen wird, oder ein Ziel, dem der Wert zugewiesen wird. Eine erfolgreiche Vereinigung von X und Y führt dazu, dass X und Y denselben Wert erhalten. Es spielt keine Rolle, ob X an einen Wert gebunden war und Y an einen Wert gebunden war oder umgekehrt. Wenn beide Variablen gebunden sind, aber die obigen Regeln erfüllen, ist die Vereinigung ebenfalls erfolgreich.
Dies geht weit, und viele Prädikate sind in dem Sinne ungerichtet, dass kein wirklicher Unterschied zwischen Eingabe- und Ausgabeparametern gemacht wird. Basierend auf MitgliedPrädikat, das die Zugehörigkeit zu einer Liste festlegt, kann dies veranschaulicht werden:
?- member(foo, [foo, bar, baz]).true?- member(X, [foo, bar, baz]).X = foo ;X = bar ;X = baz
Aber weil Mitglied logisch definiert ist, funktioniert es auch andersherum:
?- member(foo, [X, bar, baz]).X = foo ;false.?- member(foo, [X, Y, Z]).X = foo ;Y = foo ;Z = foo.
Oder auch
?- Mitglied(foo, Liste).Liste = [foo|_G321] ;Liste = [_G320, foo|_G324] ;Liste = [_G320, _G323, foo|_G327] ;Liste = [_G320, _G323, _G326, foo| _G330] ;Liste = [_G320, _G323, _G326, _G329, foo|_G333]
Im letzteren Fall, wenn es um die Frage geht, ob es eine Liste gibt, welche „foo“ ein Mitglied ist, aufführen vereinheitlicht mit einer Liste bestehend aus 'foo' als Überschrift und a Attrappevariabel wie Schwanz. Dies ist die kleinste Liste, deren Mitglied 'foo' sein kann, mit nur einem Element wie dem Attrappe mit der leeren Liste wird vereinheitlicht. Die Suche nach Alternativen führt zu einer (theoretisch) unendlichen Anzahl von Listen von AttrappeVariablen und das 'foo'-Element.
Ziel (Tor)
EIN Ziel ist eigentlich eine Abfrage an die Prolog-Datenbank. Ein Ziel ist erreicht, wenn es mit den Inhalten der Datenbank vereinheitlicht werden kann. Zu den oben genannten Klausel "FührerscheinRequired(c, X)" muss das Ziel sein (Tor) "Fahrzeug(LKW,X)" implementiert. Dies ist nur möglich, wenn X='Scania'.
?- FührerscheinErforderlich(c, X).X='Scania'true
Vier Tore
Der Betrieb von Prolog kann durch ein beliebiges Ziel dargestellt werden (Tor) als Vier-Gate-Knoten, wobei Anruf und wiederholen sind Eingänge, und Ausfahrt und Scheitern Ausgänge.
Um ein Ziel zu erreichen, die erste AnrufHafen versucht. Gelingt dies, wird das Ziel von der Ausfahrtport und versucht, das folgende Ziel zu erreichen. Wenn das Ziel nicht erreicht werden kann, Tor über die ScheiternAusgangstor und lassen Sie ein vorheriges Ziel durch das Via wiederholen-Tor.
- Anruf (im)
- Finden Sie die erste Alternative und versuchen Sie, sie zu realisieren.
- Ausfahrt (von)
- Viel Glück! Versuchen Sie, das folgende Ziel zu erreichen.
- wiederholen (im)
- Finden Sie die nächste Alternative und versuchen Sie, sie zu erreichen. Scheitern, wenn es keine Alternative gibt.
- Scheitern (von)
- Gescheitert! Wenn es ein vorheriges Ziel gibt, versuchen Sie es durch die wiederholenport, andernfalls wird ein Fehler gemeldet.
Die Frage, ob der Zweck "Führerschein erforderlich(c, 'Scania')" ergibt die Frage "Fahrzeug(LKW, 'Scania')" und entspricht somit einer Kette von zwei Zielen, wobei Ausfahrt zu Anruf Punkte und Scheitern zu wiederholen. Wenn die Zielkette von links nach rechts durchlaufen werden kann (d. h. alle Ziele sind erreicht) und Ausfahrtport ist die Konjunktion erfolgreich. Kann eines der Ziele nicht erreicht werden, ScheiternTor nach links und kommt durch die wiederholenPort des vorherigen Ziels. Wenn man durch die geht wiederholenport wird Prolog versuchen, dieses Ziel erneut zu erreichen, wählt aber jetzt eine Alternative. Erst wenn keine Alternativen vorhanden sind, lässt man die Kette links über den ScheiternTor und die Konjunktion schlägt fehl.
| → | Anruf | Ausfahrt | → | Anruf | Ausfahrt | → (Erfolg) | ||
| FührerscheinErforderlich(c, 'Scania') | Fahrzeug (LKW, 'Scania') | |||||||
| Scheitern | wiederholen | Scheitern | wiederholen |
Die Abfrage "FührerscheinBedarf(c, '2CV')." Entspricht:
| → | Anruf | Ausfahrt | → | Anruf | Ausfahrt | |||
| FührerscheinErforderlich(c, '2CV') | Fahrzeug (LKW, '2CV') | |||||||
| ← | Scheitern | wiederholen | ← | Scheitern | wiederholen |
Beachten Sie, dass die letzte Abfrage nicht realisiert werden kann, da das Ziel "Fahrzeug(LKW, '2CV')" nicht mit einem Eintrag in der Datenbank vereinigt werden kann.
Das Gates-Modell ist sehr erfolgreich bei der Verfolgung der Aktivität des Prolog-Interpreters.
Komplexe Regeln
Regeln sind oft komplexer als das sehr einfache Beispiel oben. Oft müssen zwei oder mehr Anforderungen erfüllt werden, manchmal nur eine von mehreren Anforderungen.
Konjunktionen
EIN Verbindung besteht aus zwei oder mehr Tore das alles muss erreicht werden. Dies wird durch die Tore mit Komma getrennt.
Die erforderliche "Person p hat den erforderlichen Führerschein für das Fahrzeug V, wird dann formuliert als:
- V ist ein Fahrzeug mit Führerschein R ist notwendig für
und
- p ist eine Person, die auflistet l von Führerscheinen,
und
- R findet sich in l
hatGültiger Führerschein(Treiber,Fahrzeug):-FührerscheinBenötigen(Notwendig,Fahrzeug),Treiber(Treiber,Führerscheine),Mitglied(Notwendig,Führerscheine).Disjunktionen
EIN Disjunktion besteht aus zwei oder mehr Zielen, von denen eines erreicht werden muss. Disjunktionen werden von der Person angegeben Tore getrennt durch ein Semikolon ';'.
Eine Person p kann ein Fahrzeug fahren drive V wenn:
- p hat den nötigen Führerschein
oder
- vor dem V es ist kein Führerschein erforderlich.
Entweder:
magGovern(Person,Fahrzeug):-hatGültiger Führerschein(Person,Fahrzeug);nicht(FührerscheinBenötigen(_,Fahrzeug)).Da bei Disjunktionen leicht unvorhergesehene Effekte auftreten können, weil die Prioritäten der Operatoren anders sind als vom Programmierer beabsichtigt, werden Disjunktionen oft als zwei separate Klauseln geschrieben, insbesondere wenn die Klausel-mit-Disjunktion ist ziemlich kompliziert. Das Obige wird dann:
magGovern(Person,Fahrzeug):-hatGültiger Führerschein(Person,Fahrzeug).magGovern(Person,Fahrzeug):-nicht(FührerscheinErforderlich(_,Fahrzeug)).Alternativen, Backtracking und die Schnitt Operator
In vielen Fällen gibt es mehrere Möglichkeiten, eine Frage mit der Datenbank zu vereinheitlichen. Die Frage "Fahrzeug(R, F)" hätte im obigen Beispiel eine Reihe von möglichen Antworten. Alternative Antworten in Betracht zu ziehen ist zurückverfolgen erwähnt.
?- Fahrzeug(R, V).R=LKWV='Scania' ;R=AutoV='2CV' ;R=MopedV='Puch' ;R=FahrradV='Batavus' ;
Die Taste ; zwingt die Prolog-Datenbank, nach einer alternativen Lösung zu suchen. Wenn eine Lösung gefunden wird, wird diese angegeben. Dies kann auch erzwungen werden durch die ScheiternPrädikat, das immer scheitert (daher der Name), so dass immer eine andere Alternative gesucht wird.
?- Fahrzeug(_, V), writef("Fahrzeug %w", [V]), fehlgeschlagen.Fahrzeug ScaniaFahrzeug 2CVFahrzeug Harley-DavidsonFahrzeug PuchFahrzeug Batavusfalse.Schnitt
In einigen Fällen ist die Suche nach einer Alternative unerwünscht, z. B. wenn Daten bereits auf ein Peripheriegerät exportiert wurden, um Ausnahmen zu behandeln oder um die Berücksichtigung unerwünschter Alternativen zu vermeiden.
Dies kann erreicht werden durch die Schnitt, die als notiert wird Ausrufezeichen (!) und sagt grundsätzlich, dass keine Alternativen mehr in Betracht gezogen werden sollten. Mit Hilfe von Schnitt kann zum Beispiel a wenn-dann-sonst Bau umgesetzt werden.
Heizung(Temperatur,Auf):-Temperatur<18,!.Heizung(Temperatur,von):-Temperatur>20,!.Heizung(_,Hände weg).?-kocher(21, Aktion).Aktion=aus.?-kocher(17, Aktion).Aktion=ein.?-kocher(19, Aktion).Aktion=bleib weg.
Ohne das Schnitt Alternativen würden in Betracht gezogen, und es würden zwei Antworten gefunden, da letztere Klausel ist immer gültig.
Heizung(Temperatur,Auf):-Temperatur<18.Heizung(Temperatur,von):-Temperatur>20.Heizung(_,Hände weg).?-stove(21, Action).Action=off.Action=Auslassen.?-Herd(17, Action).Action=on.Action=Ausschalten.
wenn-dann-sonst
Es gibt mehrere Möglichkeiten, wenn-dann-sonst Konstrukt in Prolog zu implementieren. Der klassische Weg[22] verwendet a SchnittOperator, wie im obigen Ofen-Beispiel, aber prolog hat auch einen Operator, der dieses Konstrukt (mehr oder weniger) implementiert.
(Bedingung->Wahr;falsch)wenn Bedingung bewiesen werden kann, versuchen Sie die WahrKlausel zu beweisen, ansonsten versuchen Sie die falschKlausel zu beweisen. Als die falschKlausel fehlt, schlägt die ganze Klausel fehl, wenn Bedingung kann nicht nachgewiesen werden. Das heißt, die folgenden Klauseln sind äquivalent.
(Bedingung->Wahr)(Bedingung->Wahr;Scheitern)Die Semantik dieses Operators, insbesondere in Bezug auf zurückverfolgen und der Schnittunterscheidet sich jedoch von einem in Verfahrenssprachen (wie z Pascal oder C) würde erwarten. Der Operator wird manchmal wegen der Bedeutung entmutigt, insbesondere wenn sie verschachtelt sind oder Schnitt-Betreiber in beiden Zweigen wären nicht sehr klar,[23][24][25] obwohl Covington et al. die "wenn-dann-sonst"-Konstruktion als Alternative zur Schnitt schlagen vor, deterministisch bedingte implementieren.[9] Die Konstruktion kann in SICStus Prolog für eine Geschwindigkeitsverbesserung sorgen, da die wertvollen zurückverfolgen kann vermieden werden.[26]
Klimaanlage(Temperatur,Aktion):-(Temperatur>23->Aktion=Auf;Aktion=von).Rekursion
Es kommt oft vor, dass eine Regel in sich selbst definiert wird. EIN Liste der Buchstaben, zum Beispiel, ist leere Liste oder ein Brief gefolgt von einem Liste der Buchstaben. In Prolog übersetzt lautet die Definition:
charlist([CH|Sich ausruhen]):-char_type(CH,Alpha),!,charlist(Sich ausruhen).charlist([]).Diese Form heißt Rekursion (etwas präziser Schwanzrekursion) und erscheint häufig in Prolog-Programmen. Das Schnitt verhindert unnötiges Abrufen, sobald Ch als Buchstabe bekannt ist, gibt es keine Alternativen.
Ein komplizierteres Beispiel findet alle Buchstaben in einem String und gibt sie als Ergebnis zurück.
charlist([CH|Sich ausruhen],[CH|alle]):-char_type(CH,Alpha),!,charlist(Sich ausruhen,alle).charlist([_|Sich ausruhen],alle):-charlist(Sich ausruhen,alle).charlist([],[]).?- charlist("87foo28723bar", L), writef("%s!", [L]).foobar!L = [102, 111, 111, 98, 97, 114].Bestimmte Klauselgrammatik
Als Besonderheit von Prolog ddefinitiv Claus GRammars (DCG), eine Möglichkeit, eine Syntax auf einfache Weise in einer Form darzustellen, die der Backus-Naur-Form (BNF). Genau genommen sind DCGs nicht Teil des Prolog-Standards, aber sie kommen in fast jeder Implementierung vor.
Mit DCG ist das Parsen einer Ganzzahl ziemlich einfach.
/* Eine ganze Zahl ist eine Reihe von Zahlen (Ziffern). Ist eine Reihe von Ziffern * erkannt, in eine Zahl umwandeln. */ganze Zahl(ich)-->Ziffern(Ziffern),{/* wandelt die gelesene Zahlenreihe in eine Zahl um*/number_chars(ich,Ziffern)}./* Eine Liste von Zahlen ist eine Zahl gefolgt von einer Liste von Zahlen... */Ziffern([d|Sich ausruhen])-->Digital(d),!,Ziffern(Sich ausruhen)./* ... oder eine leere Liste, wenn keine Eingabe mehr erfolgt. */Ziffern([])-->[].Digital(d)-->[d],{/* Prüfe ob D eine Zahl ist. */code_type(d,Digital)}.Beispiel
Ein Beispiel für ein vollständiges Prolog-Programm mit einigen Kenntnissen über Fahrer, Fahrzeuge und Führerscheine.
/* Ein Prolog-Programm muss auf wenige zurückgreifen können * festgestellte Tatsachen. In diesem Beispiel codieren wir ein bisschen * Kenntnisse über Fahrer, Fahrzeuge und Führerscheine in Form von Prolog * 'Fakten'. Logischerweise sind dies Axiome. */Fahrzeug(LKW,'DAF').Fahrzeug(LKW,'scania').Fahrzeug(LKW,'MANN').Fahrzeug(Wagen,'2CV').Fahrzeug(Wagen,"Fiat-500").Fahrzeug(Wagen,'Golf-GTI').Fahrzeug(Motor,'Harley Davidson').Fahrzeug(Motor,'BMW').Fahrzeug(Motor,'Yamaha').Fahrzeug(Moped,'puch').Fahrzeug(Moped,'Kreidler').Fahrzeug(Moped,'Zundapp').Fahrzeug(Fahrrad,'batavus').Fahrzeug(Fahrrad,'Union').Fahrzeug(Fahrrad,'Gazelle')./* Als ein paar Fahrer, die mehr als einen Führerschein haben * haben kann. */Treiber(jantje,[b,c,e]).Treiber(pete,[ein,b,Zertifikat]).Treiber(keesje,[b,e]).Treiber(klaasje,[Zertifikat]).Treiber('Jan Willem',[])./* Als nächstes definiert eine 'Klausel' welche * Führerschein für welchen Typ erforderlich ist. */FührerscheinErforderlich(c,X):-Fahrzeug(LKW,X).FührerscheinErforderlich(b,X):-Fahrzeug(Wagen,X).FührerscheinErforderlich(ein,X):-Fahrzeug(Motor,X).FührerscheinErforderlich(Zertifikat,X):-Fahrzeug(Moped,X)./* Mit diesem Wissen ist es möglich zu erkennen, ob ein Fahrer * besitzt einen gültigen Führerschein. Das passiert wieder in einer Klausel. * * Glätten hilft nicht... */hatGültiger Führerschein(Treiber,Fahrzeug):-FührerscheinBenötigen(Notwendig,Fahrzeug),Treiber(Treiber,Führerscheine),Mitglied(Notwendig,Führerscheine)./* Man darf aber auch ohne 'Batavus', 'Gazelle' oder 'Union' fahren * dafür hat man einen gültigen Führerschein, sagt aber, dass jemand einen gültigen Führerschein hat * einen Fahrradführerschein hat, ist Quatsch. Jeder darf Rad fahren und a * Fahrradführerschein ist nicht vorhanden. * * Daher ist ein Schlusssatz erforderlich. */magGovern(Treiber,Fahrzeug):-hatGültiger Führerschein(Treiber,Fahrzeug).magGovern(Treiber,Fahrzeug):-Fahrzeug(_,Fahrzeug),Treiber(Treiber,_),nicht(FührerscheinErforderlich(_,Fahrzeug)).Es ist nun möglich, die Prolog-Datenbank abzufragen. Das Prädikat 'bagof' listet alle erfolgreichen Vereinigungen auf.
?- magControl(klaasje, 'DAF').false.?- magControl(klaasje, Fahrzeug).Fahrzeug = 'Puch' ;Fahrzeug = 'Kreidler' ;Fahrzeug = 'Zundapp' ;Fahrzeug = 'Batavus' ;Fahrzeug = 'Union ' ;Fahrzeug = 'Gazelle'.?- bagof(Fahrzeug, mayDrive(pietje, Fahrzeug), Fahrzeuge).Fahrzeuge = ['2CV', 'Fiat 500', 'Golf GTI', 'Harley-Davidson', 'BMW' , 'Yamaha', 'Puch', 'Kreidler', 'Zundapp'|...].?- bagof(Driver, magControl(Driver, 'Union'), Directors).Drivers = [jantje, pietje, keesje, klaasje , 'jan-willem'].?- bagof(Driver, magDrive(Driver, '2CV'), Drivers).Drivers = [jantje, pietje, keesje].?- bagof(Driver, magDrive(Driver, 'DAF') , Fahrer).Fahrer = [jantje].?- bagof(Fahrzeug, mayDrive(Fahrer, Fahrzeug), Fahrzeuge).Fahrer = jantje,Fahrzeuge = ['DAF', 'Scania', 'MAN', '2CV', ' Fiat 500', 'Golf GTI', 'Batavus', 'Union', 'Gazelle'] ;Fahrer = keesje,Fahrzeuge = ['2CV', 'Fiat 500', 'Golf GTI', 'Batavus', 'Union' , 'Gazelle'] ;Fahrer = kla asje,Fahrzeuge = ['Puch', 'Kreidler', 'Zundapp', 'Batavus', 'Union', 'Gazelle'] ;Fahrer = pietje,Fahrzeuge = ['2CV', 'Fiat 500', 'Golf GTI' , 'Harley-Davidson', 'BMW', 'Yamaha', 'Puch', 'Kreidler', 'Zundapp'|...] ;Fahrer = 'jan-willem',Fahrzeuge = ['Batavus', 'Union' , 'Gazelle'].
| Dieser Artikel war am 5. Januar 2012 diese Version in der Vitrine enthalten. |
Externe Links
Quellen
Voetnoten
|
| Programmeertalen |
|---|
ABAP ·ABC ·ActionScript ·Ada ·Algol ·APL ·assembleertalen ·AWK ·B ·BASIC ·BCPL ·C ·C ·C♯ ·Clean ·Clipper ·COBOL ·COMAL ·Curry ·D ·Eiffel ·Erlang ·F♯ ·Forth ·Fortran ·Go ·Haskell ·Icon ·J♯ ·Java ·Kotlin ·Lisp ·Logo ·Lua ·m4 ·ML ·Modula-2 ·Oberon ·Object Pascal ·Objective-C ·Ocaml ·Oz ·Pascal ·Perl ·PHP ·PL/I ·PL/SQL ·Prolog ·Prova ·Python ·Rexx ·RPG ·Ruby ·Rust ·SAS ·Scala ·Scheme ·Self ·Simula ·Smalltalk ·Swift ·TCL ·TypeScript ·Vala ·Visual Basic |