fun freeVars {axioms,conjecture} =
NameSet.union
(LiteralSet.freeVarsList axioms)
(LiteralSet.freeVarsList conjecture);
local fun clauseToFormula cl =
Formula.listMkDisj (LiteralSet.transform Literal.toFormula cl); in fun toFormula prob =
Formula.listMkConj (List.map clauseToFormula (toClauses prob));
fun toGoal {axioms,conjecture} = let val clToFm = Formula.generalize o clauseToFormula val clsToFm = Formula.listMkConj o List.map clToFm
val fm = Formula.False val fm = ifList.null conjecture then fm else Formula.Imp (clsToFm conjecture, fm) val fm = Formula.Imp (clsToFm axioms, fm) in
fm end; end;
fun toString prob = Formula.toString (toFormula prob);
fun categorize prob = let val cls = toClauses prob
val rels = let fun f (cl,set) = NameAritySet.union set (LiteralSet.relations cl) in List.foldl f NameAritySet.empty cls end
val funs = let fun f (cl,set) = NameAritySet.union set (LiteralSet.functions cl) in List.foldl f NameAritySet.empty cls end
val propositional = if NameAritySet.allNullary rels then Propositional elseif NameAritySet.allNullary funs then EffectivelyPropositional else NonPropositional
val equality = ifnot (NameAritySet.member Atom.eqRelation rels) then NonEquality elseif NameAritySet.size rels = 1 then PureEquality else Equality
val horn = ifList.exists LiteralSet.null cls then Trivial elseifList.all (fn cl => LiteralSet.size cl = 1) cls then Unit else let fun pos cl = LiteralSet.count Literal.positive cl <= 1 fun neg cl = LiteralSet.count Literal.negative cl <= 1 in case (List.all pos cls, List.all neg cls) of
(true,true) => DoubleHorn
| (true,false) => Horn
| (false,true) => NegativeHorn
| (false,false) => NonHorn end in
{propositional = propositional,
equality = equality,
horn = horn} end;
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 ist noch experimentell.