51
Logische Programmierung Einf¨ uhrende Beispiele Verwandschaftsbeziehungen in Prolog vater(peter,maria). mutter(susanne,maria). vater(peter,monika). mutter(susanne,monika). vater(karl, peter). mutter(elisabeth, peter). vater(karl, pia). mutter(elisabeth, pia). vater(karl, paul). mutter(elisabeth, paul). KI, SS 06, F ol7, Seite 1, 8. Juni2006

Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Logische Programmierung

Einfuhrende Beispiele

Verwandschaftsbeziehungen in Prolog

vater(peter,maria).

mutter(susanne,maria).

vater(peter,monika).

mutter(susanne,monika).

vater(karl, peter).

mutter(elisabeth, peter).

vater(karl, pia).

mutter(elisabeth, pia).

vater(karl, paul).

mutter(elisabeth, paul).

KI, SS 06, Fol7, Seite 1, 8. Juni2006

Page 2: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Logische Programmierung

Einfuhrende Beispiele

frau(maria).

frau(elisabeth).

frau(susanne).

frau(monika).

frau(pia).

mann(peter).

mann(karl).

mann(paul).

KI, SS 06, Fol7, Seite 2, 8. Juni2006

Page 3: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Prolog: einfuhrendes Beispiel

eltern(X,Y) :- vater(X,Y).

eltern(X,Y) :- mutter(X,Y).

%%%%% einfach aber nicht terminierend

vorfahrtrans(X,Y) :- eltern(X,Y).

vorfahrtrans(X,Z) :- vorfahrtrans(X,Y),vorfahrtrans(Y,Z).

%%%%% einfach und terminierend

vorfahr(X,Y) :- eltern(X,Y).

vorfahr(X,Z) :- eltern(X,Y),vorfahr(Y,Z).

bruder(X,Y) :- mann(X),vater(Z,X),vater(Z,Y),

not(X == Y), mutter(M,X),mutter(M,Y).

schwester(X,Y) :- frau(X),vater(Z,X),vater(Z,Y),

not(X == Y),mutter(M,X),mutter(M,Y).

geschwister(X,Y) :- vater(Z,X),vater(Z,Y),

not(X == Y),mutter(M,X),mutter(M,Y).

KI, SS 06, Fol7, Seite 3, 8. Juni2006

Page 4: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Prolog: Graph-Beispiel

ungerichteter Graph.

a b

c d

e f

g

kante(a,b).

kante(a,c).

kante(c,d).

kante(d,b).

kante(b,e).

kante(f,g).

KI, SS 06, Fol7, Seite 4, 8. Juni2006

Page 5: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Prolog: Graph-Beispiel

verbunden(X,Y) :- kante(X,Y).

verbunden(X,Y) :- kante(Y,X).

verbunden(X,Z) :- kante(X,Y),verbunden(Y,Z).

verbunden(X,Z) :- kante(Y,X),verbunden(Y,Z).

%%% verbunden2 terminiert

verbunden2(X,Y) :- verb(X,Y,[]).

ungkante(X,Y) :- kante(X,Y).

ungkante(X,Y) :- kante(Y,X).

verb(X,Y,_) :- ungkante(X,Y).

verb(X,Z,L) :- ungkante(X,Y), not(member(Y,L)), verb(Y,Z,[Y|L]).

member(X,[X|_]).

member(X,[_|L]) :- member(X,L).

KI, SS 06, Fol7, Seite 5, 8. Juni2006

Page 6: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Prolog: Listen und Mengen

member(X,[X|_]).

member(X,[_|Y]) :- member(X,Y).

append([],X,X).

append([X|R],Y,[X|Z]) :- append(R,Y,Z).

listtoset([],[]).

listtoset([X|R],[X|S]) :- remove(X,R,S1),listtoset(S1,S).

remove(E,[],[]).

remove(E,[E|R],S):- remove(E,R,S).

remove(E,[X|R],[X|S]):- not(E == X), remove(E,R,S).

KI, SS 06, Fol7, Seite 6, 8. Juni2006

Page 7: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Prolog: Listen und Mengen

union(X,Y,Z) :- append(X,Y,XY), listtoset(XY,Z).

intersect([],X,[]).

intersect([X|R],S,[X|T]) :- member(X,S),intersect(R,S,T1),

listtoset(T1,T).

intersect([X|R],S,T) :- not(member(X,S)),intersect(R,S,T1),

listtoset(T1,T).

reverse([],[]).

reverse([X|R],Y) :- reverse(R,RR), append(RR,[X],Y).

reversea(X,Y) :- reverseah(X,[],Y).

reverseah([X|Xs],Acc,Y):- reverseah(Xs,[X|Acc],Y).

reverseah([],Y,Y).

KI, SS 06, Fol7, Seite 7, 8. Juni2006

Page 8: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Grundlagen der logischen Programmierung:

deklarative Programmierung

Theoretische Basis von Prolog: Pradikatenlogik erster Stufe

Ausfuhrung der Programme: Spezialisierung der Resolution.

logischen Programmie sind spezielle Klauseln:

Horn-Klauseln

KI, SS 06, Fol7, Seite 8, 8. Juni2006

Page 9: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Grundlagen der logischen Programmierung

• Eine Hornklausel ist eine Klausel mit maximal einem positiven Li-

teral

• Eine definite Klausel ist eine Klausel mit genau einem positiven

Literal.

D.h. A ∨ ¬B1 ∨ . . . ∨ ¬Bm

oder in Notation der logischen Programmierung:

A ⇐ B1, . . . , Bm bzw. A :- B1, . . . , Bm

Man nennt A den Kopf, {B1, . . . , Bm} den Rumpf der Klausel.

KI, SS 06, Fol7, Seite 9, 8. Juni2006

Page 10: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Grundlagen der logischen Programmierung

• Eine Klausel ohne positive Literale nennt man definites Ziel (An-

frage,Query,goal). Notation:

⇐ B1, . . . , Bn

Die Bi werden Unterziele (Subgoals) genannt.

• Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem

Rumpf. Notation: A ⇐.

KI, SS 06, Fol7, Seite 10, 8. Juni2006

Page 11: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Grundlagen der logischen Programmierung

• Ein definites Programm ist eine Menge von definiten Klauseln.

• Die Menge aller Klauseln, deren Kopfliteral das Pradikat Q hat,

nennen wir Definition von Q.

KI, SS 06, Fol7, Seite 11, 8. Juni2006

Page 12: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Beispiele und Negationen

Folgende Literale der Beispiele passen nicht zur Definition

eines definiten Programms:

not(X == Y)

not(member(Y,L))

not(E == X)

not(member(X,S))

(wird noch besprochen)

KI, SS 06, Fol7, Seite 12, 8. Juni2006

Page 13: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Modell-Eigenschaft der Definiten Programme

Es gilt:

Zu jedem definiten Programm P

gibt es ein eindeutiges kleinstes Modell MP .

• MP besteht aus allen mit Resolution undInstanziierung herleitbaren Grund-Fakten.

• MP entspricht allen Atomen, die das Programm mit”JA“ beantwortet.

KI, SS 06, Fol7, Seite 13, 8. Juni2006

Page 14: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Anfragen an Prolog-Programme

Das definite Ziel

∀x1, . . . , xn : ¬B1 ∨ . . . ∨ ¬Bn

ist aquivalent zu:

¬∃x1, . . . , xn : B1 ∧ . . . ∧Bn

Die Anfrage ist:

∃x1, . . . , xn : B1 ∧ . . . ∧Bn

KI, SS 06, Fol7, Seite 14, 8. Juni2006

Page 15: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Anfragen an Prolog-Programme

Es gilt: fur die Resolution auf Hornklausel-Mengen:

im Falle der Herleitung der leeren Klausel

werden die existierenden Objekte ausgerechnet

D.h. Resolution berechnet Substitutionen,

die Antworten auf die Anfrage sind.

KI, SS 06, Fol7, Seite 15, 8. Juni2006

Page 16: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Anfragen an Prolog-Programme: Beispiel

Fur nicht-Hornklauselnmengen berechnet Resolution nicht immer eine

(eindeutige) Antwort:

Formel: Q(a) ∨Q(b).

Anfrage: ∃x.Q(x).

Die Klauselmenge dazu ist : {{Q(a) ∨Q(b)}, {¬Q(x)}}

Resolution ergibt die leere Klausel.

{x 7→ a}, {x 7→ b} werden beide verwendet!

Q(a) ∨Q(b) hat kein eindeutiges kleinstes Modell!

KI, SS 06, Fol7, Seite 16, 8. Juni2006

Page 17: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

SLD-Resolution

SLD-Resolution

ist eine spezielle Resolutionsstrategie

ist die prozedurale Semantik von definiten Programmen.

definiert die Ausfuhrung von logischen Programmen:

S: Selektions-Funktion

L: Lineare Resolution

D: Definite Klauseln

KI, SS 06, Fol7, Seite 17, 8. Juni2006

Page 18: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

SLD-Resolution

Definition

G = ⇐ A1, . . . , Am, . . . , Ak sei definites Ziel

C = A ⇐ B1, . . . , Bq eine definite Klausel.

Resolutions-Herleitung eines neuen definiten Ziels G′:

• Am ist das selektierte Atom des definiten Ziels G.• θ ist ein allgemeinster Unifikator von Am und A, dem

Kopf von C.• G′ ist das neue Ziel:

θ(A1, . . . , Am−1, B1, . . . , Bq, Am+1, . . . , Ak).

G′ ist eine Resolvente von G und C.

Ableitungsrelation G →P,C,m G′

KI, SS 06, Fol7, Seite 18, 8. Juni2006

Page 19: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

SLD-Resolution und SLD-Ableitung

Definition

Sei P ein definites Programm und G ein definites Ziel.

Eine SLD-Ableitung von P ∪ {G} ist eine Folge G →C1,m1G1 →C2,m2

G2 . . . von SLD-Schritten

wobei Ci jeweils eine umbenannte Klausel aus P ist

Die SLD-Ableitung ist eine SLD-Widerlegung,

wenn sie mit einer leeren Klausel endet.

Ci nennt man auch die Eingabe-Klauseln.

KI, SS 06, Fol7, Seite 19, 8. Juni2006

Page 20: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

SLD-Resolution und SLD-Ableitung

erfolgreiche SLD-Ableitung: Wenn es eine SLD-Widerlegung ist.

fehlgeschlagene SLD-Ableitung: Wenn diese nicht fortsetzbar ist.

unendliche SLD-Ableitung

KI, SS 06, Fol7, Seite 20, 8. Juni2006

Page 21: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

SLD-Ableitung

Sei P ein definites Programm und G ein definites Ziel.

• Eine korrekte Antwort ist eine Substitution θ,so dass P |= θ(¬G) gilt.

• Eine berechnete Antwort θ fur P ∪ {G}ist eine Substitution:Einschrankung von θn ◦ . . . ◦ θ1 auf die Variablen von G,wobei θ1 . . . θn die allgemeinsten Unifikatoren (in dieser Reihenfolge)zu einer SLD-Widerlegung von G sind.

KI, SS 06, Fol7, Seite 21, 8. Juni2006

Page 22: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

SLD-Ableitung: Korrektheit

Es gilt:

Korrektheit (Soundness) der SLD-Resolution

Sei P ein definites Programm und G ein definites Ziel.

Dann ist jede berechnete Antwort θ auch korrekt.

D.h. P |= θ(¬G)

KI, SS 06, Fol7, Seite 22, 8. Juni2006

Page 23: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Vollstandigkeit der SLD-Resolution

Wir betrachten verschiedene Vollstandigkeitsaussagen fur die SLD-

Resolution.

Satz (Widerlegungsvollstandigkeit)

Sei P ein definites Programm und G ein definites Ziel.

Wenn P ∪ {G} unerfullbar ist,

dann gibt es eine SLD-Widerlegung von P ∪ {G}.

KI, SS 06, Fol7, Seite 23, 8. Juni2006

Page 24: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Vollstandigkeit der SLD-Resolution

Es gilt ein starkerer Satz uber die Vollstandigkeit der berechneten Ant-

worten:

zu jeder Antwortsubstitution

gibt es eine allgemeinere berechnete Antwort

Satz (Vollstandigkeit der SLD-Resolution)

Sei P ein definites Programm und G ein definites Ziel.

Zu jeder korrekten Antwort θ

gibt es eine berechnete Antwort σ fur P ∪ {G}und eine Substitution γ

so dass ∀x ∈ FV (G): γσ(x) = θ(x).

KI, SS 06, Fol7, Seite 24, 8. Juni2006

Page 25: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Strategien zur Berechnung der Antworten

Breitensuche:

1. Gegeben Programm P und ein Ziel ⇐ A1, . . . , An:

(a) Probiere alle Moglichkeiten aus, ein Unterziel A aus A1, . . . , An

auszuwahlen

(b) Probiere alle Moglichkeiten aus, eine Resolution von A mit einemKopf einer Programmklausel durchzufuhren.

2. Erzeuge neues Ziel B: Loschen von A, Instanziieren des restlichenZiels, Hinzufugen des Rumpfs der Klausel.

3. Wenn B = 2, dann gebe die Antwort aus.

Sonst: mache weiter mit 1. mit dem Ziel B.

KI, SS 06, Fol7, Seite 25, 8. Juni2006

Page 26: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Strategien zur Berechnung der Antworten

Breitensuche hat zwei Verzweigungspunkte pro Resolutionsschritt:

• Die Auswahl eines Atoms aus der Anfrage

• Die Auswahl einer Klausel zum Resolvieren

Es gilt: die Auswahl des Atoms ist don’t care

Die Suche bleibt vollstandig, wenn man die Alternativen weglasst.

Z.B. leicht zu losende Atome kann man zuerst auswahlen

Umstellung kann aber unendlich tiefe Suchpfade einfuhren

KI, SS 06, Fol7, Seite 26, 8. Juni2006

Page 27: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Strategien

Eine vollstandige Suchstrategie:

• Breitensuche uber die Resolutionsmoglichkeiten• Anfrage als Stack von Atomen• Reihenfolge der Atome wie in definiten Klauseln

KI, SS 06, Fol7, Seite 27, 8. Juni2006

Page 28: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Strategien in Prolog-Implementierung

Tiefensuche, d.h. noch deterministischer:

• Anfrage als Stack

• Die Programmklauseln werden in der Reihenfolge abgesucht, in der

sie im Programm stehen.

Prolog benutzt die Tiefensuche

Rechts-Links-Ordnung ist definiert durch die

Reihenfolge der Klauseln im Programm und

die Reihenfolge der Literale in den Rumpfen

KI, SS 06, Fol7, Seite 28, 8. Juni2006

Page 29: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Prolog-Implementierung

Weitere Veranderungen gegenuber der theoretischen Fundierung sind:

• Der occurs-check wird i.a. nicht durchgefuhrt.• CUT- Operatoren zum Beeinflussen des Backtracking

zB nur erste Sub-Antwort statt aller Losungen• Assert/Retract: Damit konnen Programmklauseln zum Pro-

gramm hinzugefugt bzw. geloscht werden. I.a, betrifft dies

nur Fakten.• Negation: Negation wird definiert als Fehlschlagen der Su-

che.• Typinformation zu Programmen hinzugefugt.• moded Argumente von Pradikaten haben Markierung I bzw.

O : Input, Output• Pradikat als Funktionen, wenn deterministisch.

KI, SS 06, Fol7, Seite 29, 8. Juni2006

Page 30: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Prolog-Implementierung

Vergleich der theoretischen Eigenschaften mit der Implementierung.

Pures Prolog nichtpures Prolog nichtpur,Definite Programme Cut, Negation, ohne occurs-check

Klauselreihenfolge festSLD: korrekt SLD: korrekt SLD: i.a. nicht korrektvollstandig unvollstandig unvollstandig

KI, SS 06, Fol7, Seite 30, 8. Juni2006

Page 31: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Implementierung: Beispiele fur Unvollstandigkeit

bei festgelegten Reihenfolge der Klauseln:

P(a,b).

P(c,b).

P(X,Y) :- P(Y,X).

P(X,Z) :- P(X,Y), P(Y,Z).

Die symmetrisch-transitive Hulle kann nicht berechnet werden,

da das Programm in eine Schleifen gerat.

Aber eine SLD-Widerlegung existiert, da diese nicht-deterministisch

vorgehen darf, und insbesondere sich eine Programmklausel aussuchen

darf.

KI, SS 06, Fol7, Seite 31, 8. Juni2006

Page 32: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Beispielprogramme und Prolog-Ausfuhrung

likes (maria, essen).

likes(maria,wein).

likes(peter, maria).

likes(peter,wein).

Einfache Anfragen:

> ?- likes(peter,maria)

yes

Konjunktive Anfragen (mit logischem und verknupfte)

> ?- likes(peter,maria), likes(maria,peter)

no

KI, SS 06, Fol7, Seite 32, 8. Juni2006

Page 33: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Zuerst wird das erste Unterziel bearbeitet: Antwort:. ja, Dann zweite:

nein.

Konjunktive Anfragen mit Instanziierung.

> ?- likes(peter, X), likes(maria,X)

Abarbeitung: 1. X = maria, likes(maria,maria): no2. X = wein: likes(maria,wein). yes

X = wein

Backtracking ist notwendig (Zurucksetzen) zum Finden weiterer

Losungen.

Page 34: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Beispielprogramm und Prolog-Ausfuhrung

vater(peter,maria).

mutter(susanne,maria).

vater(karl, peter).

mutter(elisabeth, peter).

...

vorfahr(X,Y) :- vater(X,Y).

vorfahr(X,Y) :- mutter(X,Y).

vorfahr(X,Z) :- vorfahr(X,Y),vorfahr(Y,Z).

KI, SS 06, Fol7, Seite 34, 8. Juni2006

Page 35: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Prolog-Abarbeitung:

Anfragen:

?- vorfahr(elisabeth,maria)

Abarbeitung :

1. vorfahr(elisabeth,maria)

1.1 vater(elisabeth,maria). nein

1.2 mutter(elisabeth,maria): nein

1.3 vorfahr(elisabeth, X0), vorfahr(X0,maria)

1.3.1 vater(elisabeth, X0), vorfahr(X0,maria): nein

1.3.2 mutter(elisabeth, X0), vorfahr(X0,maria): X0 = peter

1.3.2 vorfahr(peter,maria):

1.3.2.1 vater(peter,maria): ja

usw.

KI, SS 06, Fol7, Seite 35, 8. Juni2006

Page 36: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Syntaxkonventionen von Prolog

Namen Aus Großbuchstaben, Kleinbuchstaben, Ziffern und

(Unterstrich) oder nur aus Sonderzeichen

Konstanten: erstes Zeichen ist KleinbuchstabeVariablen: erstes Zeichen ist Großbuchstabe oder

oder nur: (wildcard, joker, Leerstelle)

Terme Funktor(component1,. . . ,componentn)Stelligkeit von Pradikaten/ Funktionen ist nicht variabel.gleicher Funktorname mit verschiedener Stelligkeit ergibt

anderen Funktorz.B. Schreibweise: vater/2

KI, SS 06, Fol7, Seite 36, 8. Juni2006

Page 37: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

arithmetische Ausdrucke:

Die Operatoren +,−, ∗, /und die Vergleichsoperatoren <=, ... sind erlaubt.

Infix usw. ist teilweise moglich:

z.B. a ∗ b + c steht fur den Term +(∗(a, b), c).

Zahlen sind abhangig von der Implementierung.

KI, SS 06, Fol7, Seite 37, 8. Juni2006

Page 38: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Gleichheit

Spezialpradikat = (Gleichheit) kann definiert werden durch

X = X.

Z.B.

?- besitzt(peter, X) = besitzt(peter,buch(lloyd,prolog))

yes; X = buch(lloyd,prolog)

Gleichheitsabarbeitung benutzt Unifikation

KI, SS 06, Fol7, Seite 38, 8. Juni2006

Page 39: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Arithmetische Vergleiche

erlaubte Operatoren:

=, \=, <, >, =<, >= , =\=, =:=

Beachte: die Operanden mussen als Zahl ausgewertet seinvor Auswertung des Ausdrucks.

3 + 4 = 7 ergibt: no3 + 4 =:= 7 ergibt yes

D.h., es gibt einen Unterschied zwischen Term und Wert.

KI, SS 06, Fol7, Seite 39, 8. Juni2006

Page 40: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Zuweisung und Auswertung

Zuweisung mit gleichzeitiger Auswertung kann man mit is durchfuhren:

X is 3 + 5 danach: X 7→ 8X = 3 + 5 danach X 7→ “3 + 5“

KI, SS 06, Fol7, Seite 40, 8. Juni2006

Page 41: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Datenstrukturen und Unifikation in Prolog

Term-Gleichungen werden durch Instanziierung der Variablen gelost:

d.h. durch Unifikation

k(X, a) = k(b, Y ) ergibt X = b, Y = a

Auch Unterstrukturen konnen Wert von Variablen sein:

k(X, h(a, Z)) = k(b, Y ) ergibt X = b, Y = h(a, Z)

KI, SS 06, Fol7, Seite 41, 8. Juni2006

Page 42: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Datenstrukturen und Unifikation in Prolog:

Beispiel

k(X, h(a, Z), X) = k(h(Y, b), U, U)

ergibt zunachst:

X = h(Y, b), U = h(a, Z), X = U

Endergebnis:

X = h(a, b), U = h(a, b), Y = a, Z = b

KI, SS 06, Fol7, Seite 42, 8. Juni2006

Page 43: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Beispiel Unifikation

Dieses Ergebnis kann man z.B. im Prolog Interpreter direkt verifizieren.

k(X,h(a,Z),X) = k(h(Y,b),U,U).

X = h(a,b)

Z = b

Y = a

U = h(a,b)

yes

KI, SS 06, Fol7, Seite 43, 8. Juni2006

Page 44: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Behandlung des occurs-check

k(X, X) = k(Y, h(Y ))

erfordert Unifikation von X = h(X).

Es gibt eine Losung in unendlichen Baume: X = h(h(h(. . .))).

• Prolog-Implementierungen vermeiden den occurs-check.• Oft abgeschaltet: ist nicht korrekt bzgl. PL1-Semantik• Teilweise Elimination durch statische Analyse eliminiert.

KI, SS 06, Fol7, Seite 44, 8. Juni2006

Page 45: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Listen in Prolog

Prolog benutzt eine abkurzende Syntax:

[1,2,3] entspricht cons(1,cons(2,cons(3,nil)))

[] entspricht nil

KI, SS 06, Fol7, Seite 45, 8. Juni2006

Page 46: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Listen in Prolog: member

Element-Test mittels member

member(X,[X|_]).

member(X,[_|Y]) :- member(X,Y).

Terminiert member in allen moglichen Situationen?

• member(s,t): wenn t keine Variablen enthalt. dann wird t′ beim

nachsten mal kleiner.

KI, SS 06, Fol7, Seite 46, 8. Juni2006

Page 47: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

member. Terminierung?

• member(Y,Y): Die erste Klausel unifiziert nicht

(aber unifiziert, wenn occurs-check aus ist: Antwort: ja)

Die zweite Klausel ergibt:

member(X_1,[_|Y_1]) :- member(X_1,Y_1).

X_1 = Y = [_|Y_1]

Die neue Anfrage ist: member([_|Y_1] ,Y_1)

Nachste Unifikation ebenfalls mit zweiter Klausel

member(X_2,[_|Y_2]) :- member(X_2,Y_2)

X_2 = [_|Y_1] , Y_1 = [_|Y_2]

usw. Man sieht: das terminiert nicht.

KI, SS 06, Fol7, Seite 47, 8. Juni2006

Page 48: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Listen in Prolog: islist

islist([_|X]) :- islist(X).

islist([]).

Diese Funktion terminiert ebenfalls fur Listen ohne Variablen

aber nicht fur islist(X).

Eine Umstellung der Klauseln ergibt:

islist([]).

islist([_|X]) :- islist(X).

Dieses Programm terminiert fur die Anfrage islist(X).

Antwort: X = [], falls die Eingabe eine Liste ist. Antwort ist dann ja.

KI, SS 06, Fol7, Seite 48, 8. Juni2006

Page 49: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Listen in Prolog: length

laenge([],0).

laenge([_|X],N) :- laenge(X,N_1), N is N_1 + 1.

Damit kann man folgende Beispiele rechnen:

?- laenge([1,2,3], N).

N = 3.

?- laenge(X,2).

Antwort X = [ 1, 2]. Aber: terminiert in manchen Implementierungen

nicht

KI, SS 06, Fol7, Seite 49, 8. Juni2006

Page 50: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Sortiere Listen von Zahlen:

sortiert([]).

sortiert([X]).

sortiert([X|[Y|Z]]) :- X <= Y, sortiert([Y|Z]).

sortiert_einfuegen(X,[],[X]).

sortiert_einfuegen(X,[Y|Z], [X|[Y|Z]]) :- X =< Y.

sortiert_einfuegen (X,[Y|Z], [Y|U]) :- Y < X, sortiert_einfuegen(X,Z,U).

ins_sortiere(X,X) :- sortiert(X).

ins_sortiere([X|Y], Z) :- ins_sortiere(Y,U), sortiert_einfuegen(X,U,Z).

KI, SS 06, Fol7, Seite 50, 8. Juni2006

Page 51: Logische Programmierung Einf¨uhrende Beispiele · • Eine Unit-Klausel (oder Fakt) ist eine definite Klausel mit leerem Rumpf. Notation: A ⇐. KI, SS 06, Fol7, Seite 10, 8. Juni2006

Programmierung von append: in Prolog:

append([],X,X).

append([X|Y],U,[X|Z]) :- append(Y,U,Z).

KI, SS 06, Fol7, Seite 51, 8. Juni2006