Hornklauseln und Prolog

Ähnliche Dokumente
Logik Vorlesung 4: Horn-Logik und Kompaktheit

Formale Grundlagen der Informatik 1 Kapitel 16 Normalformen und Hornformeln

Wozu formale Logik? Programmiersprachen Logik im Fingerhut. Formeln. Logik im Fingerhut (24. Januar 2005) Belegung und Interpretation

Logik für Informatiker

Tableaukalkül für Aussagenlogik

Modellierungsmethoden der Informatik Kapitel 2: Logikkalküle

Logik für Informatiker

SLD-Ableitungsbäume. G = B 1... B m. G die Menge aller SLD-Resolventen von G und definiten. G einen Nachfolger, der mit G markiert ist.

Logische und funktionale Programmierung

Logik-Grundlagen. Syntax der Prädikatenlogik

Modellierungsmethoden der Informatik Kapitel 2: Logikkalküle

Ralf Möller, TUHH. Beim vorigen Mal: Heute: Prädikatenlogik: Algorithmus für Erfüllbarkeitsproblem. Lernziele: Beweisverfahren für Prädikatenlogik

Labor Compilerbau. Jan Hladik. Sommersemester DHBW Stuttgart. Jan Hladik (DHBW Stuttgart) Labor Compilerbau Sommersemester / 20

Logik für Informatiker

Resolutionsalgorithmus

Resolutionskalkül. wird t als eine Menge K t von Klauseln geschrieben, welche die einzelnen Maxterme repräsentieren:

Zusammenfassung Syntax: Formale Grundlagen der Informatik 1 Kapitel 15 Normalformen und Hornformeln. Zusammenfassung

Aussagenlogik Prädikatenlogik erster Stufe. Logik. Logik

Formale Systeme. Das Erfu llbarkeitsproblem. Prof. Dr. Bernhard Beckert, WS 2017/2018

Grundlagen der Künstlichen Intelligenz

Logik Vorlesung 5: Grundlagen Resolution

Logik für Informatiker

Logik für Informatiker

Formale Systeme. Prof. Dr. Bernhard Beckert. Winter 2008/2009. Fakultät für Informatik Universität Karlsruhe (TH)

Kapitel L:II. II. Aussagenlogik

Formale Grundlagen der Informatik 1 Kapitel 15 Normalformen und Hornformeln

Wissensbasierte Systeme 7. Prädikatenlogik

Allgemeingültige Aussagen

Aussagenlogik: Syntax von Aussagen

Problem der Resolution: Kombinatorische Explosion Ziel: Einschränkung der Möglichkeiten

Kapitel L:II. II. Aussagenlogik

Erfüllbarkeit von Horn-Klauseln und Berechnung des kleinsten Herbrand-Modells

Logik Vorlesung 3: Äquivalenz und Normalformen

Prädikatenlogik. Übersicht: 1 Teil 1: Syntax und Semantik. 2 Teil 2: Normalformen und Grenzen der Prädikatenlogik 1. Stufe

Formale Systeme. Prof. Dr. Bernhard Beckert, WS 2017/ KIT Die Forschungsuniversita t in der Helmholtz-Gemeinschaft

Formale Systeme. Prof. Dr. Bernhard Beckert, WS 2016/ KIT Die Forschungsuniversita t in der Helmholtz-Gemeinschaft

Logik Vorlesung 9: Normalformen

1 Inhalt der Vorlesung B-PS1

Logik für Informatiker

Logikprogrammierung. Berechnung durch Resolution Die Programmiersprache Prolog

SWP Logische Programme Teil 2

Logik für Informatiker

2.5 Listen. Kurzschreibweise: [42; 0; 16] Listen werden mithilfe von [] und :: konstruiert.

Logik Vorlesung 10: Herbrand-Theorie

Grundlagen der Theoretischen Informatik

Logik Vorlesung 10: Herbrand-Theorie

Logik für Informatiker

Logische und funktionale Programmierung

Satz 227 3SAT ist N P-vollständig. Info IV 2 N P-Vollständigkeit 375/388 c Ernst W. Mayr

Terme. Dann ist auch f(t 1. Terme. Dann ist P (t 1

Normalformen der Prädikatenlogik

Logik für Informatiker

Logik für Informatiker

Logik für Informatiker

TU5 Aussagenlogik II

Formale Systeme, WS 2008/2009 Lösungen zum Übungsblatt 2

4. Logik und ihre Bedeutung für WBS

Einiges zu Resolutionen anhand der Aufgaben 6 und 7

Herbrand-Universum. Vorlesung Logik Sommersemester 2012 Universität Duisburg-Essen. Herbrand-Universum. Herbrand-Universum

Sogar Strukturen mit unendlichem Universum müssen betrachtet werden:

Grundlagen der Programmierung

FORMALE SYSTEME. 23. Vorlesung: Logisches Schließen. TU Dresden, 16. Januar Markus Krötzsch Lehrstuhl Wissensbasierte Systeme

GDI Medieninformatik. 13. VL: Einführung in die mathematische Logik Prädikatenlogik (II)

- Theorie der uninterpretierten

TU9 Aussagenlogik. Daniela Andrade

Resolution und Regeln

Wiederholung zur SLD-Resolution (1)

HA-Lösung TA-Lösung Diskrete Strukturen Tutoraufgabenblatt 10. Besprechung in KW02/2019

Deklarative Semantik

Formale Systeme. Tableaukalku l (ohne Gleichheit) Prof. Dr. Bernhard Beckert, WS 2015/ KIT I NSTITUT F U R T HEORETISCHE I NFORMATIK

Formale Grundlagen der Informatik 1 Kapitel 19. Syntax & Semantik

Logik. Gabriele Kern-Isberner LS 1 Information Engineering. TU Dortmund Wintersemester 2014/15 WS 2014/15

Logik Vorlesung 8: Modelle und Äquivalenz

Erfüllbarkeitstests. Im folgenden: Ein sehr effizienter Erfüllbarkeitstest für eine spezielle Klasse von Formeln in KNF, sogenannte Hornformeln (vgl.

Logik für Informatiker

Konfiguration und Diagnose. H. Kleine Büning Universität Paderborn Informatik: Wissensbasierte Systeme WS 14/15. Vorlesung H. Kleine Büning 1/38

Aussagenlogik zu wenig ausdrucksstark für die meisten Anwendungen. notwendig: Existenz- und Allaussagen

Normal Programs. Vervollständigung. Steffen Staab ISWeb Vorlesung Datenbanken II

Prädikatenlogik: Syntax

Aufgabe. Gelten die folgenden Äquivalenzen?. 2/??

Das SAT Problem oder Erfüllbarkeitsproblem. Formale Systeme. Teilklassen. Satz von Cook. SAT Instanz: Eine aussagenlogische Formel F For 0

Künstliche Intelligenz Logische Agenten & Resolution

Substitution. Unifikation. Komposition der Substitution. Ausführung der Substitution

Prädikatenlogische Entscheidbarkeitsprobleme

Structure Sharing vs. Structure Copying

Diskrete Strukturen Kapitel 2: Grundlagen (Beweise)

Logik für Informatiker

23. Vorlesung: Logisches Schließen Markus Kr otzsch Professur f ur Wissensbasierte Systeme Normalformen

Beispiel. Bsp.: Betrachte Schlussweise in: (3) folgt aus (1) und (2), siehe z.b. Resolutionsregel. was ist mit folgender Schlußweise:

Formale Grundlagen der Informatik 1 Kapitel 21 Prädikatenlogische Resolution

Logik für Informatiker

Syntax der Aussagenlogik. Vorlesung Logik Sommersemester 2012 Universität Duisburg-Essen. Formel als Syntaxbaum. Teilformel A 3 A 1 A 4

Aussagenlogische Kalküle

Beweisen mit Semantischen Tableaux

WS 2013/14. Diskrete Strukturen

Semantik der Aussagenlogik (Kurzform)

Haskell, Typen, und Typberechnung. Grundlagen der Programmierung 3 A. Einige andere Programmiersprachen. Typisierung in Haskell

Grundlagen der Logik

Transkript:

Hornklauseln und Prolog Regula Krapf und Maximilian Doré Kolleg Formale Mathematik 24. März 2016

Inhalt Tableaux Hornklauseln Prolog Modellelimination

Tableaux Wir führen eine Liste von Literalen lits und von skolemisierten Formeln fms und gehen wie folgt vor: 1. Falls lits zwei komplementäre Literale enthält, so sind wir fertig. 2. Sonst wähle eine Formel R in fms.

Tableaux Wir führen eine Liste von Literalen lits und von skolemisierten Formeln fms und gehen wie folgt vor: 1. Falls lits zwei komplementäre Literale enthält, so sind wir fertig. 2. Sonst wähle eine Formel R in fms. Falls R ein Literal ist, so fahre fort mit {R} lits, fm\{r}.

Tableaux Wir führen eine Liste von Literalen lits und von skolemisierten Formeln fms und gehen wie folgt vor: 1. Falls lits zwei komplementäre Literale enthält, so sind wir fertig. 2. Sonst wähle eine Formel R in fms. Falls R ein Literal ist, so fahre fort mit {R} lits, fm\{r}. Falls R von der Form P Q ist, so fahre fort mit lits, {P, Q} fm.

Tableaux Wir führen eine Liste von Literalen lits und von skolemisierten Formeln fms und gehen wie folgt vor: 1. Falls lits zwei komplementäre Literale enthält, so sind wir fertig. 2. Sonst wähle eine Formel R in fms. Falls R ein Literal ist, so fahre fort mit {R} lits, fm\{r}. Falls R von der Form P Q ist, so fahre fort mit lits, {P, Q} fm. Falls R von der Form P Q ist, so wiederhole das Verfahren für lits, {P} fm und lits, {Q} fm.

Tableaux Wir führen eine Liste von Literalen lits und von skolemisierten Formeln fms und gehen wie folgt vor: 1. Falls lits zwei komplementäre Literale enthält, so sind wir fertig. 2. Sonst wähle eine Formel R in fms. Falls R ein Literal ist, so fahre fort mit {R} lits, fm\{r}. Falls R von der Form P Q ist, so fahre fort mit lits, {P, Q} fm. Falls R von der Form P Q ist, so wiederhole das Verfahren für lits, {P} fm und lits, {Q} fm. Falls R von der Form x.p(x) ist, so fahre fort mit lits, {P(y)} fm.

Tableaux n: Obergrenze für Instanziierungen von -Quantoren cont: Continuation function (hier: Identität) env: aktuelle Instanziierung k: Counter für neue Variablen let rec tableau (fms,lits,n) cont (env,k) = if n < 0 then failwith "no proof at this levelëlse match fms with [] -> failwith "tableau: no proof" And(p,q)::unexp -> tableau (p::q::unexp,lits,n) cont (env,k) Or(p,q)::unexp -> tableau (p::unexp,lits,n) (tableau (q::unexp,lits,n) cont) (env,k) Forall(x,p)::unexp -> let y = Var(" "ˇ string of int k) in let p = subst (x => y) p in tableau (p ::unexp@[forall(x,p)],lits,n-1) cont (env,k+1) fm::unexp -> try tryfind (fun l -> cont(unify complements env (fm,l),k)) lits with Failure -> tableau (unexp,fm::lits,n) cont (env,k);;

Tableaux Iteratives Vertiefen: let rec deepen f n = try print string SSearching with depth limit "; print int n; print newline(); f n with Failure -> deepen f (n + 1);;

Tableaux Iteratives Vertiefen: let rec deepen f n = try print string SSearching with depth limit "; print int n; print newline(); f n with Failure -> deepen f (n + 1);; Widerlegungsprozedur: let tabrefute fms = deepen (fun n -> tableau (fms,[],n) (fun x -> x) (undefined,0); n) 0;;

Tableaux Iteratives Vertiefen: let rec deepen f n = try print string SSearching with depth limit "; print int n; print newline(); f n with Failure -> deepen f (n + 1);; Widerlegungsprozedur: let tabrefute fms = deepen (fun n -> tableau (fms,[],n) (fun x -> x) (undefined,0); n) 0;; Hauptfunktion: let tab fm = let sfm = askolemize(not(generalize fm)) in if sfm = False then 0 else tabrefute [sfm];;

Hornklauseln Definition Disjunktive Klauseln der Form P 1 P n Q (Q für n = 0) P 1 P n werden Hornklauseln genannt. Hornklauseln mit genau einem positiven Literal heißen definit. Wir können Hornklauseln alternativ auch P 1 P n Q bzw. P 1 P n aufschreiben.

Hornklauseln Definition Disjunktive Klauseln der Form P 1 P n Q (Q für n = 0) P 1 P n werden Hornklauseln genannt. Hornklauseln mit genau einem positiven Literal heißen definit. Wir können Hornklauseln alternativ auch P 1 P n Q bzw. P 1 P n aufschreiben. Beispiel ( P(0) Q(0)) ( R(0) P(0)) R(0) Q(0) (P(0) Q(0) ) (R(0) P(0)) R(0) Q(0)

Reduktion auf definite Hornklauseln Wir führen ein neues 0-stelliges Prädikat F (für ) ein. Dann kann man Klauseln der Form als P 1 P n P 1 P n F umschreiben. Dies ändert nichts an der Erfüllbarkeit.

Reduktion auf definite Hornklauseln Wir führen ein neues 0-stelliges Prädikat F (für ) ein. Dann kann man Klauseln der Form als P 1 P n P 1 P n F umschreiben. Dies ändert nichts an der Erfüllbarkeit. Beispiel ( P(0) Q(0)) ( R(0) P(0)) R(0) Q(0) (P(0) Q(0) F ) (R(0) P(0)) R(0) Q(0)

Minimale Herbrand-Modelle Sei S eine Menge von Klauseln. Wir konstruieren eine Herbrand-Interpretation M durch P M (t 1,..., t n ) = true, falls für jedes Herbrand-Modell H von S, P H (t 1,..., t n ) = true. Falls M ein Modell von S ist, so ist es ein minimales Herbrand-Modell von S.

Minimale Herbrand-Modelle Sei S eine Menge von Klauseln. Wir konstruieren eine Herbrand-Interpretation M durch P M (t 1,..., t n ) = true, falls für jedes Herbrand-Modell H von S, P H (t 1,..., t n ) = true. Falls M ein Modell von S ist, so ist es ein minimales Herbrand-Modell von S. Beispiel Das minimale Herbrand-Modell von (P(0) Q(0) R(0)) R(0) erfüllt R(0).

Eigenschaften von Hornklauseln Korollar Jede Menge von definiten Hornklauseln ist erfüllbar.

Eigenschaften von Hornklauseln Korollar Jede Menge von definiten Hornklauseln ist erfüllbar. Korollar Wenn eine Menge von Hornklauseln erfüllbar ist, existiert ein minimales Herbrand-Modell.

Eigenschaften von Hornklauseln Korollar Jede Menge von definiten Hornklauseln ist erfüllbar. Korollar Wenn eine Menge von Hornklauseln erfüllbar ist, existiert ein minimales Herbrand-Modell. Korollar Sei S eine Menge von Hornklauseln und P[x 1,..., x n ] quantorenfrei, so gilt S = x 1,..., x n P[x 1,..., x n ] gdw. S = P[t 1,..., t n ]

Minimale Herbrand-Modelle von definiten Hornklauseln Beispiel (P(0) Q(0) R(0)) R(0) R(0) P(0) Q(0)

Beweisbäume Beispiel (P(0) Q(0) F ) (R(0) P(0)) R(0) Q(0) F P(0) Q(0) R(0)

Hilfsfunktionen let renamerule k (asm,c) = let fvs = fv(list conj(c::asm)) in let n = length fvs in let vvs = map (fun i -> " "^ string of int i) (k - - (k+n-1)) in let inst = subst(fpf fvs (map (fun x -> Var x) vvs)) in (map inst asm,inst c),k+n;; let hornify cls = let pos,neg = partition positive cls in if length pos > 1 then failwith "non-horn clause" else (map negate neg,if pos = [] then False else hd pos);;

Backchaining let rec backchain rules n k env goals = match goals with [] -> env g::gs -> if n = 0 then failwith "Too deep" else tryfind (fun rule -> let (a,c),k = renamerule k rule in backchain rules (n - 1) k (unify literals env (c,g)) (a @ gs)) rules;;

Beweisen mit Hornklauseln let hprove fm = let rules = map hornify (simpcnf(fm)) in deepen (fun n -> backchain rules n 0 undefined [False], n) 0;;

Beweisen mit Hornklauseln let hprove fm = let rules = map hornify (simpcnf(fm)) in deepen (fun n -> backchain rules n 0 undefined [False], n) 0;; Beispiel (P(0) Q(0) F ) (R(0) P(0)) R(0) Q(0)

Beweisen mit Hornklauseln let hprove fm = let rules = map hornify (simpcnf(fm)) in deepen (fun n -> backchain rules n 0 undefined [False], n) 0;; Beispiel (P(0) Q(0) F ) (R(0) P(0)) R(0) Q(0) Hornifiziert [([<<P(0)>>; <<Q(0)>>], <<false>>); ([<<R(0)>>], <<P(0)>>); ([], <<Q(0)>>); ([], <<R(0)>>)]

Prolog logische Programmiersprache funktioniert durch Backchaining Regeln sind der Form Q :- P 1,..., P n. was für P 1 P n Q steht.

Prolog logische Programmiersprache funktioniert durch Backchaining Regeln sind der Form Q :- P 1,..., P n. was für P 1 P n Q steht. Beispiel loe(0, X). loe(s(x), s(y)) :- loe(x, Y).

Parser Der Parser wandelt Prolog-Regeln in Hornklauseln um: let parserule s = let c,rest = parse formula (parse infix atom,parse atom) [] (lex(explode s)) in let asm,rest1 = if rest <> [] & hd rest = ":-"then parse list ","(parse formula (parse infix atom,parse atom) []) (tl rest) else [],rest in if rest1 = [] then (asm,c) else failwith " Extra material after rule";;

Simple-Prolog Simulation von Prolog in Ocaml: let simpleprolog rules gl = backchain (map parserule rules) (-1) 0 undefined [parse gl];;

Simple-Prolog Simulation von Prolog in Ocaml: let simpleprolog rules gl = backchain (map parserule rules) (-1) 0 undefined [parse gl];; Beispiel let lerules = ["0 <= X"; " S(X) <= S(Y) :- X <= Y"];;

Simple-Prolog Simulation von Prolog in Ocaml: let simpleprolog rules gl = backchain (map parserule rules) (-1) 0 undefined [parse gl];; Beispiel let lerules = ["0 <= X"; " S(X) <= S(Y) :- X <= Y"];; Geparst [([], <<0 <= X>>); ([<<X <= Y>>], <<S(X) <= S(Y)>>)]

Simple-Prolog Simulation von Prolog in Ocaml: let simpleprolog rules gl = backchain (map parserule rules) (-1) 0 undefined [parse gl];; Beispiel let lerules = ["0 <= X"; " S(X) <= S(Y) :- X <= Y"];; Geparst [([], <<0 <= X>>); ([<<X <= Y>>], <<S(X) <= S(Y)>>)] Anfragen # simpleprolog lerules " S(S(0)) <= S(S(S(0)))";; # simpleprolog lerules " S(S(0)) <= S(0)";;

Prolog Auslesen von unifizierten Variablen: let prolog rules gl = let i = solve(simpleprolog rules gl) in mapfilter (fun x -> Atom(R(-",[Var x; apply i x]))) (fv(parse gl));;

Prolog Auslesen von unifizierten Variablen: let prolog rules gl = let i = solve(simpleprolog rules gl) in mapfilter (fun x -> Atom(R(-",[Var x; apply i x]))) (fv(parse gl));; Beispiel let lerules = ["0 <= X"; " S(X) <= S(Y) :- X <= Y"];; # prolog lerules " S(S(0)) <= X";;

Backchaining Beispiel let lerules = ["0 <= X"; " S(X) <= S(Y) :- X <= Y"];; # prolog lerules " S(S(0)) <= X";; let rec backchain rules n k env goals = match goals with [] -> env g::gs -> if n = 0 then failwith "Too deep" else tryfind (fun rule -> let (a,c),k = renamerule k rule in backchain rules (n - 1) k (unify literals env (c,g)) (a @ gs)) rules;;

Backchaining Beispiel let appendrules = [ " append(nil,l,l)"; " append(h::t,l,h::a) :- append(t,l,a)"];;

Funktioniert Prolog auch für Nicht-Hornklauseln? Man kann bspw. {P Q, P, Q} in eine erfüllbarkeitsäquivalente Menge von Hornklauseln transformieren: { P Q, P, Q }.

Funktioniert Prolog auch für Nicht-Hornklauseln? Man kann bspw. {P Q, P, Q} in eine erfüllbarkeitsäquivalente Menge von Hornklauseln transformieren: { P Q, P, Q }. Funktioniert aber nicht für {P Q, P Q, P Q, P Q}...

Kontrapositive Wir können Klauseln mit n Literalen in n Prolog-Regeln umschreiben. Die Formel wird dann zu P Q R Q R P P R Q P Q R. Falle Literale negativ sind, führen wir eine zusätzliche Regeln ein: P Q R wird zu P Q R.

Connection Tableaux Wir geben eine Algorithmus an um Unerfüllbarkeit einer endlichen Menge von propositionalen Klauseln zu testen. Eingabe: Ein Baum, mit Listen lits und fms als Knoten und folgender Bedingung:

Connection Tableaux Wir geben eine Algorithmus an um Unerfüllbarkeit einer endlichen Menge von propositionalen Klauseln zu testen. Eingabe: Ein Baum, mit Listen lits und fms als Knoten und folgender Bedingung: Es gibt eine minimale unerfüllbare Teilmenge von lits fms, die das vorderste Element von lits enthält.

Connection Tableaux Wir geben eine Algorithmus an um Unerfüllbarkeit einer endlichen Menge von propositionalen Klauseln zu testen. Eingabe: Ein Baum, mit Listen lits und fms als Knoten und folgender Bedingung: Es gibt eine minimale unerfüllbare Teilmenge von lits fms, die das vorderste Element von lits enthält. 1. Falls lits =, wähle eine Klausel C aus fms der Form P 1 P n and generiere einen neuen Ast mit Literalen {P i } and Formeln fms\{c}.

Connection Tableaux Wir geben eine Algorithmus an um Unerfüllbarkeit einer endlichen Menge von propositionalen Klauseln zu testen. Eingabe: Ein Baum, mit Listen lits und fms als Knoten und folgender Bedingung: Es gibt eine minimale unerfüllbare Teilmenge von lits fms, die das vorderste Element von lits enthält. 1. Falls lits =, wähle eine Klausel C aus fms der Form P 1 P n and generiere einen neuen Ast mit Literalen {P i } and Formeln fms\{c}. 2. Falls P das vorderste Element von lits ist, suche ein komplementäres Literal P und beende den Ast.

Connection Tableaux Wir geben eine Algorithmus an um Unerfüllbarkeit einer endlichen Menge von propositionalen Klauseln zu testen. Eingabe: Ein Baum, mit Listen lits und fms als Knoten und folgender Bedingung: Es gibt eine minimale unerfüllbare Teilmenge von lits fms, die das vorderste Element von lits enthält. 1. Falls lits =, wähle eine Klausel C aus fms der Form P 1 P n and generiere einen neuen Ast mit Literalen {P i } and Formeln fms\{c}. 2. Falls P das vorderste Element von lits ist, suche ein komplementäres Literal P und beende den Ast. 3. Falls P nicht in lits vorkommt, wähle eine Klausel der Form C = P P 1 P n in fms und generiere für jedes i {1,..., n} einen Ast mit Literalen {P i } lits und Formeln fms\{c}.

Connection Tableaux Umformungen (1) - (3) erhalten die gewünschte Eigenschaft. Um das Ganze auf FOL zu übertragen, benutzen wir Unifikation, d.h. wenn P das zuletzt hinzugefügte Literal ist, dann suchen wir eine Klausel, die ein Literal enthält, das mit P unifizierbar ist. Implementierung mit prolog-artigem Backtracking mit Anfangsgoal und Kontrapositiven als Regeln, d.h. Formel wird zuerst in CNF umgeformt.

Kontrapositive in Prolog: let contrapositives cls = let base = map (fun c -> map negate (subtract cls [c]),c) cls in if forall negative cls then (map negate cls,false)::base else base;;

ancestors: vorangehende Goals g: aktuelles Goal cont: continuation function (hier: Identität) env: aktuelle Instanziierung n: Counter für maximale Anzahl neuer Knoten im Baum k: Counter für Einführung neuer Variablen let rec mexpand rules ancestors g cont (env,n,k) = if n < 0 then failwith "Too deepëlse try tryfind (fun a -> cont (unify literals env (g,negate a),n,k)) ancestors with Failure -> tryfind (fun rule -> let (asm,c),k = renamerule k rule in itlist (mexpand rules (g::ancestors)) asm cont (unify literals env (g,c),n-length asm,k )) rules;;

MESON let puremeson fm = let cls = simpcnf(specialize(pnf fm)) in let rules = itlist ((@) ** contrapositives) cls [] in deepen (fun n -> mexpand rules [] False (fun x -> x) (undefined,n,0); n) 0;;

MESON let puremeson fm = let cls = simpcnf(specialize(pnf fm)) in let rules = itlist ((@) ** contrapositives) cls [] in deepen (fun n -> mexpand rules [] False (fun x -> x) (undefined,n,0); n) 0;; Hauptfunktion: let meson fm = let fm1 = askolemize(not(generalize fm)) in map (puremeson ** list conj) (simpdnf fm1);;

MESON Vorteile von MESON: Oft effizienter als Tableaux. Wenn nur Hornklauseln vorkommen, sind alle Literale positiv. Insbesondere kann man auf Resolution mit vorangehenden Klauseln verzichten. Nachteil: Erst Umformung in CNF

Optimierungen von MESON 1. Falls ein aktuelles Goal einen identischen Vorfahren hat, so ist es effizienter nur den Vorfahren zu expandieren. let rec equal env fm1 fm2 = try unify literals env (fm1,fm2) == env with Failure -> false;; 2. Wenn n die Suchgrenze für zwei Subgoals g1, g2 ist, so kann man die Obergrenze für jedes Subgoal auf n/2 setzen.