Zum Inhalt springen

„Logische Programmierung“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
[gesichtete Version][gesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
K Einsatzgebiete: Präziser. Anwendungen sind auch in der eigtl. Linguistik denkbar, aber diese Beispiele eher nicht. KI einmal raus, weil doppelt u. dreifach.
Sprachlich gestrafft; einen Grammatikfehler verbessert, Füllwörter, Selbstverständlichkeiten und Anekdoten getilgt.
Zeile 1: Zeile 1:
'''Logische Programmierung''' (''Prädikative Programmierung'') ist ein [[Programmierparadigma]], das auf der [[Mathematische Logik|mathematischen Logik]] beruht. Anders als bei der [[Imperative Programmierung|imperativen Programmierung]] besteht ein Logik-Programm nicht aus einer Folge von Anweisungen, sondern aus einer Menge von [[Axiom]]en, welche hier als eine reine Ansammlung von Fakten oder Annahmen zu verstehen sind. Stellt der Benutzer eines Logik-Programms eine Anfrage, so versucht der [[Interpreter]] die Lösungsaussage allein aus den Axiomen zu berechnen.
'''Logische Programmierung''' (''Prädikative Programmierung'') ist ein [[Programmierparadigma]], das auf der [[Mathematische Logik|mathematischen Logik]] beruht. Anders als bei der [[Imperative Programmierung|imperativen Programmierung]] besteht ein Logik-Programm nicht aus einer Folge von Anweisungen, sondern aus einer Menge von [[Axiom]]en, welche hier als eine Ansammlung von Fakten oder Annahmen zu verstehen ist. Stellt der Benutzer eines Logik-Programms eine Anfrage, so versucht der [[Interpreter]], die Lösungsaussage allein aus den Axiomen zu berechnen.


Dazu werden eine Menge von so genannten ''Regeln'' und Anweisungen, die der Syntax gemäß aufgebaut sind, ''zusammen'' mit der Information, ''welche'' Lösungsmethode vorgesehen ist, in den Programmcode eingefügt. Logische Programmiersprachen gehören zu den [[Deklarative Programmierung|deklarativen Programmiersprachen]] und haben ihre Ursprünge im Forschungsgebiet [[Künstliche Intelligenz]].
Dazu werden eine Menge von so genannten ''Regeln'' und Anweisungen, die der Syntax gemäß aufgebaut sind zusammen mit der Information, welche Lösungsmethode vorgesehen ist, in den Programmcode eingefügt. Logische Programmiersprachen gehören zu den [[Deklarative Programmierung|deklarativen Programmiersprachen]] und haben ihre Ursprünge im Forschungsgebiet [[Künstliche Intelligenz]].


In einem [[Imperative Programmiersprache|imperativen Programm]] wird genau beschrieben, ''wie'' und ''in welcher Reihenfolge'' ein Problem zu lösen ist. Im Gegensatz dazu wird in einem logikbasierten Programm idealerweise nur beschrieben, ''was'' gilt. Das ''Wie'' ist bereits durch die Lösungsmethode vorgegeben. Die Lösung wird aus den vorhandenen Regeln [[Deduktion|hergeleitet]]. Meistens wird schon nur eine Menge von Regeln als „Programm“ bezeichnet, wenn klar ist, welche Lösungsmethode dazugehört: Nämlich die (einzige) in der vom [[Regelbasiertes System|regelbasierten System]] bereitgestellten [[Inferenzmaschine]] verwirklichte.
In einem [[Imperative Programmiersprache|imperativen Programm]] wird genau beschrieben, wie und in welcher Reihenfolge ein Problem zu lösen ist. Im Gegensatz dazu wird in einem logikbasierten Programm beschrieben, was gilt. Das Wie ist durch die Lösungsmethode vorgegeben. Die Lösung wird aus den Regeln [[Deduktion|hergeleitet]].


Die bekannteste logische Programmiersprache ist [[Prolog (Programmiersprache)|Prolog]].
Die bekannteste logische Programmiersprache ist [[Prolog (Programmiersprache)|Prolog]].


== Erläuterungen ==
== Erläuterungen ==
Die '''Syntax''' gibt an, wie Regeln geschrieben werden müssen, damit der Computer sie verwenden kann. '''Regeln''' sind „Falls-dann“-Aussagen und Fakten, die das Wissen zu einem Problemkreis beschreiben. Daneben gibt es oft noch spezielle Konstrukte, um die Lösungsmethode zu beeinflussen. Am bekanntesten ist die Rückwärtsabschneidung (engl. ''cut'') in Prolog, womit z. B. „Falls-dann-außer“-Regeln modelliert werden.
Die '''Syntax''' gibt an, wie Regeln geschrieben werden müssen, damit der Computer sie verwenden kann. '''Regeln''' sind Wenn-Dann-Aussagen und Fakten, die das Wissen zu einem Problemkreis beschreiben. Daneben gibt es spezielle Konstrukte, um die Lösungsmethode zu beeinflussen. Am bekanntesten ist die Rückwärtsabschneidung (engl. ''cut'') in Prolog, womit z. B. Ausnahmeregeln modelliert werden.


Einem regelbasierten Programm kann man '''Fragen''' (engl. ''query'') stellen, indem man ein '''Ziel''' (engl. ''goal'') vorgibt. Das entspricht grob gesehen dem Aufruf einer Funktion oder Prozedur in imperativen Programmiersprachen.
Einem regelbasierten Programm kann man '''Fragen''' (engl. ''query'') stellen, indem man ein '''Ziel''' (engl. ''goal'') vorgibt.


Die '''Lösungsmethode''' gibt vor, wie die Inferenzmaschine die Regeln (den Programmtext) interpretiert, um die Frage zu beantworten. In Prolog wird eine [[Tiefensuche]] (engl. ''depth first'') mit [[Unifikation (Logik)|Unifikation]] und [[Backtracking]] verwendet. Jedoch sind auch andere Methoden geeignet und werden je nach Anwendungsfall auch eingesetzt.
Die '''Lösungsmethode''' gibt vor, wie die Inferenzmaschine die Regeln interpretiert, um die Frage zu beantworten. In Prolog wird eine [[Tiefensuche]] (engl. ''depth first'') mit [[Unifikation (Logik)|Unifikation]] und [[Backtracking]] verwendet. Auch andere Methoden sind geeignet und werden je nach Anwendungsfall auch eingesetzt.

== Besonderheiten logischer Programmiersprachen ==
{{überarbeiten}}
Logikorientierte Programmiersprachen haben ungewöhnliche Eigenschaften (Backtracking, Unifikationsalgorithmen), die sie für gewisse Arten von Problemen prädestiniert, die mit anderen Programmiersprachen schwerer zu lösen sind.

Da logische Programmiersprachen zu den deklarativen Programmiersprachen gehören, treffen deren Besonderheiten zu.

<!-- *Das folgende sind anekdotische Halbwahrheiten. Bitte belegen und begründen oder endgültig streichen:*
Durch den Austausch der Lösungsmethode wird ein und derselbe Programmtext auf verschiedene Weise abgearbeitet. Ist ein logisches Programm so aufgebaut, dass es Nebenwirkungen (engl. ''side effects'') erzeugt, werden diese je nach verwendeter Lösungsmethode unterschiedlich sein.

Die Verbesserung und Spezialisierung der Lösungsmethode ist seit den 1980'er Jahren ein "Dauerbrenner" in der Forschung auf einigen Gebieten der Künstlichen Intelligenz.

Regelbasierte Sprachen haben auch eine starke [[funktionale_Programmiersprache|funktionale]] und eine [[prozedurale_Programmiersprache|prozedurale]] Interpretation.
Mit Abstrichen und geringem Zusatzaufwand ist auch [[objektorientierte_Programmiersprache|objektorientiertes Programmieren]] in einer typischen regelbasierten Sprache möglich.

Regelbasierte Programme sind sehr gut geeignet, auf [[Parallelrechner]]n mit entsprechender Geschwindigkeitssteigerung zu laufen. Diese Erkenntnis führte zur Entwicklung von [[Parlog_(Programmiersprache)|Parlog]].

Bis zu einem gewissen Grad der [[Komplexität]] lassen sich regelbasierte Programme sehr einfach durch Hinzufügen neuer Regeln erweitern und vergrößern dabei ihre [[Funktionalität]] oft [[überproportional]]. Diese Eigenschaft ist bei den "abstrakteren" regelbasierten und funktionalen Sprachen besser als bei anderen, "konkreteren" Programmiersprachen. Deshalb eignen sich regelbasierte Sprachen gut für die Entwicklung von Software-Prototypen und [[Prototyping (Softwareentwicklung)|Prototyping]].

Ist jedoch eine gewisse Komplexität erreicht, lassen sich regelbasierte Programme nur noch mit großem Aufwand erweitern: Es wird immer komplizierter, sinnvolle Regeln zu schreiben, die den schon vorhandenen Regeln nicht widersprechen. Dieser Punkt wird bei modernen objektorientierten Sprachen in der Regel später erreicht, da diese bessere Kapselungsmechanismen haben.

Denn die Regeln eines regelbasierten Programms müssen bestimmten [[Markierungsalgorithmus|mathematischen Anforderungen]] genügen, damit sie informationstechnisch verwertbar sind. Auch müssen sie frei von Widersprüchen sein. Wir unterscheiden aber in vielen Sachgebieten nicht zwischen solchen "mathematisch sauberen" und "unsauberen" Regeln. Viele der uns bekannten Zusammenhänge können wir nur in "unsauberen" Regeln in natürlicher Sprache fassen; entsprechende "mathematisch saubere" Regeln kennen wir oft gar nicht. Zwangsläufig finden sich also "unsaubere" Regeln in unseren Programmen, zumindest wenn die Domäne des Programms nicht die Mathematik ist.

Die Bemühungen der Forschung haben u.&nbsp;a. zu Ziel, Inferenzmaschinen zu entwerfen, die mit "unsauberen" Regeln genauso gut umgehen wie der Mensch [vergl. [[Fuzzy-Logik]]].

Seit den 1990er Jahren vermischen sich regelbasierte Sprachen mit Programmiersprachen anderer Paradigmen, um die Effizienz der Programme und Ausdruckskraft der Programmiersprache zu erhöhen.
-->


== Beispiel ==
== Beispiel ==
Dieses Beispiel ist in natürlicher Sprache formuliert, um das Prinzip aufzuzeigen. Die konkrete Anwendung kann man bei der Programmiersprache Prolog ersehen.
Dieses Beispiel ist in natürlicher Sprache formuliert, um das Prinzip aufzuzeigen.

Fakten:
Fakten:


Zeile 63: Zeile 35:


:''Lucia''
:''Lucia''

Dieses unspektakuläre Beispiel kann man gedanklich leicht um andere Verwandtschaftsbeziehungen erweitern.


== Einsatzgebiete ==
== Einsatzgebiete ==


Typische Einsatzgebiete sind Simulatoren, Generatoren, sowie Systeme zur Diagnose und Prognose. Anwendungen der Logikprogrammierung finden sich beispielsweise in folgenden Bereichen:
Typische Einsatzgebiete sind Simulatoren, Generatoren, sowie Systeme zur Diagnose und Prognose. Anwendungen der Logikprogrammierung finden sich in folgenden Bereichen:
* Künstliche Intelligenz
* Künstliche Intelligenz
* [[Datenbank]]en
* [[Datenbank]]en

Version vom 31. Januar 2015, 12:43 Uhr

Logische Programmierung (Prädikative Programmierung) ist ein Programmierparadigma, das auf der mathematischen Logik beruht. Anders als bei der imperativen Programmierung besteht ein Logik-Programm nicht aus einer Folge von Anweisungen, sondern aus einer Menge von Axiomen, welche hier als eine Ansammlung von Fakten oder Annahmen zu verstehen ist. Stellt der Benutzer eines Logik-Programms eine Anfrage, so versucht der Interpreter, die Lösungsaussage allein aus den Axiomen zu berechnen.

Dazu werden eine Menge von so genannten Regeln und Anweisungen, die der Syntax gemäß aufgebaut sind zusammen mit der Information, welche Lösungsmethode vorgesehen ist, in den Programmcode eingefügt. Logische Programmiersprachen gehören zu den deklarativen Programmiersprachen und haben ihre Ursprünge im Forschungsgebiet Künstliche Intelligenz.

In einem imperativen Programm wird genau beschrieben, wie und in welcher Reihenfolge ein Problem zu lösen ist. Im Gegensatz dazu wird in einem logikbasierten Programm beschrieben, was gilt. Das Wie ist durch die Lösungsmethode vorgegeben. Die Lösung wird aus den Regeln hergeleitet.

Die bekannteste logische Programmiersprache ist Prolog.

Erläuterungen

Die Syntax gibt an, wie Regeln geschrieben werden müssen, damit der Computer sie verwenden kann. Regeln sind Wenn-Dann-Aussagen und Fakten, die das Wissen zu einem Problemkreis beschreiben. Daneben gibt es spezielle Konstrukte, um die Lösungsmethode zu beeinflussen. Am bekanntesten ist die Rückwärtsabschneidung (engl. cut) in Prolog, womit z. B. Ausnahmeregeln modelliert werden.

Einem regelbasierten Programm kann man Fragen (engl. query) stellen, indem man ein Ziel (engl. goal) vorgibt.

Die Lösungsmethode gibt vor, wie die Inferenzmaschine die Regeln interpretiert, um die Frage zu beantworten. In Prolog wird eine Tiefensuche (engl. depth first) mit Unifikation und Backtracking verwendet. Auch andere Methoden sind geeignet und werden je nach Anwendungsfall auch eingesetzt.

Beispiel

Dieses Beispiel ist in natürlicher Sprache formuliert, um das Prinzip aufzuzeigen. Fakten:

Lucia ist die Mutter von Minna.
Lucia ist die Mutter von Klaus.
Minna ist die Mutter von Nadine.

Regel:

Falls X ist die Mutter von Y und Y ist die Mutter von Z Dann X ist die Großmutter von Z.

Frage/Ziel:

Wer ist die Großmutter von Nadine?

Antwort des Computers, Folgerung aus den Fakten und Regeln:

Lucia

Einsatzgebiete

Typische Einsatzgebiete sind Simulatoren, Generatoren, sowie Systeme zur Diagnose und Prognose. Anwendungen der Logikprogrammierung finden sich in folgenden Bereichen:

Beispiele außerhalb der Informatik:

Auf dem Gebiet der Informatik und Computertechnik:

  • Antwortmengenprogrammierung (PDF) – knapper Überblick von der Entwicklung der klassischen Logik hin zur logischen Programmierung (110 kB)
  • XSB (englisch) Logik-System und Deduktive Datenbank (Open Source)