Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

informatik-buch:grundlagen_der_programmierung:logische_programmierung [2009/04/26 19:51] (aktuell)
Zeile 1: Zeile 1:
 +====== Logische Programmierung ======
 +Als ob ein vernünftiger Quelltext nicht immer logisch wäre! - Ja OK, so ist es natürlich nicht gemeint. Es um ein vollständig anderes Programmier-Paradigma. Die Sprache, die wir zur logischen Programmierung verwendet haben heißt Prolog. ​
  
 +Kurze Vorbemerkung:​
 +^ Prämisse ​ | Voraussetzung oder Annahme |
 +^ Konklusion ​ | Folgerung aus den Prämissen |
 +^ Modus ponens ​ | Schlussregel |
 +Hier kommt Schluss nicht von Ende, sondern von implizieren.
 +
 +===== Vorgehensweise =====
 +  - **Wissensbasis** aufstellen
 +    - direkte Angaben durch **Fakten**: ''​Prädikat(Konstante).''​
 +    - indirekte Angaben durch **Regeln**: ''​Regelkopf :- Regelrumpf.'' ​
 +  - **Anfrage** formulieren
 +
 +Hinweise:
 +  * **:-** Implikation
 +  * **,** Konjunktion (UND)
 +  * **;** Disjunktion (ODER)
 +  * Alle Worte mit großem Anfangsbuchstaben sind Variablen.
 +
 +
 +===== Fakten und Regeln =====
 +
 +^ Modellierungsansatz ​ ^^
 +| Eine (Mini-)Welt besteht aus **Objekten** (Personen, Gegenständen,​ ...), \\ die **Eigenschaften** haben und in **Beziehung** zueinander stehen. | **Objekte**:​ Hera, Zeus. \\  **Eigenschaften**:​ weiblich, männlich. \\ **Beziehung**:​ ist verheiratet mit. |
 +| Objekte werden mit **Konstanten** (allg. mit Termen) beschrieben,​ \\ Eigenschaften und Beziehungen mit Hilfe von **Prädikaten**. | **Konstanten**:​ Zeus, Hera. \\ **Prädikate**:​ weiblich, männlich, verheiratet. |
 +| Sachverhalte der Miniwelt können \\ direkt mit Hilfe von **Fakten** beschrieben werden.| **Fakten: Prädikat(Konstanten)** \\ weiblich(hera). \\ maennlich(zeus). \\ verheiratet(zeus,​hera). \\ weiblich(maja). \\ kind(hermes,​ zeus). \\ kind(hermes,​ maja). ​ |
 +| Sachverhalte der Miniwelt können \\ auch indirekt mit Hilfe von **Regeln** beschrieben werden. | **Regeln**: \\ vater(X, Y) :- kind(Y, X), maennlich(X). \\ mutter(X, Y) :- kind(Y, X), weiblich(X). |
 +
 +
 +
 +==== Regeln ====
 +
 +  * Regeln sind Wenn-Dann-Aussagen:​ (siehe Tabelle oben)
 +<​file>​
 +  X ist Vater von Y, wenn Y ein Kind von X ist und X männlich ist. 
 +  X ist Mutter von Y, wenn Y Kind von X ist und X weiblich ist.
 +</​file>​
 +  * **rekursive Regeln** \\ Das Prädikat im Regelkopf darf im Regelrumpf vorkommen: ​
 +<​file>​
 +vorfahr(X, Y) :- kind(Y, X).
 +vorfahr(X, Y) :- kind(Y, Z), vorfahr(X, Z).
 +</​file>​
 +  * Regeln mit dem gleichen Regelkopf bilden eine **Disjunktion**,​ werden also mit **oder** verknüpft. Man kann statt dessen die Regelrümpfe auch mit Semikolon getrennt hintereinander schreiben.
 +  * Zwei Aussagen (zwei **goals**), die durch Komma getrennt werden, bilden eine Konjunktion,​ werden als mit **und** verknüpft.
 +
 +
 +===== Beispiele =====
 +
 +Ein Familienbeispiel:​
 +<code prolog>
 +maennlich(lucas).
 +maennlich(linus).
 +maennlich(claudius).
 +weiblich(birgit).
 +verheiratet(birgit,​claudius).
 +
 +
 +eltern(birgit,​linus).
 +eltern(claudius,​lucas).
 +
 +eltern(X,​Y):​-verheiratet(X,​Z),​eltern(Z,​Y).
 +eltern(X,​Y):​-verheiratet(Z,​X),​eltern(Z,​Y).
 +</​code>​
 +
 +Abfrageergebnis:​
 +
 +<​code>​
 +?- eltern(claudius,​X).
 +X = lucas n
 +X = linus n
 +X = lucas n
 +X = linus n
 +X = lucas n
 +X = linus n
 +X = lucas n
 +X = linus n
 +X = lucas n
 +X = linus n
 +...
 +</​code>​
 +
 +
 +
 +Die Rettung:
 +
 +<code prolog>
 +maennlich(lucas).
 +maennlich(linus).
 +maennlich(claudius).
 +weiblich(birgit).
 +verheiratet(birgit,​claudius).
 +
 +
 +kind(linus,​birgit).
 +kind(lucas,​claudius).
 +
 +eltern(X,​Y):​-kind(Y,​X).
 +eltern(X,​Y):​-verheiratet(X,​Z),​kind(Y,​Z).
 +eltern(X,​Y):​-verheiratet(Z,​X),​kind(Y,​Z).
 +</​code>​
 +
 +Abfrageergebnis:​
 +<​code>​
 +?- eltern(claudius,​X).
 +X = lucas n
 +X = linus n
 +false.
 +
 +?- 
 +</​code>​
 +
 +Rekursion ist in Prolog zwar möglich, jedoch muss sie auch hier abbrechen um Endlosschleifen zu verhindern.
Falls nicht anders bezeichnet, ist der Inhalt dieses Wikis unter der folgenden Lizenz veröffentlicht: CC Attribution-Noncommercial-Share Alike 4.0 International