val () = r := n + 1 in
n end in
fn () => Portable.critical new () end;
(* ------------------------------------------------------------------------- *) (* A type of clause. *) (* ------------------------------------------------------------------------- *)
fun equalThms cl cl' = Thm.equal (thm cl) (thm cl');
fun new parameters thm =
Clause {parameters = parameters, id = newId (), thm = thm};
fun literals cl = Thm.clause (thm cl);
fun isTautology (Clause {thm,...}) = Thm.isTautology thm;
fun isContradiction (Clause {thm,...}) = Thm.isContradiction thm;
(* ------------------------------------------------------------------------- *) (* The term ordering is used to cut down inferences. *) (* ------------------------------------------------------------------------- *)
fun strictlyLess ordering x_y = case KnuthBendixOrder.compare ordering x_y of
SOME LESS => true
| _ => false;
fun isLargerTerm ({ordering,orderTerms,...} : parameters) l_r = not orderTerms orelse not (strictlyLess ordering l_r);
local fun atomToTerms atm = case total Atom.destEq atm of
NONE => [Term.Fn atm]
| SOME (l,r) => [l,r];
fun notStrictlyLess ordering (xs,ys) = let fun less x = List.exists (fn y => strictlyLess ordering (x,y)) ys in not (List.all less xs) end; in fun isLargerLiteral ({ordering,orderLiterals,...} : parameters) lits = case orderLiterals of
NoLiteralOrder => K true
| UnsignedLiteralOrder => let fun addLit ((_,atm),acc) = atomToTerms atm @ acc
val tms = LiteralSet.foldl addLit [] lits in
fn (_,atm') => notStrictlyLess ordering (atomToTerms atm', tms) end
| PositiveLiteralOrder => case LiteralSet.findl (K true) lits of
NONE => K true
| SOME (pol,_) => let fun addLit ((p,atm),acc) = if p = pol then atomToTerms atm @ acc else acc
val tms = LiteralSet.foldl addLit [] lits in
fn (pol',atm') => if pol <> pol' then pol else notStrictlyLess ordering (atomToTerms atm', tms) end; end;
fun largestLiterals (Clause {parameters,thm,...}) = let val litSet = Thm.clause thm val isLarger = isLargerLiteral parameters litSet fun addLit (lit,s) = if isLarger lit then LiteralSet.add s lit else s in
LiteralSet.foldr addLit LiteralSet.empty litSet end;
(*MetisTrace6 vallargestLiterals=fncl=> let valppResult=LiteralSet.pp val()=Print.tracepp"Clause.largestLiterals:cl"cl valresult=largestLiteralscl val()=Print.traceppResult"Clause.largestLiterals:result"result in result end;
*)
fun largestEquations (cl as Clause {parameters,...}) = let fun addEq lit ort (l_r as (l,_)) acc = if isLargerTerm parameters l_r then (lit,ort,l) :: acc else acc
fun addLit (lit,acc) = case total Literal.destEq lit of
NONE => acc
| SOME (l,r) => let val acc = addEq lit Rewrite.RightToLeft (r,l) acc val acc = addEq lit Rewrite.LeftToRight (l,r) acc in
acc end in
LiteralSet.foldr addLit [] (largestLiterals cl) end;
local fun addLit (lit,acc) = let fun addTm ((path,tm),acc) = (lit,path,tm) :: acc in List.foldl addTm acc (Literal.nonVarTypedSubterms lit) end; in fun largestSubterms cl = LiteralSet.foldl addLit [] (largestLiterals cl);
fun allSubterms cl = LiteralSet.foldl addLit [] (literals cl); end;
(* ------------------------------------------------------------------------- *) (* Simplifying rules: these preserve the clause id. *) (* ------------------------------------------------------------------------- *)
fun freshVars (Clause {parameters,id,thm}) =
Clause {parameters = parameters, id = id, thm = Rule.freshVars thm};
fun simplify (Clause {parameters,id,thm}) = case Rule.simplify thm of
NONE => NONE
| SOME thm => SOME (Clause {parameters = parameters, id = id, thm = thm});
fun reduce units (Clause {parameters,id,thm}) =
Clause {parameters = parameters, id = id, thm = Units.reduce units thm};
local fun simp rewr (parm : parameters) id th = let val {ordering,...} = parm val cmp = KnuthBendixOrder.compare ordering in
Rewrite.rewriteIdRule rewr cmp id th end; in fun rewrite rewr cl = let val Clause {parameters = parm, id, thm = th} = cl
val th = case Rewrite.peek rewr id of
NONE => simp rewr parm id th
| SOME ((_,th),_) => if Rewrite.isReduced rewr then th else simp rewr parm id th
val result = Clause {parameters = parm, id = id, thm = th}
(*MetisTrace4 val()=Print.tracepp"Clause.rewrite:result"result
*) in
result end (*MetisDebug handleErrorerr=>raiseError("Clause.rewrite:\n"^err);
*) end;
(* ------------------------------------------------------------------------- *) (* Inference rules: these generate new clause ids. *) (* ------------------------------------------------------------------------- *)
fun factor (cl as Clause {parameters,thm,...}) = let val lits = largestLiterals cl
fun apply sub = new parameters (Thm.subst sub thm) in List.map apply (Rule.factor' lits) end;
(*MetisTrace5 valfactor=fncl=> let val()=Print.tracepp"Clause.factor:cl"cl valresult=factorcl val()=Print.trace(Print.ppListpp)"Clause.factor:result"result in result end;
*)
fun resolve (cl1,lit1) (cl2,lit2) = let (*MetisTrace5 val()=Print.tracepp"Clause.resolve:cl1"cl1 val()=Print.traceLiteral.pp"Clause.resolve:lit1"lit1 val()=Print.tracepp"Clause.resolve:cl2"cl2 val()=Print.traceLiteral.pp"Clause.resolve:lit2"lit2
*) val Clause {parameters, thm = th1, ...} = cl1 and Clause {thm = th2, ...} = cl2 valsub = Literal.unify Subst.empty lit1 (Literal.negate lit2) (*MetisTrace5 val()=Print.traceSubst.pp"Clause.resolve:sub"sub
*) val lit1 = Literal.subst sub lit1 val lit2 = Literal.negate lit1 val th1 = Thm.subst sub th1 and th2 = Thm.subst sub th2 val _ = isLargerLiteral parameters (Thm.clause th1) lit1 orelse (*MetisTrace5 (trace"Clause.resolve:th1violatesordering\n";false)orelse
*) raise Error "resolve: clause1: ordering constraints" val _ = isLargerLiteral parameters (Thm.clause th2) lit2 orelse (*MetisTrace5 (trace"Clause.resolve:th2violatesordering\n";false)orelse
*) raise Error "resolve: clause2: ordering constraints" val th = Thm.resolve lit1 th1 th2 (*MetisTrace5 val()=Print.traceThm.pp"Clause.resolve:th"th
*) val cl = Clause {parameters = parameters, id = newId (), thm = th} (*MetisTrace5 val()=Print.tracepp"Clause.resolve:cl"cl
*) in
cl end;
fun paramodulate (cl1,lit1,ort1,tm1) (cl2,lit2,path2,tm2) = let (*MetisTrace5 val()=Print.tracepp"Clause.paramodulate:cl1"cl1 val()=Print.traceLiteral.pp"Clause.paramodulate:lit1"lit1 val()=Print.traceRewrite.ppOrient"Clause.paramodulate:ort1"ort1 val()=Print.traceTerm.pp"Clause.paramodulate:tm1"tm1 val()=Print.tracepp"Clause.paramodulate:cl2"cl2 val()=Print.traceLiteral.pp"Clause.paramodulate:lit2"lit2 val()=Print.traceTerm.ppPath"Clause.paramodulate:path2"path2 val()=Print.traceTerm.pp"Clause.paramodulate:tm2"tm2
*) val Clause {parameters, thm = th1, ...} = cl1 and Clause {thm = th2, ...} = cl2 valsub = Subst.unify Subst.empty tm1 tm2 val lit1 = Literal.subst sub lit1 and lit2 = Literal.subst sub lit2 and th1 = Thm.subst sub th1 and th2 = Thm.subst sub th2
val _ = isLargerLiteral parameters (Thm.clause th1) lit1 orelse raise Error "Clause.paramodulate: with clause: ordering" val _ = isLargerLiteral parameters (Thm.clause th2) lit2 orelse raise Error "Clause.paramodulate: into clause: ordering"
val eqn = (Literal.destEq lit1, th1) val eqn as (l_r,_) = case ort1 of
Rewrite.LeftToRight => eqn
| Rewrite.RightToLeft => Rule.symEqn eqn (*MetisTrace6 val()=Print.traceRule.ppEquation"Clause.paramodulate:eqn"eqn
*) val _ = isLargerTerm parameters l_r orelse raise Error "Clause.paramodulate: equation: ordering constraints" val th = Rule.rewrRule eqn lit2 path2 th2 (*MetisTrace5 val()=Print.traceThm.pp"Clause.paramodulate:th"th
*) in
Clause {parameters = parameters, id = newId (), thm = th} end (*MetisTrace5 handleErrorerr=> let val()=trace("Clause.paramodulate:failed:"^err^"\n") in raiseErrorerr end;
*)
end
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet am 2026-06-10)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.