src/Tools/Metis/src/Literal.sml
changeset 39353 7f11d833d65b
parent 23510 4521fead5609
parent 39349 2d0a4361c3ef
child 39443 e330437cd22a
equal deleted inserted replaced
39313:41ce0b56d858 39353:7f11d833d65b
     1 (* ========================================================================= *)
     1 (* ========================================================================= *)
     2 (* FIRST ORDER LOGIC LITERALS                                                *)
     2 (* FIRST ORDER LOGIC LITERALS                                                *)
     3 (* Copyright (c) 2001-2006 Joe Hurd, distributed under the BSD License *)
     3 (* Copyright (c) 2001-2006 Joe Hurd, distributed under the BSD License       *)
     4 (* ========================================================================= *)
     4 (* ========================================================================= *)
     5 
     5 
     6 structure Literal :> Literal =
     6 structure Literal :> Literal =
     7 struct
     7 struct
     8 
     8 
    68 
    68 
    69 (* ------------------------------------------------------------------------- *)
    69 (* ------------------------------------------------------------------------- *)
    70 (* A total comparison function for literals.                                 *)
    70 (* A total comparison function for literals.                                 *)
    71 (* ------------------------------------------------------------------------- *)
    71 (* ------------------------------------------------------------------------- *)
    72 
    72 
    73 fun compare ((pol1,atm1),(pol2,atm2)) =
    73 val compare = prodCompare boolCompare Atom.compare;
    74     case boolCompare (pol1,pol2) of
    74 
    75       LESS => GREATER
    75 fun equal (p1,atm1) (p2,atm2) = p1 = p2 andalso Atom.equal atm1 atm2;
    76     | EQUAL => Atom.compare (atm1,atm2)
       
    77     | GREATER => LESS;
       
    78 
    76 
    79 (* ------------------------------------------------------------------------- *)
    77 (* ------------------------------------------------------------------------- *)
    80 (* Subterms.                                                                 *)
    78 (* Subterms.                                                                 *)
    81 (* ------------------------------------------------------------------------- *)
    79 (* ------------------------------------------------------------------------- *)
    82 
    80 
    86 
    84 
    87 fun replace (lit as (pol,atm)) path_tm =
    85 fun replace (lit as (pol,atm)) path_tm =
    88     let
    86     let
    89       val atm' = Atom.replace atm path_tm
    87       val atm' = Atom.replace atm path_tm
    90     in
    88     in
    91       if Sharing.pointerEqual (atm,atm') then lit else (pol,atm')
    89       if Portable.pointerEqual (atm,atm') then lit else (pol,atm')
    92     end;
    90     end;
    93 
    91 
    94 (* ------------------------------------------------------------------------- *)
    92 (* ------------------------------------------------------------------------- *)
    95 (* Free variables.                                                           *)
    93 (* Free variables.                                                           *)
    96 (* ------------------------------------------------------------------------- *)
    94 (* ------------------------------------------------------------------------- *)
   105 
   103 
   106 fun subst sub (lit as (pol,atm)) : literal =
   104 fun subst sub (lit as (pol,atm)) : literal =
   107     let
   105     let
   108       val atm' = Atom.subst sub atm
   106       val atm' = Atom.subst sub atm
   109     in
   107     in
   110       if Sharing.pointerEqual (atm',atm) then lit else (pol,atm')
   108       if Portable.pointerEqual (atm',atm) then lit else (pol,atm')
   111     end;
   109     end;
   112 
   110 
   113 (* ------------------------------------------------------------------------- *)
   111 (* ------------------------------------------------------------------------- *)
   114 (* Matching.                                                                 *)
   112 (* Matching.                                                                 *)
   115 (* ------------------------------------------------------------------------- *)
   113 (* ------------------------------------------------------------------------- *)
   180 
   178 
   181 (* ------------------------------------------------------------------------- *)
   179 (* ------------------------------------------------------------------------- *)
   182 (* Parsing and pretty-printing.                                              *)
   180 (* Parsing and pretty-printing.                                              *)
   183 (* ------------------------------------------------------------------------- *)
   181 (* ------------------------------------------------------------------------- *)
   184 
   182 
   185 val pp = Parser.ppMap toFormula Formula.pp;
   183 val pp = Print.ppMap toFormula Formula.pp;
   186 
   184 
   187 val toString = Parser.toString pp;
   185 val toString = Print.toString pp;
   188 
   186 
   189 fun fromString s = fromFormula (Formula.fromString s);
   187 fun fromString s = fromFormula (Formula.fromString s);
   190 
   188 
   191 val parse = Parser.parseQuotation Term.toString fromString;
   189 val parse = Parse.parseQuotation Term.toString fromString;
   192 
   190 
   193 end
   191 end
   194 
   192 
   195 structure LiteralOrdered =
   193 structure LiteralOrdered =
   196 struct type t = Literal.literal val compare = Literal.compare end
   194 struct type t = Literal.literal val compare = Literal.compare end
   197 
   195 
       
   196 structure LiteralMap = KeyMap (LiteralOrdered);
       
   197 
   198 structure LiteralSet =
   198 structure LiteralSet =
   199 struct
   199 struct
   200 
   200 
   201   local
   201   local
   202     structure S = ElementSet (LiteralOrdered);
   202     structure S = ElementSet (LiteralMap);
   203   in
   203   in
   204     open S;
   204     open S;
   205   end;
   205   end;
   206 
   206 
   207   fun negateMember lit set = member (Literal.negate lit) set;
   207   fun negateMember lit set = member (Literal.negate lit) set;
   225         fun f (lit,set) = NameAritySet.union set (Literal.functions lit)
   225         fun f (lit,set) = NameAritySet.union set (Literal.functions lit)
   226       in
   226       in
   227         foldl f NameAritySet.empty
   227         foldl f NameAritySet.empty
   228       end;
   228       end;
   229 
   229 
       
   230   fun freeIn v = exists (Literal.freeIn v);
       
   231 
   230   val freeVars =
   232   val freeVars =
   231       let
   233       let
   232         fun f (lit,set) = NameSet.union set (Literal.freeVars lit)
   234         fun f (lit,set) = NameSet.union set (Literal.freeVars lit)
   233       in
   235       in
   234         foldl f NameSet.empty
   236         foldl f NameSet.empty
       
   237       end;
       
   238 
       
   239   val freeVarsList =
       
   240       let
       
   241         fun f (lits,set) = NameSet.union set (freeVars lits)
       
   242       in
       
   243         List.foldl f NameSet.empty
   235       end;
   244       end;
   236 
   245 
   237   val symbols =
   246   val symbols =
   238       let
   247       let
   239         fun f (lit,z) = Literal.symbols lit + z
   248         fun f (lit,z) = Literal.symbols lit + z
   251   fun subst sub lits =
   260   fun subst sub lits =
   252       let
   261       let
   253         fun substLit (lit,(eq,lits')) =
   262         fun substLit (lit,(eq,lits')) =
   254             let
   263             let
   255               val lit' = Literal.subst sub lit
   264               val lit' = Literal.subst sub lit
   256               val eq = eq andalso Sharing.pointerEqual (lit,lit')
   265               val eq = eq andalso Portable.pointerEqual (lit,lit')
   257             in
   266             in
   258               (eq, add lits' lit')
   267               (eq, add lits' lit')
   259             end
   268             end
   260               
   269 
   261         val (eq,lits') = foldl substLit (true,empty) lits
   270         val (eq,lits') = foldl substLit (true,empty) lits
   262       in
   271       in
   263         if eq then lits else lits'
   272         if eq then lits else lits'
   264       end;
   273       end;
   265 
   274 
       
   275   fun conjoin set =
       
   276       Formula.listMkConj (List.map Literal.toFormula (toList set));
       
   277 
       
   278   fun disjoin set =
       
   279       Formula.listMkDisj (List.map Literal.toFormula (toList set));
       
   280 
   266   val pp =
   281   val pp =
   267       Parser.ppMap
   282       Print.ppMap
   268         toList
   283         toList
   269         (Parser.ppBracket "{" "}" (Parser.ppSequence "," Literal.pp));
   284         (Print.ppBracket "{" "}" (Print.ppOpList "," Literal.pp));
   270 
   285 
   271 end
   286 end
   272 
   287 
   273 structure LiteralMap = KeyMap (LiteralOrdered);
   288 structure LiteralSetOrdered =
       
   289 struct type t = LiteralSet.set val compare = LiteralSet.compare end
       
   290 
       
   291 structure LiteralSetMap = KeyMap (LiteralSetOrdered);
       
   292 
       
   293 structure LiteralSetSet = ElementSet (LiteralSetMap);