Der vollständige Quelltext liefert keinen besonders effizienten Algorithmus, ist aber schön kurz, oder?
generalCutRule = cut[{{a1___, x_, e1___}, l1__}, {l2__, {a2___, x_, e2___}}] -> {{a1, e1}~Union~l2, l1~Union~{a2, e2}}
allCuts[klauselMenge_] := ReplaceList[#, generalCutRule] & /@(Outer[cut, #, #, 1]& [klauselMenge] // Flatten[#, 1]&) //Flatten[#, 1]& // Union[#, klauselMenge]&
cutAbschluß[klauselMenge_]
:= FixedPoint[allCuts, klauselMenge]
cutAbschluß[klauselMengeSerie7A4]
cutAbschluß[{{{b, f}, {}}, {{}, {b, e, f}}, {{}, {e, f}}, {{b}, {f}}}] =
{{{}, {e, f}}, {{},
{b, e, f}}, {{b}, {}}, {{b}, {e}}, {{b}, {f}}, {{b}, {b, e}}, {{b}, {e,
f}}, {{f}, {e, f}}, {{b, f}, {}}, {{b, f}, {e}}}
Die Ableitung von (p
-> p) aus axa ist gefunden und natürlich mit Mathematica.
Es geht ganz leicht, entweder mit den axa-Regeln 3 und 14, 15 oder
mit 1, 2 und 3. Die Vorführung gibt's in der Übung! Als Anregung
zum Nachdenken und Testen noch zwei Einzeiler :-).
abla[{L_, R_}, L_] := R
able[H_, p_?AtomQ, A_] := (H /. p -> A) /; varQ[p] && ! FreeQ[H, p]