Logikprogrammierung
Logikprogrammierung ist ein Programmierparadigma das basiert größtenteils auf formalen Logik. Jedes Programm, das in einer Logik geschrieben wurde Programmiersprache ist eine Reihe von Sätzen in logischer Form, die Fakten und Regeln zu einer Problemdomäne ausdrücken. Zu den wichtigsten Familien der logischen Programmiersprache gehören Familien Prolog, Antwort -Set -Programmierung (ASP) und Datenprotokoll. In all diesen Sprachen werden Regeln in Form von geschrieben Klauseln:
- H:- b1, …, Bn.
und werden deklarativ als logische Implikationen gelesen:
- H wenn b1 und… und bn.
H wird genannt Kopf der Regel und B1, ..., Bn wird genannt Karosserie. Fakten sind Regeln, die keinen Körper haben und in der vereinfachten Form geschrieben sind:
- H.
In dem einfachsten Fall, in dem H, B1, ..., Bn sind alle AtomformelnDiese Klauseln werden als bestimmte Klauseln bezeichnet oder Hornklauseln. Es gibt jedoch viele Erweiterungen dieses einfachen Falles, wobei der Fall der Fall ist, in dem die Bedingungen im Körper einer Klausel auch Negationen von Atomformeln sein können. Logische Programmiersprachen, die diese Erweiterung enthalten Nicht-monotonische Logik.
In ASP und Datalog haben Logikprogramme nur a deklarativ Das Lesen und ihre Ausführung werden durch einen Beweisverfahren oder ein Modellgenerator durchgeführt, dessen Verhalten nicht vom Programmierer gesteuert werden soll. In der Prolog -Sprachenfamilie haben Logikprogramme jedoch auch a prozedural Interpretation als Zielreduktionsverfahren:
- lösen H, lösen B1und ... und lösen Bn.
Betrachten Sie die folgende Klausel als Beispiel:
- fehlbar (x):- Mensch (x).
Basierend auf einem Beispiel von verwendet von Terry Winograd[1] Um die Programmiersprache zu veranschaulichen Planer. Als Klausel in einem Logikprogramm kann es sowohl als Prozedur verwendet werden, um zu testen, ob X ist fehlbar durch Testen, ob X ist Menschund als Verfahren, um eine zu finden X welches ist fehlbar Indem Sie ein finden X welches ist Mensch. Sogar Fakten haben eine prozedurale Interpretation. Zum Beispiel die Klausel:
- menschlich (Sokrates).
kann sowohl als Prozedur verwendet werden, um das zu zeigen Sokrates ist Menschund als Verfahren, um eine zu finden X das ist Mensch durch "Zuweisen" Sokrates zu X.
Das deklarative Lesen von Logikprogrammen kann von einem Programmierer verwendet werden, um seine Richtigkeit zu überprüfen. Darüber hinaus logikbasiert Programmumwandlung Techniken können auch verwendet werden, um Logikprogramme in logisch äquivalente Programme zu verwandeln, die effizienter sind. In der Prolog-Familie von Logikprogrammiersprachen kann der Programmierer auch das bekannte Problemlösungsverhalten des Ausführungsmechanismus verwenden, um die Effizienz von Programmen zu verbessern.
Geschichte
Die Verwendung mathematischer Logik zur Darstellung und Ausführung von Computerprogrammen ist auch eine Funktion der Lambda -Kalkül, entwickelt von Alonzo -Kirche in den 1930ern. Der erste Vorschlag zur Verwendung des Klausal Form der Logik für die Darstellung von Computerprogrammen wurde von erstellt von Cordell Green.[2] Dies verwendete eine Axiomatisierung einer Untergruppe von LISPELNzusammen mit einer Darstellung einer Input-Output-Beziehung, um die Beziehung durch Simulation der Ausführung des Programms in LISP zu berechnen. Foster und Elcock's AbsysAndererseits verwendete eine Kombination aus Gleichungen und Lambda -Kalkül in einer ordnungsgemäßen Programmiersprache, die keine Einschränkungen für die Reihenfolge einräumt, in der Operationen ausgeführt werden.[3]
Die logische Programmierung in seiner gegenwärtigen Form kann in den späten 1960er und frühen 1970er Jahren über deklarative und prozedurale Repräsentationen von Wissen zurückgeführt werden künstliche Intelligenz. Befürworter deklarativer Darstellungen arbeiteten besonders bei Stanford, verknüpft mit John McCarthy, Bertram Raphael und Cordell Green und in Edinburgh, mit John Alan Robinson (ein akademischer Besucher von Syracuse University), Pat Hayes, und Robert Kowalski. Befürworter von Verfahrensdarstellungen waren hauptsächlich um MIT, unter der Führung von Marvin Minsky und Seymour Paper.
Obwohl es auf den Beweismethoden der Logik basierte, Planer, entwickelt am MIT, war die erste Sprache, die innerhalb dieses prozeduralistischen Paradigmas entstand.[4] Der Planer zeigte eine Muster-gerichtete Berufung von Verfahrensplänen aus Zielen (d. H. Zielreduktion oder Rückwärtskettung) und aus Behauptungen (d. H. Vorwärtsketten). Die einflussreichste Implementierung des Planers war die Teilmenge des Planers, Micro-Planner, implementiert von Gerry Sussman, Eugene Charniak und Terry Winograd. Es wurde verwendet, um Winograds natürliches Sprachverständnisprogramm zu implementieren Shrdlu, was zu dieser Zeit ein Wahrzeichen war.[1] Um mit den sehr begrenzten Speichersystemen zu dieser Zeit fertig zu werden, verwendete Planer eine Backtracking -Kontrollstruktur, sodass jeweils nur ein möglicher Berechnungsweg gespeichert werden musste. Der Planer führte zu den Programmiersprachen QA-4, Popler, Conniver, QLISP und dem gleichzeitigen Sprachether.
Hayes und Kowalski in Edinburgh versuchten, den logikbasierten deklarativen Ansatz zur Repräsentation des Wissens mit dem prozeduralen Ansatz des Planers in Einklang zu bringen. Hayes (1973) entwickelte eine Gleichungssprache, Golux, bei der verschiedene Verfahren durch Veränderung des Verhaltens des Theorem -Provers erhalten werden konnten.[5] Kowalski dagegen entwickelte SLD -Resolution,[6] eine Variante der SL-Auflösung,[7] und zeigten, wie es Implikationen als Zielreduktionsverfahren behandelt. Kowalski arbeitete mit Colmerauer In Marseille, der diese Ideen in der Gestaltung und Implementierung der Programmiersprache entwickelte Prolog.
Das Assoziation für die Logikprogrammierung wurde 1986 gegründet, um die logische Programmierung zu fördern.
Prolog führte zu den Programmiersprachen Alf, Fril, Gödel, Quecksilber, Oz, Ciao, Visueller Prolog, Xsb, und λprologsowie eine Vielzahl von Gleichzeitige logische Programmiersprachen,[8] Einschränkung der Logikprogrammierung Sprachen und Datenprotokoll.[9]
Konzepte
Semantik
Maarten van Emden und Robert Kowalski definierte drei Semantik für Hornklausel -Logikprogramme, Modell-theoretisch, Fixpunkt, und Proode-theoretischund zeigten, dass sie gleichwertig sind.[10]
Logik und Kontrolle
Die logische Programmierung kann als kontrollierter Abzug angesehen werden. Ein wichtiges Konzept in der Logikprogrammierung ist die Trennung von Programmen in ihre Logikkomponente und ihre Kontrollkomponente. Mit reinen logischen Programmiersprachen bestimmt die logische Komponente allein die erzeugten Lösungen. Die Steuerkomponente kann unterschiedlich sein, um alternative Möglichkeiten für die Ausführung eines Logikprogramms bereitzustellen. Dieser Begriff wird vom Slogan erfasst
- Algorithmus = Logik + Steuerung
wobei "Logik" ein Logikprogramm darstellt und "Steuerung" unterschiedliche Strategien zur Theorem-Probier darstellt.[11]
Probleme lösen
In dem vereinfachten Fall, in dem ein Logikprogramm und ein atomisches Ziel auf höchstem Niveau keine Variablen enthalten und ein Baum, was den Suchraum für die Lösung des Ziels darstellt. Das Ziel der obersten Ebene ist die Wurzel des Baumes. Bei jedem Knoten im Baum und jeder Klausel, deren Kopf mit dem Knoten übereinstimmt, gibt es eine Reihe von untergeordneten Knoten, die den Untergürten im Körper der Klausel entsprechen. Diese Kinderknoten werden von einem "und" zusammengefasst. Die alternativen Kindersätze, die alternative Wege zur Lösung des Knotens entsprechen, werden durch ein "oder" zusammengefasst.
Jede Suchstrategie kann verwendet werden, um diesen Raum zu durchsuchen. Prolog verwendet eine sequentielle Backtracking-Strategie, bei der nur eine Alternative und ein Subgeruch jeweils berücksichtigt werden. Andere Suchstrategien wie parallele Suche, intelligente Backtracking oder Best-First-Suche, um eine optimale Lösung zu finden, sind ebenfalls möglich.
Im allgemeineren Fall, in dem Sub-Goals Variablen teilen, können andere Strategien verwendet werden, z. Solche Strategien werden zum Beispiel in verwendet Gleichzeitige logische Programmierung.
Negation als Misserfolg
Für die meisten praktischen Anwendungen sowie für Anwendungen, die nicht-monotonisches Denken in der künstlichen Intelligenz erfordern, erfordern Hornklausel Logikprogramme müssen auf normale Logikprogramme mit negativen Bedingungen ausgedehnt werden. EIN Klausel In einem normalen Logikprogramm hat das Formular:
- H:- a1, …, EINn, nicht B1, …, nicht Bn.
und wird deklarativ als logische Implikation gelesen:
- H wenn a1 und… und an und nicht b1 und… und nicht bn.
wo H und alle Ai und Bi sind atomare Formeln. Die Negation in den negativen Literalen nicht Bi wird allgemein als "bezeichnet"Negation als Misserfolg", weil in den meisten Implementierungen eine negative Bedingung nicht Bi Es wird gezeigt, dass der positive Zustand zeigt Bi nicht zu halten. Zum Beispiel:
kann fliegen(X) :- Vogel(X), nicht abnormal(X). abnormal(X) :- verwundet(X). Vogel(John). Vogel(Maria). verwundet(John).
Angesichts des Ziels, etwas zu finden, das fliegen kann:
:- kann fliegen(X).
Es gibt zwei Kandidatenlösungen, die die erste Subziele lösen Vogel (x), nämlich X = John und X = Mary. Das zweite Subziel Nicht abnormal (John) der ersten Kandidatenlösung schlägt fehl, weil verwundet (John) Erfolg und daher abnormal (John) gelingt es. Die zweite Subziele jedoch Nicht abnormal (Mary) der zweiten Kandidatenlösung ist erfolgreich, weil verwundet (Mary) scheitert und daher abnormal (Mary) scheitert. Deswegen, X = Mary ist die einzige Lösung des Ziels.
Mikroplaner Hatte ein Konstrukt, das "Thhnot" genannt wurde, das bei der Anwendung eines Ausdrucks den Wert true zurückgibt, wenn (und wenn) die Bewertung des Ausdrucks fehlschlägt. In der Moderne gibt es in der Regel ein äquivalenter Operator PrologImplementierungen. Es ist normalerweise geschrieben als nicht (Ziel)
oder \+ Ziel
, wo Tor
ist ein Ziel (Vorschlag), das vom Programm nachgewiesen wird. Dieser Operator unterscheidet sich von der Negation in Logik erster Ordnung: eine Negation wie z. \+ X == 1
versagt, wenn die Variable X
wurde an das Atom gebunden 1
aber es gelingt in allen anderen Fällen, einschließlich wann X
ist ungebunden. Dies macht Prologs Argumentation nicht monoton: X = 1, \+ x == 1
scheitert immer während \+ X == 1, x = 1
kann Erfolg haben, binden X
zu 1
, je nachdem, ob X
wurde zunächst gebunden (beachten Sie, dass Standard-Prolog in der Reihenfolge von links nach rechts ausgeführt wird).
Der logische Status der Negation als Versagen war ungelöst, bis Keith Clark [1978] zeigten, dass es unter bestimmten natürlichen Bedingungen eine korrekte (und manchmal vollständige) Implementierung der klassischen Negation in Bezug auf den Abschluss des Programms ist. Die Fertigstellung beträgt ungefähr den Satz aller Programmklauseln mit demselben Prädikat auf der linken Seite, beispielsweise
- H:- Körper1.
- …
- H:- Körperk.
Als Definition des Prädikats
- H IFF (Körper1 oder… oder Körperk)
wo "IFF" "wenn und nur wenn" bedeutet. Das Schreiben der Fertigstellung erfordert auch eine explizite Verwendung des Prädikats der Gleichheit und der Einbeziehung einer Reihe geeigneter Axiome für die Gleichheit. Die Implementierung der Negation als Versagen erfordert jedoch nur die If-Halte der Definitionen ohne die Axiome der Gleichheit.
Beispielsweise ist der Abschluss des obigen Programms:
- Canfly (x) IFF -Vogel (x), nicht abnormal (x).
- abnormal (x) IFF verwundet (x).
- Vogel (x) IFF x = John oder X = Mary.
- X = x.
- Nicht John = Mary.
- Nicht Mary = John.
Der Begriff der Fertigstellung ist eng mit McCarthy's verwandt Umschreibung Semantik für die Ausfallrede und zur Semantik Annahme von geschlossener Welt.
Als Alternative zur Abschlusssemantik kann die Negation als Misserfolg auch epistemisch interpretiert werden, wie in der Stabile Modellsemantik von Antwort -Set -Programmierung. In dieser Interpretation nicht (b)i) bedeutet buchstäblich, dass bi is not known or not believed. The epistemic interpretation has the advantage that it can be combined very simply with classical negation, as in "extended logic programming", to formalise such phrases as "the contrary can not be shown", where "contrary" is classical negation and "can not be shown" is the epistemic interpretation of negation as failure.
Wissensrepräsentation
The fact that Horn clauses can be given a procedural interpretation and, vice versa, that goal-reduction procedures can be understood as Horn clauses + backward reasoning means that logic programs combine declarative and procedural representations of Wissen. Die Aufnahme von Negation als Misserfolg bedeutet, dass die logische Programmierung eine Art von einer Art ist Nicht-monotonische Logik.
Despite its simplicity compared with classical logic, this combination of Horn clauses and negation as failure has proved to be surprisingly expressive. For example, it provides a natural representation for the common-sense laws of cause and effect, as formalised by both the Situationskalkül und Ereignisrechnung. It has also been shown to correspond quite naturally to the semi-formal language of legislation. In particular, Prakken and Sartor[12] credit the representation of the British Nationality Act as a logic program[13] with being "hugely influential for the development of computational representations of legislation, showing how logic programming enables intuitively appealing representations that can be directly deployed to generate automatic inferences".
Varianten und Erweiterungen
Prolog
Die Programmiersprache Prolog wurde 1972 von entwickelt von Alain Colmerauer. It emerged from a collaboration between Colmerauer in Marseille und Robert Kowalski in Edinburgh. Colmerauer was working on natürliches Sprachverständnis, using logic to represent semantics and using resolution for question-answering. During the summer of 1971, Colmerauer and Kowalski discovered that the clausal form of logic could be used to represent formelle Grammatiken and that resolution theorem provers could be used for parsing. They observed that some theorem provers, like hyper-resolution, behave as bottom-up parsers and others, like SL-resolution (1971), behave as top-down parsers.
It was in the following summer of 1972, that Kowalski, again working with Colmerauer, developed the procedural interpretation of implications. This dual declarative/procedural interpretation later became formalised in the Prolog notation
- H:- b1, …, Bn.
which can be read (and used) both declaratively and procedurally. It also became clear that such clauses could be restricted to definite clauses or Hornklauseln, wo H, B1, ..., Bn are all atomic predicate logic formulae, and that SL-resolution could be restricted (and generalised) to LUSH or SLD-resolution. Kowalski's procedural interpretation and LUSH were described in a 1973 memo, published in 1974.[6]
Colmerauer, with Philippe Roussel, used this dual interpretation of clauses as the basis of Prolog, which was implemented in the summer and autumn of 1972. The first Prolog program, also written in 1972 and implemented in Marseille, was a French question-answering system. The use of Prolog as a practical programming language was given great momentum by the development of a compiler by David Warren in Edinburgh in 1977. Experiments demonstrated that Edinburgh Prolog could compete with the processing speed of other symbolic programming Sprachen wie Lispeln. Edinburgh Prolog became the de facto standard and strongly influenced the definition of ISO standard Prolog.
Abduktionslogische Programmierung
Abduktionslogische Programmierung is an extension of normal Logic Programming that allows some predicates, declared as abducible predicates, to be "open" or undefined. A clause in an abductive logic program has the form:
- H:- b1, …, Bn, EIN1, …, EINn.
wo H is an atomic formula that is not abducible, all the Bi are literals whose predicates are not abducible, and the Ai are atomic formulas whose predicates are abducible. The abducible predicates can be constrained by integrity constraints, which can have the form:
- Falsch:- l1, …, Ln.
bei dem die Li are arbitrary literals (defined or abducible, and atomic or negated). Zum Beispiel:
kann fliegen(X) :- Vogel(X), normal(X). FALSCH :- normal(X), verwundet(X). Vogel(John). Vogel(Maria). verwundet(John).
where the predicate normal is abducible.
Problem-solving is achieved by deriving hypotheses expressed in terms of the abducible predicates as solutions to problems to be solved. These problems can be either observations that need to be explained (as in classical Abduktion) or goals to be solved (as in normal logic programming). For example, the hypothesis normal(mary) explains the observation canfly(mary). Moreover, the same hypothesis entails the only solution X = Mary of the goal of finding something which can fly:
:- kann fliegen(X).
Abductive logic programming has been used for fault diagnosis, planning, natural language processing and machine learning. It has also been used to interpret Negation as Failure as a form of abductive reasoning.
Metalogische Programmierung
Because mathematical logic has a long tradition of distinguishing between object language and Metallanguage, logic programming also allows metalevel programming. The simplest metalogic program is the so-called "Vanille" meta-interpreter:
lösen(Stimmt). lösen((A,B)):- lösen(A),lösen(B). lösen(A):- Klausel(A,B),lösen(B).
where true represents an empty conjunction, and clause(A,B) means that there is an object-level clause of the form A :- B.
Metalogic programming allows object-level and metalevel representations to be combined, as in natural language. It can also be used to implement any logic which is specified as Inferenzregeln. Metalogic is used in logic programming to implement metaprograms, which manipulate other programs, databases, knowledge bases or axiomatic theories as data.
Einschränkung der Logikprogrammierung
Einschränkung der Logikprogrammierung combines Horn clause logic programming with constraint solving. It extends Horn clauses by allowing some predicates, declared as constraint predicates, to occur as literals in the body of clauses. A constraint logic program is a set of clauses of the form:
- H :- C1, …, Cn ◊ B1, …, Bn.
wo H und alle Bi are atomic formulas, and the Ci are constraints. Declaratively, such clauses are read as ordinary logical implications:
- H if C1 and … and Cn und B1 und… und bn.
However, whereas the predicates in the heads of clauses are defined by the constraint logic program, the predicates in the constraints are predefined by some domain-specific model-theoretic structure or theory.
Procedurally, subgoals whose predicates are defined by the program are solved by goal-reduction, as in ordinary logic programming, but constraints are checked for satisfiability by a domain-specific constraint-solver, which implements the semantics of the constraint predicates. An initial problem is solved by reducing it to a satisfiable conjunction of constraints.
The following constraint logic program represents a toy temporal database of john's history as a teacher:
lehrt(John, Hardware-, T) :- 1990 ≤ T, T < 1999. lehrt(John, Software, T) :- 1999 ≤ T, T < 2005. lehrt(John, Logik, T) :- 2005 ≤ T, T ≤ 2012. Rang(John, Lehrer, T) :- 1990 ≤ T, T < 2010. Rang(John, Professor, T) :- 2010 ≤ T, T < 2014.
Hier ≤ und < are constraint predicates, with their usual intended semantics. The following goal clause queries the database to find out when John both taught Logik und war a Professor:
- :- teaches(john, logic, T), rank(john, professor, T).
Die Lösung ist 2010 ≤ T, T ≤ 2012.
Constraint logic programming has been used to solve problems in such fields as Tiefbau, Maschinenbau, Digitaler Schaltung Überprüfung, automated timetabling, Luftraumüberwachungund Finanzen. It is closely related to abductive logic programming.
Gleichzeitige logische Programmierung
Concurrent logic programming integrates concepts of logic programming with gleichzeitige Programmierung. Its development was given a big impetus in the 1980s by its choice for the systems programming language of the Japanese Fifth Generation Project (FGCS).[14]
A concurrent logic program is a set of guarded Hornklauseln of the form:
- H :- G1, …, Gn | B1, …, Bn.
The conjunction G1, ... , Gn wird genannt bewachen of the clause, and | is the commitment operator. Declaratively, guarded Horn clauses are read as ordinary logical implications:
- H if G1 and … and Gn und B1 und… und bn.
However, procedurally, when there are several clauses whose heads H match a given goal, then all of the clauses are executed in parallel, checking whether their guards G1, ... , Gn halt. If the guards of more than one clause hold, then a committed choice is made to one of the clauses, and execution proceeds with the subgoals B1, ..., Bn of the chosen clause. These subgoals can also be executed in parallel. Thus concurrent logic programming implements a form of "don't care nondeterminism", rather than "don't know nondeterminism".
For example, the following concurrent logic program defines a predicate shuffle(Left, Right, Merge) , which can be used to shuffle two lists Links und Recht, combining them into a single list Verschmelzen that preserves the ordering of the two lists Links und Recht:
Mischen([], [],, []). Mischen(Links, Recht, Verschmelzen) :- Links = [Zuerst | Sich ausruhen] | Verschmelzen = [Zuerst | ShortMerge], Mischen(Sich ausruhen, Recht, ShortMerge). Mischen(Links, Recht, Verschmelzen) :- Recht = [Zuerst | Sich ausruhen] | Verschmelzen = [Zuerst | ShortMerge], Mischen(Links, Sich ausruhen, ShortMerge).
Hier, [] represents the empty list, and [Head | Schwanz] represents a list with first element Kopf followed by list Schwanz, as in Prolog. (Notice that the first occurrence of | in the second and third clauses is the list constructor, whereas the second occurrence of | is the commitment operator.) The program can be used, for example, to shuffle the lists [ace, queen, king] und [1, 4, 2] by invoking the goal clause:
Mischen[As, Königin, König], [1, 4, 2], Verschmelzen).
The program will non-deterministically generate a single solution, for example Merge = [ace, queen, 1, king, 4, 2].
Arguably, concurrent logic programming is based on message passing, so it is subject to the same indeterminacy as other concurrent message-passing systems, such as Schauspieler (sehen Unbestimmtheit bei gleichzeitiger Berechnung). Carl Hewitt has argued that concurrent logic programming is not based on logic in his sense that computational steps cannot be logically deduced.[15] However, in concurrent logic programming, any result of a terminating computation is a logical consequence of the program, and any partial result of a partial computation is a logical consequence of the program and the residual goal (process network). Thus the indeterminacy of computations implies that not all logical consequences of the program can be deduced.[Neutralität ist umstritten]
Gleichzeitige Einschränkung der Logikprogrammierung
Gleichzeitige Einschränkung der Logikprogrammierung combines concurrent logic programming and Einschränkung der Logikprogrammierung, using constraints to control concurrency. A clause can contain a guard, which is a set of constraints that may block the applicability of the clause. When the guards of several clauses are satisfied, concurrent constraint logic programming makes a committed choice to use only one.
Induktive Logikprogrammierung
Inductive logic programming is concerned with generalizing positive and negative examples in the context of background knowledge: maschinelles Lernen of logic programs. Recent work in this area, combining logic programming, learning and probability, has given rise to the new field of statistical relational learning und probabilistic inductive logic programming.
Logische Programmierung höherer Ordnung
Several researchers have extended logic programming with higher-order programming features derived from Logik höherer Ordnung, such as predicate variables. Such languages include the Prolog extensions Hilog und λprolog.
Lineare logische Programmierung
Basing logic programming within lineare Logik hat zum Design von logischen Programmiersprachen geführt, die wesentlich ausdrucksvoller sind als solche, die auf klassischer Logik basieren. Horn -Klauselprogramme können nur eine staatliche Änderung durch die Änderung der Argumente zu Prädikaten darstellen. Bei der linearen logischen Programmierung kann man die lineare Ambient -Logik verwenden, um die Zustandsänderung zu unterstützen. Einige frühe Entwürfe von logischen Programmiersprachen basieren auf linearer Logik, lo [Andreoli & Preschi, 1991], Lolli,[16] ACL,[17] and Forum [Miller, 1996]. Forum provides a goal-directed interpretation of all of linear logic.
Objektorientierte logische Programmierung
F-Logic Erweitert die logische Programmierung mit Objekten und der Frame -Syntax.
Logtalk Erweitert die Prolog -Programmiersprache mit Unterstützung von Objekten, Protokollen und anderen OOP -Konzepten. Es unterstützt die meisten standardmäßigen Prolog-Systeme als Backend-Compiler.
Transaktionslogikprogrammierung
Transaktionslogik ist eine Erweiterung der logischen Programmierung mit einer logischen Theorie staatlich modifizierender Aktualisierungen. Es hat sowohl eine modell-theoretische Semantik als auch eine prozedurale. Eine Implementierung einer Teilmenge der Transaktionslogik ist in der verfügbar Flora-2 System. Andere Prototypen sind auch verfügbar.
Siehe auch
- Automatisierter Theorem beweisen
- Einschränkung der Logikprogrammierung
- Kontrolltheorie
- Datenprotokoll
- Fril
- Funktionelle Programmierung
- Fuzzy Logic
- Induktive Logikprogrammierung
- Logik in der Informatik (einschließlich Formale Methoden)
- Logic programming languages
- Programmierbare Steuerung
- R ++
- Argumentationssystem
- Regelbasiertes maschinelles Lernen
- Erfüllbarkeit
- Lineare Logik
Zitate
- ^ a b T. Winograd (1972). "Natürliche Sprache verstehen". Kognitive Psychologie. 3 (1): 1–191. doi:10.1016/0010-0285 (72) 90002-3.
- ^ Grün, Cordell. Anwendung des Satzes, der sich der Problemlösung beweist (PDF). Ijcai 1969.
- ^ J. M. Foster und E. W. Elcock. ABSSYS 1: Ein inkrementeller Compiler für Behauptungen: Eine Einführung, Machine Intelligence 4, Edinburgh U Press, 1969, S. 423–429
- ^ Hewitt, Carl. Planer: Eine Sprache, um Theoreme bei Robotern zu beweisen (PDF). Ijcai 1969.
- ^ Pat Hayes. Berechnung und Abzug. In Proceedings des 2. MFCS -Symposiums. Tschechoslowakakademie der Wissenschaften, 1973, S. 105–118.
- ^ a b Robert Kowalski, "Prädikatlogik als Programmiersprache", Memo 70, Abteilung für künstliche Intelligenz, Universität Edinburgh, 1973. Auch in Proceedings IFIP Congress, Stockholm, North Holland Publishing Co., 1974, S. 569–574.
- ^ Robert Kowalski und Donald und Kueher, "Lineare Auflösung mit Auswahlfunktion", Künstliche Intelligenz, Vol. 2, 1971, S. 227–60.
- ^ Shapiro, Ehud (1989). Die Familie der gleichzeitigen logischen Programmiersprachen (PDF). Internationale Sommerschule für Logik, Algebra und Berechnung. Archiviert (PDF) Aus dem Original am 23. Februar 2017. Erschien auch in Shapiro, E. (1989). "Die Familie der gleichzeitigen logischen Programmiersprachen". ACM Computing -Umfragen. 21 (3): 413–510. Citeseerx 10.1.1.73.8108. doi:10.1145/72551.72555. S2CID 2497630.
- ^ Sáenz-Perez, Fernando; Caballero, Rafael; García-Ruiz, Yolanda (Dezember 2011). Eine deduktive Datenbank mit Datalog- und SQL -Abfragesprache (PDF). Asiatisches Symposium für Programmiersprachen und -systeme. Springer. S. 66–73.
- ^ Van Emden, M.H. und Kowalski, R. A., 1976. Die Semantik der Prädikatlogik als Programmiersprache. Journal of the ACM (JACM), 23 (4), S. 733-742.
- ^ R.A.Kowalski (Juli 1979). "Algorithmus = Logic + Control". Kommunikation der ACM. 22 (7): 424–436. doi:10.1145/359131.359136. S2CID 2509896.
- ^ Prakken, H. und Sartor, G., 2015. Recht und Logik: Eine Überprüfung aus einer Argumentationsperspektive. Künstliche Intelligenz, 227, 214–245.
- ^ Sergot, M. J., Sadri, F., Kowalski, R. A., Kriwaczek, F., Hammond, P. und Cory, H. T., 1986. Das britische Nationalitätsvorgang als Logikprogramm. Kommunikation des ACM, 29 (5), 370–386.
- ^ Shunichi Uchida und Kazuhiro Fuchi. Verfahren des FGCS Project Evaluation Workshops. Institute for New Generation Computer Technology (ICOT). 1992.
- ^ Hewitt, Carl (27. April 2016). "Inkonsistenz Robustheit für Logikprogramme". HAL Archive. S. 21–26. Abgerufen 7. November 2016.
- ^ Joshua Hodas und Dale Miller, "Logikprogrammierung in einem Fragment intuitionistischer linearer Logik",", Informationen und Berechnung, 1994, 110 (2), 327–365.
- ^ Naoki Kobayashi und Akinori Yonezawa, "Asynchrones Kommunikationsmodell basierend auf der linearen Logik", US/Japan Workshop über paralleles symbolisches Computing, 1994, 279–294.
Quellen
Allgemeine Einführung
- Baral, C.; Gelfond, M. (1994). "Logische Programmierung und Wissensrepräsentation" (PDF). Das Journal of Logic Programming. 19–20: 73–148. doi:10.1016/0743-1066 (94) 90025-6.
- Kowalski, R. A. (1988). "Die frühen Jahre der logischen Programmierung" (PDF). Kommunikation der ACM. 31: 38–43. doi:10.1145/35043.35046. S2CID 12259230. [1]
- Lloyd, J. W. (1987). Grundlagen der logischen Programmierung. (2. Auflage). Springer-Verlag.
Andere Quellen
- John McCarthy. "Programme mit gesundem Menschenverstand". Symposium zur Mechanisierung von Denkprozessen. Nationales physisches Labor. Teddington, England. 1958.
- Miller, Dale; Nadathur, Gopalan; Pfenning, Frank; Scedrov, Andre (1991). "Einheitliche Beweise als Grundlage für die Logikprogrammierung". Annalen der reinen und angewandten Logik. 51 (1–2): 125–157. doi:10.1016/0168-0072 (91) 90068-W.
- Ehud Shapiro (Herausgeber). Gleichzeitiger Prolog. MIT Press. 1987.
- James Slagle. "Experimente mit einem deduktiven Frage-Antwort-Programm". CACM. Dezember 1965.
- Gabbay, Dov M.; Hogger, Christopher John; Robinson, J.A., Hrsg. (1993-1998). Handbuch der Logik in künstlicher Intelligenz und Logikprogrammierung.Vols. 1–5, Oxford University Press.
Weitere Lektüre
- Carl Hewitt. "Verfahrensbettung von Wissen in den Planer". Ijcai 1971.
- Carl Hewitt. "Der wiederholte Niedergang der logischen Programmierung und warum es wiedergeboren wird". AAAI Spring Symposium: Was schief gelaufen ist und warum: Lehren aus AI -Forschung und Anwendungen 2006: 2–9.
- Evgeny Dantsin, Thomas Eiter, Georg Gottlob, Andrei Voronkov: Komplexität und ausdrucksstarke Kraft der logischen Programmierung. ACM Comput. Überleben. 33 (3): 374–425 (2001)
- Ulf Nilsson und Jan Maluszynski, Logik, Programmierung und Prolog
Externe Links
- Logikprogrammierung Eintrag virtueller Bibliothek
- Bibliografien zur Logikprogrammierung
- Assoziation für Logikprogrammierung (ALP)
- Theorie und Praxis der Logikprogrammierung (Tagebuch)
- Logikprogrammierung in C ++ mit Castor
- Logikprogrammierung in Oz
- Prolog Development Center
- Racklog: Logikprogrammierung im Schläger