(* ========================================================================= *) (* FIRST ORDER LOGIC LITERALS *) (* Copyright (c) 2001 Joe Leslie-Hurd, distributed under the BSD License *) (* ========================================================================= *)
structure Literal :> Literal = struct
open Useful;
(* ------------------------------------------------------------------------- *) (* A type for storing first order logic literals. *) (* ------------------------------------------------------------------------- *)
(* ------------------------------------------------------------------------- *) (* The size of a literal in symbols. *) (* ------------------------------------------------------------------------- *)
fun symbols ((_,atm) : literal) = Atom.symbols atm;
(* ------------------------------------------------------------------------- *) (* A total comparison function for literals. *) (* ------------------------------------------------------------------------- *)
val compare = prodCompare boolCompare Atom.compare;
fun sym (pol,atm) : literal = (pol, Atom.sym atm);
fun lhs ((_,atm) : literal) = Atom.lhs atm;
fun rhs ((_,atm) : literal) = Atom.rhs atm;
(* ------------------------------------------------------------------------- *) (* Special support for terms with type annotations. *) (* ------------------------------------------------------------------------- *)
fun typedSymbols ((_,atm) : literal) = Atom.typedSymbols atm;
fun nonVarTypedSubterms ((_,atm) : literal) = Atom.nonVarTypedSubterms atm;
fun fromString s = fromFormula (Formula.fromString s);
val parse = Parse.parseQuotation Term.toString fromString;
end
structure LiteralOrdered = structtype t = Literal.literal val compare = Literal.compare end
structure LiteralMap = KeyMap (LiteralOrdered);
structure LiteralSet = struct
local structure S = ElementSet (LiteralMap); in open S; end;
fun negateMember lit set = member (Literal.negate lit) set;
val negate = let fun f (lit,set) = add set (Literal.negate lit) in
foldl f empty end;
val relations = let fun f (lit,set) = NameAritySet.add set (Literal.relation lit) in
foldl f NameAritySet.empty end;
val functions = let fun f (lit,set) = NameAritySet.union set (Literal.functions lit) in
foldl f NameAritySet.empty end;
fun freeIn v = exists (Literal.freeIn v);
val freeVars = let fun f (lit,set) = NameSet.union set (Literal.freeVars lit) in
foldl f NameSet.empty end;
val freeVarsList = let fun f (lits,set) = NameSet.union set (freeVars lits) in List.foldl f NameSet.empty end;
val symbols = let fun f (lit,z) = Literal.symbols lit + z in
foldl f 0 end;
val typedSymbols = let fun f (lit,z) = Literal.typedSymbols lit + z in
foldl f 0 end;
fun subst sub lits = let fun substLit (lit,(eq,lits')) = let val lit' = Literal.subst sub lit val eq = eq andalso Portable.pointerEqual (lit,lit') in
(eq, add lits' lit') end
val (eq,lits') = foldl substLit (true,empty) lits in if eq then lits else lits' end;
fun conjoin set =
Formula.listMkConj (List.map Literal.toFormula (toList set));
fun disjoin set =
Formula.listMkDisj (List.map Literal.toFormula (toList set));
val pp = Print.ppMap
toList
(Print.ppBracket "{""}" (Print.ppOpList "," Literal.pp));
end
structure LiteralSetOrdered = structtype t = LiteralSet.setval compare = LiteralSet.compare 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.