equal
deleted
inserted
replaced
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); |