voriges Kapitel | Startseite | Inhalt | nächstes Kapitel

© 2001 François Bry
Dieses Lehrmaterial wird ausschließlich zur privaten Verwendung angeboten. Eine nichtprivate Nutzung (z.B. im Unterricht oder eine Veröffentlichung von Kopien oder Übersetzungen) dieses Lehrmaterials bedarf der Erlaubnis des Autors.


1. Ein Regelformat zur Darstellung von Formeln der Prädikatenlogik erster Stufe

Die Skolemisierung ist eine Umformung von Formeln zur Beseitigung von Existenzquantoren. Diese Umformung erhält die (Un)Erfüllbarkeit. Sie wird hier informell anhand von Beispielen erläutert. (Eine formale Einführung bieten u.a. die Vorlesungen "Logik für Informatiker" und "Deduktionssysteme".)

Skolemisierung:

  1. All x All y ( p(x,y) => Ex z q(x,z) )

    wird umgeformt in:

    All x All y ( p(x,y) => q(x, f(x,y)) )

    wobei f ein neues 2-stelliges Funktionssymbol ist, d. h. ein 2-stelliges Funktionssymbol, das in keiner der betrachteten Formeln vorkommt.

  2. Ex x All y p(x,y)

    wird umgeformt in:

    All y p(f,y)

    wobei f ein neues 0-stelliges Funktionssymbol ist, also eine Konstante. Neu heißt, daß die Konstante f in keiner der betrachteten Formeln vorkommt.

Die Idee der Skolemisierung besteht darin, die Objekte, deren Existenz postuliert wird, mit Termen zu benennen, die mit dem eingeführten Funktionssymbol gebildet werden. Die eingeführten neuen Funktionssymbole werden Skolem-Funktionssymbole genannt. Den Vorgang der Umformung einer Formel F nennt man die Skolemisierung von F, das Ergebnis der Umformung die Skolemform von F. Ist M eine Formelmenge, spricht man ebenfalls von der Skolemform von M und meint damit die Menge aller Skolemformen der Elemente von M.
Seien M eine Formelmenge und
            Msko eine Skolemform von M.
M ist (un)erfüllbar genau dann wenn Msko (un)erfüllbar ist.
Bemerkungen:
  • Die Skolemisierung erhält die Erfüllbarkeit, aber nicht die Modelle.
    (Beispiel: Ex x p(a,x)).
  • Beim Skolemisieren muß die Polarität der Quantifikationen berücksichtigt werden.
Umwandlung einer Formelmenge in Klauselform:
  1. Skolemisierung: (siehe oben).
  2. Pränexform:

    All x ( p(x) /\ All y q(x,y) )

    wird umgeformt in:

    All x All y ( p(x) /\ q(x,y) )

    Der Teil All x All y wird Präfix, der Teil p(x) /\ q(x,y) Matrix genannt.

  3. Matrix in konjunktiver Normalform:

    Konjunktive Normalform = Konjunktion von Disjunktionen.

    All x All y ( p(x,y) => (q(x,y) /\ r(x,y)) )

    wird umgeformt in:

    All x All y ( [ ¬p(x,y) \/ q(x,y) ] /\ [ ¬p(x,y) \/ r(x,y) ] )

  4. Klauselform:

    Die Formelmenge

    { All x All y ( [ ¬p(x,y) \/ q(x,y) ] /\ [ ¬p(x,y) \/ r(x,y) ] ) }

    wird umgeformt in die Formelmenge:

    { All x All y [ ¬p(x,y) \/ q(x,y) ],
      All x All y [ ¬p(x,y) \/ r(x,y) ] }

    Die Quantifikation wird als implizit angesehen, was die folgende Klauselmenge ergibt:

    { [ ¬p(x,y) \/ q(x,y) ], [ ¬p(x,y) \/ r(x,y) ] }

  5. Rektifikation oder "standardization apart":

    Die Variablen in der Klauselmenge werden so umbenannt, daß keine zwei Klauseln eine gemeinsame Variable haben.

  6. Implikative Darstellung von Klauseln oder Klauseln in Implikationsform:

    Die Klausel

    L1 \/ L2 ... \/ Lk

    wird dargestellt als

    C1 /\ ... /\ Cn => D1 \/ ... \/ Dm

    wobei

    • alle Ci und Dj positive Literale (Atome) sind,
    • wenn n = 0 ist (also kein Lh negativ), ist true die Prämisse der Implikation,
    • wenn m = 0 ist (also kein Lh positiv), ist false die Konklusion der Implikation,
Die Umformungen in Pränexform und in konjunktive Normalform erhalten die Modelle, also auch die (Un)Erfüllbarkeit. Die Umformung von Formeln der Prädikatenlogik erster Stufe in Klauselform - mit oder ohne Rektifikation - ist immer möglich und erhält die (Un)Erfüllbarkeit.
Im folgenden wird stets die Klauselform angenommen
Darüber hinaus wird angenommen, daß alle Klauseln in Implikationsform
C1 /\ ... /\ Cn => D1 \/ ... \/ Dm
bereichsbeschränkt sind, d.h. jede Variable, die in einem Dj vorkommt, kommt auch in einem Ci vor. Man kann jede Klauselmenge in eine bereichsbeschränkte Klauselmenge transformieren. Für viele Anwendungen ist das aber gar nicht nötig, weil die gegebene Formelmenge sowieso schon einer bereichsbeschränkten Klauselmenge entspricht.
Darstellung in PROLOG: Eine Klausel in Implikationsform
C1 /\ ... /\ Cn => D1 \/ ... \/ Dm
wird wie folgt in PROLOG dargestellt:
:- op(1200, xfx, --->). C1, ..., Cn ---> D1 ; ... ; Dm
d. h. die Konjunktion und Disjunktion werden dargestellt wie in PROLOG üblich und die Implikation wie in den vorangehenden Kapiteln. Die positiven Literale (atomaren Formeln) true und false werden in PROLOG so dargestellt. Variablen werden als PROLOG-Variablen, Funktionssymbole und Konstanten als PROLOG-Funktionssymbole und PROLOG-Atome dargestellt.

zum Seitenanfang

2. Modellgenerierung

Zwei sogenannte Herbrand-Modelle können für P89 wie folgt aufgebaut werden:
true | dozent(francois) semester ; semesterferien | +--------------------+--------------------+ | | semester semesterferien | | liest(francois) forscht(francois)
Bemerkungen:
  1. Gibt es keine Klausel mit false als Kopf, dann gibt es ein Herbrand-Modell (möglicherweise ein unendliches).
  2. Gibt es keine Klausel mit true als Rumpf, dann gibt es ein Herbrand-Modell (bestimmt durch die leere Menge von Grundatomen).

zum Seitenanfang
P89

Zwei sogenannte Herbrand-Modelle können für P89 wie folgt aufgebaut werden:

true | dozent(francois) semester ; semesterferien | +--------------------+--------------------+ | | semester semesterferien | | liest(francois) forscht(francois)

Weitere Beispiele siehe Programme P90, P91, P92

3. Grundlegende Programme

Das folgende grundlegende Programm, Basic SATCHMO genannt (SATisfiability CHecking by MOdel generation), implementiert das Verfahren zur Generierung von Herbrand-Modellen, das im vorangehenden Abschnitt erläutert wurde:
Ein fehlerfreier Ablauf des Programmes P93 setzt voraus, daß die Relationssymbole, die in Köpfen von Klauseln vorkommen, als dynamisch vereinbart werden.

Das Cut in der ersten Klausel von satisfiable ist notwendig, damit die zweite Klausel nicht zu früh aufgerufen wird, sondern erst, wenn alle vorhandenen Klauseln in Implikationsform erfüllt sind.

In assume kann der Aufruf von asserta nicht durch einen Aufruf von assert ersetzt werden: die "angenommenen" Fakten sollen kellerartig gespeichert werden, so daß zunächst das Faktum gelöscht wird, das zuletzt hinzugefügt wurde.

Es hat offenbar kein Herbrand-Modell, weil aus p(a) folgt p(f(a)), aus p(f(a)) folgt p(g(f(a))), und aus p(g(f(a))) folgt false.
Jedoch expandiert das Programm P93 den folgenden unendlichen Suchraum aus diesem Beispiel:
true | p(a) | p(f(a)) | p(f(f(a))) | p(f(f(f(a)))) | . . .
Der Grund dafür ist, daß P93 die Klausel p(X) ---> p(g(X)). nie berücksichtigt. Man sagt, daß das Programm P93 nicht fair ist.

zum Seitenanfang
P93, Basic SATCHMO genannt (SATisfiability CHecking by MOdel generation), implementiert das Verfahren zur Generierung von Herbrand-Modellen.

Ein weiteres Beispiel: siehe Programm P94

Jedoch expandiert das Programm P93 den folgenden unendlichen Suchraum aus diesem Beispiel:

true | p(a) | p(f(a)) | p(f(f(a))) | p(f(f(f(a)))) | . . .

Die Veränderung von Programm P93, Programm P95 wird Fair SATCHMO genannt.

4. Modellgenerierung zum Theorembeweisen

Das Programm P95 ist korrekt und und vollständig für die Unerfüllbarkeit von endlichen Mengen von bereichsbeschränkten Klauseln in Implikationsform: Wenn satisfiable_level scheitert, dann ist die Klauselmenge unerfüllbar. Wenn die Klauselmenge unerfüllbar ist, dann scheitert satisfiable_level nach endlich vielen Schritten.

Das Programm ist außerdem korrekt für die Erfüllbarkeit, aber nicht vollständig für die Erfüllbarkeit: Wenn satisfiable_level erfolgreich terminiert, dann ist die Klauselmenge erfüllbar, und die Fakten in der PROLOG-Datenbasis repräsentieren ein Modell. Aber satisfiable_level terminiert nicht für jede erfüllbare Klauselmenge, zum Beispiel nicht für P91. Es kann grundsätzlich auch kein Programm geben, das in allen Fällen mit der korrekten Antwort terminiert. Die Unerfüllbarkeit ist nur semi-entscheidbar, aber nicht entscheidbar.

Oft ist man nicht an der (Un)Erfüllbarkeit interessiert, sondern an der sogenannten Folgerungsbeziehung zwischen Formelmengen oder Formeln der Prädikatenlogik erster Stufe: ob aus einer Axiomenmenge A eine Formel F folgt.

Es gilt folgender Zusammenhang:
Aus einer Axiomenmenge A folgt eine Formel F genau dann wenn A U { ¬F } unerfüllbar ist.
Damit wird die Folgerungsbeziehung auf die Unerfüllbarkeit zurückgeführt. Da das Programm P95 (Fair SATCHMO) korrekt und vollständig für die Unerfüllbarkeit ist, kann es auch zur Prüfung der Folgerungsbeziehung der Prädikatenlogik erster Stufe eingesetzt werden.

zum Seitenanfang
P95 ist:
  • korrekt und und vollständig für die Unerfüllbarkeit von endlichen Mengen von bereichsbeschränkten Klauseln in Implikationsform: Wenn satisfiable_level scheitert, dann ist die Klauselmenge unerfüllbar. Wenn die Klauselmenge unerfüllbar ist, dann scheitert satisfiable_level nach endlich vielen Schritten.
  • korrekt für die Erfüllbarkeit, aber nicht vollständig für die Erfüllbarkeit: Wenn satisfiable_level erfolgreich terminiert, dann ist die Klauselmenge erfüllbar, und die Fakten in der PROLOG-Datenbasis repräsentieren ein Modell. Aber satisfiable_level terminiert nicht für jede erfüllbare Klauselmenge, zum Beispiel nicht für P91. Es kann grundsätzlich auch kein Programm geben, das in allen Fällen mit der korrekten Antwort terminiert. Die Unerfüllbarkeit ist nur semi-entscheidbar, aber nicht entscheidbar.

Oft ist man nicht an der (Un)Erfüllbarkeit interessiert, sondern an der sogenannten Folgerungsbeziehung zwischen Formelmengen oder Formeln der Prädikatenlogik erster Stufe: ob aus einer Axiomenmenge A eine Formel F folgt.

Es gilt folgender Zusammenhang:
Aus einer Axiomenmenge A folgt eine Formel F genau dann wenn A U { ¬F } unerfüllbar ist.

5. SATCHMO optimieren

Viele Optimierungen sind vorgeschlagen worden. In diesem Abschnitt werden nur drei, ziemlich natürliche, Optimierungen behandelt.
  1. Erkennung von Widersprüchen vorziehen:
    Da ein Zweig des Suchraumes aufgegeben wird, sobald false generiert wird, ist es günstig, die Klauseln mit Kopf false vor allen anderen auszuwerten.
  2. Generierung der atomaren Konklusionen vorziehen:
    Sind einerseits ein Atom A und andererseits eine Disjunktion D1 ; D2 herleitbar, so ist die Herleitung von A vorzuziehen. Grund dafür ist, daß die Herleitung von D1 ; D2 eine Fallunterscheidung nach D1 und D2 nach sich zieht, gefolgt von einer Herleitung von A in jedem der beiden Fälle.
  3. Generierung der kleineren Disjunktionen vorziehen:
    Die bisherigen Optimierungen kann man beide als Spezialfall der folgenden betrachten: sind zwei Disjunktionen mit unterschiedlich vielen Disjunktionsgliedern herleitbar, so ist die kürzere vorzuziehen. Dabei zählt eine atomare Formel als ein Disjunktionsglied, false als null Disjunktionsglieder.
    Das folgende Programm ist eine Änderung von Programm P95, das die Generierung der kürzeren Disjunktionen vorzieht. Dieses Programm setzt eine erweiterte Darstellung der Klauseln in Implikationsform voraus. Eine Klausel in Implikationsform:
    C1, ..., Cn ---> D1 ; ... ; Dm
    wird wie folgt dargestellt:
    m : C1, ..., Cn ---> D1 ; ... ; Dm
    wobei die Zahl m die Länge des Klauselkopfes ist. Zu dieser Darstellung wird ein zusätzlicher 2-stelliger Infix-Operator : verwendet.
    97
    :- op(1200, xfx, :), op(1190, xfx, --->). satisfiable_3 :- contradiction, !, fail. satisfiable_3 :- findall(Length : Head, ( (Length : Body ---> Head), not Head = false, Body, not Head ), List_of_Heads), not List_of_Heads = [], !, quicksort(List_of_Heads, Sorted_List_of_Heads), remove_lengths(Sorted_List_of_Heads, Heads), disjunct_tuple(List_of_Atoms, Heads), assume_all(List_of_Atoms), satisfiable_3. satisfiable_3. contradiction :- (0 : Body ---> false), Body. quicksort([], []). quicksort([Head|Tail], Sorted) :- partition(Tail, Head, Smalls, Bigs), quicksort(Smalls, SortedSmalls), quicksort(Bigs, SortedBigs), append(SortedSmalls, [Head|SortedBigs], Sorted). partition([], _Element, [], []). partition([Head|Tail], Element, [Head|Smalls], Bigs) :- precedes(Head, Element), partition(Tail, Element, Smalls, Bigs). partition([Head|Tail], Element, Smalls, [Head|Bigs]) :- strictly_precedes(Element, Head), partition(Tail, Eement, Smalls, Bigs). precedes( (L1 : _Head1), (L2 : _Head2)) :- L1 =< L2. strictly_precedes((L1 : _Head1), (L2 : _Head2)) :- L1 < L2. remove_lengths([], []). remove_lengths([_L:Head|Tail], [Head|New_Tail]) :- remove_lengths(Tail, New_Tail). % Folgende Prozeduren unveraendert: disjunct_tuple([], []). disjunct_tuple([Atom|Atoms], [Head|Heads]) :- disjunct(Atom, Head), disjunct_tuple(Atoms, Heads). disjunct(Atom, (Atom ; _) ). disjunct(Atom, (_ ; Rest) ) :- !, disjunct(Atom, Rest). disjunct(Atom, Atom ). assume_all([]). assume_all([Atom|Atoms]) :- Atom, !, assume_all(Atoms). assume_all([Atom|Atoms]) :- assume(Atom), assume_all(Atoms). assume(Fact) :- asserta(Fact). assume(Fact) :- retract(Fact), !, fail.

Anfang
  1. P96 ist die entsprechende Änderung vom Programm P95.

  2. Generierung der atomaren Konklusionen vorziehen:

    Sind einerseits ein Atom A und andererseits eine Disjunktion D1 ; D2 herleitbar, so ist die Herleitung von A vorzuziehen.

    Das Programm P97 ist die entsprechende Änderung vom Programm P96:

  3. Generierung der kleineren Disjunktionen vorziehen:

    Sind zwei Disjunktionen mit unterschiedlich vielen Disjunktionsgliedern herleitbar, so ist die kürzere vorzuziehen.

6. Logeleien

  1. Welche Musikerin spielt heute welches Instrument?
    98
    %% Welche Musikerin spielt heute welches Instrument? %% ZEITmagazin Nr. 23, 3. Juni 1994 %% Die Musikerinnen Annette, Beate, Corinna, Esther %% und Dagmar haben sich zu einem Blaeserquintett %% zusammengefunden. true ---> musikerin(corinna). true ---> musikerin(esther). true ---> musikerin(annette). true ---> musikerin(beate). true ---> musikerin(dagmar). %% Heute spielt Corinna Fagott, aber Dagmar blaest nicht %% Klarinette. true ---> spielt(corinna, fagott). spielt(dagmar, klarinette) ---> false. %% Das Blaeserquintett ist besetzt mit den Instrumenten %% Floete, Klarinette, Oboe, Fagott, Horn. Jede der Damen %% beherrscht alle fuenf Instrumente. musikerin(X) ---> spielt(X, floete); spielt(X, horn); spielt(X, oboe); spielt(X, klarinette); spielt(X, fagott). %% Kein Instrument kann gleichzeitig von zwei Musikerinnen %% gespielt werden. spielt(Spielerin1, Instrument), spielt(Spielerin2, Instrument), not Spielerin1 = Spielerin2 ---> false. %% Keine Musikerin kann gleichzeitig zwei Instrumente spielen. spielt(Spielerin, Instrument1), spielt(Spielerin, Instrument2), not Instrument1 = Instrument2 ---> false. %% Wenn Beate Oboe spielt, dann blaest Annette Klarinette. spielt(beate, oboe) ---> spielt(annette, klarinette). %% Spielt Esther nicht Horn, dann blaest Annette nicht Oboe. spielt(annette, oboe) ---> spielt(esther, horn). %% Spielen Esther Floete und Annette Klarinette, dann spielt %% Dagmar nicht Horn. spielt(esther,floete), spielt(annette,klarinette), spielt(dagmar,horn) ---> false. %% Blaest Annette Klarinette, dann spielt Beate Oboe. spielt(annette, klarinette) ---> spielt(beate, oboe). %% Spielen Esther Floete und Annette Horn, dann blaest Dagmar %% Fagott. spielt(esther, floete), spielt(annette, horn) ---> spielt(dagmar, fagott). %% Spielen Dagmar Floete und Beate Klarinette, dann spielt %% Annette Fagott. spielt(dagmar,floete), spielt(beate,klarinette) ---> spielt(annette,fagott). %% Blaest Annette Floete, dann spielt Dagmar Horn. spielt(annette,floete) ---> spielt(dagmar,horn) . %% Wenn Corinna nicht Floete, aber Beate Klarinette spielt, %% dann blaest Dagmar nicht Horn. spielt(dagmar, horn), spielt(beate, klarinette) ---> spielt(corinna, floete). %% Spielt Esther Horn, dann blaest Annette Oboe. spielt(esther, horn) ---> spielt(annette, oboe).
  2. Welchen Tag verbringt Lisa mit wem?
    99
    %% Welchen Tag verbringt Lisa mit wem? %% (ZEITmagazin Nr. 6, 3. Februar 1995) %% Lisa kennt vier junge Maenner: Axel, Bernd, Clemens und Dieter. %% Jeden Tag der Woche verbringt sie mit einem von ihnen. :- op(40, xfx, am). Person1 am Tag, Person2 am Tag, not Person1 = Person2 ---> false. true ---> axel am montag ; bernd am montag ; clemens am montag ; dieter am montag. true ---> axel am dienstag ; bernd am dienstag ; clemens am dienstag ; dieter am dienstag. true ---> axel am mittwoch ; bernd am mittwoch ; clemens am mittwoch ; dieter am mittwoch. true ---> axel am donnerstag ; bernd am donnerstag ; clemens am donnerstag ; dieter am donnerstag. true ---> axel am freitag ; bernd am freitag ; clemens am freitag ; dieter am freitag. true ---> axel am samstag ; bernd am samstag ; clemens am samstag ; dieter am samstag. true ---> axel am sonntag ; bernd am sonntag ; clemens am sonntag ; dieter am sonntag. %% Sonntags macht sie ihren Besuchsplan fuer die kommende Woche. %% Den freilich verklausuliert sie ziemlich. %% Fuer die naechste Woche sieht er so aus: %% Wenn ich Dieter nicht am Montag besuche, dann bin ich am %% Freitag bei ihm. Person am montag, not Person = dieter ---> dieter am freitag. %% Falls ich den Samstag weder bei Axel noch bei Clemens verbringe, %% dann begluecke ich Axel am Sonntag. Person am samstag, not Person = axel, not Person = clemens ---> axel am sonntag. %% Besuche ich Dieter nicht am Sonntag, dann bin ich am Montag bei %% Bernd oder Clemens. Person am sonntag, not Person = dieter ---> bernd am montag ; clemens am montag. %% Bin ich am Donnerstag weder bei Bernd noch bei Clemens, so %% besuche ich Clemens auch nicht am Samstag. Person am donnerstag, not Person = bernd, not person = clemens, clemens am samstag ---> false. %% Verbringe ich den Mittwoch mit Axel oder Bernd, so begluecke ich %% am Freitag Axel oder Clemens. axel am mittwoch ---> axel am freitag ; clemens am freitag. bernd am mittwoch ---> axel am freitag ; clemens am freitag. %% Falls ich am Sonntag bei Axel bin, ist am Montag entweder Dieter %% oder Axel an der Reihe. axel am sonntag ---> dieter am montag ; axel am montag. %% Bin ich mit Bernd weder am Dienstag noch am Freitag zusammen, %% dann sehe ich Axel nicht am Samstag. Person1 am dienstag, not Person1 = bernd, Person2 am freitag, not Person2 = bernd, axel am samstag ---> false. %% Wenn ich Bernd am Montag besuche, dann ist Axel am Sonntag an %% der Reihe. bernd am montag ---> axel am sonntag. %% Sehe ich Axel nicht am Donnerstag, dann bin ich am Dienstag %% nicht bei Dieter. Person am donnerstag, not Person = axel, dieter am dienstag ---> false. %% Verbringe ich den Mittwoch mit Dieter, dann werde ich am %% Dienstag bei Axel, jedoch am Donnerstag nicht bei Dieter sein. dieter am mittwoch ---> axel am dienstag. dieter am mittwoch, dieter am donnerstag ---> false. %% Sehe ich Bernd nicht am Sonntag, so bin ich am Samstag bei %% Dieter. Person am sonntag, not Person = bernd ---> dieter am samstag. %% Bin ich am Donnerstag entweder mit Bernd oder mit Clemens %% zusammen, dann bin ich am Sonntag bei Axel. bernd am donnerstag ---> axel am sonntag. clemens am donnerstag ---> axel am sonntag.

Anfang
voriges Kapitel | Startseite | Inhalt | nächstes Kapitel

Letzte Änderung: 18. August 1998

Valid
	     XHTML 1.0!