From d58bba0fbda47b659b6e68e68f94e9c3696c7938 Mon Sep 17 00:00:00 2001 From: Dirk Pattinson <dirk.pattinson@anu.edu.au> Date: Thu, 5 Feb 2015 13:07:21 +1100 Subject: [PATCH] Removed Negation Normal Form of Choice as Choice is Self-Dual --- src/lib/CoAlgFormula.ml | 50 ++++++---------------------------------- src/lib/CoAlgFormula.mli | 2 -- src/lib/CoAlgLogics.ml | 2 +- src/lib/CoAlgMisc.ml | 13 +++++++---- 4 files changed, 16 insertions(+), 51 deletions(-) diff --git a/src/lib/CoAlgFormula.ml b/src/lib/CoAlgFormula.ml index 46b115d..371895e 100644 --- a/src/lib/CoAlgFormula.ml +++ b/src/lib/CoAlgFormula.ml @@ -56,8 +56,7 @@ type formula = | ID of formula (* modality of the identity functor *) | NORM of formula * formula (* default implication *) | NORMN of formula * formula (* \neg NORM (\neg A, \neg B) *) - | CHC of formula * formula - | CHCN of formula * formula + | CHC of formula * formula (* Choice is self-dual *) | FUS of bool * formula exception ConversionException of formula @@ -105,8 +104,7 @@ let rec sizeFormula f = | NORMN(f1, f2) -> succ (sizeFormula f1 + sizeFormula f2) | CONST _ | CONSTN _ -> 1 - | CHC (f1, f2) - | CHCN (f1, f2) -> succ (sizeFormula f1 + sizeFormula f2) + | CHC (f1, f2) -> succ (sizeFormula f1 + sizeFormula f2) | FUS (_, f1) -> succ (sizeFormula f1) (** Determines the size of a sorted formula. @@ -135,7 +133,7 @@ let rec iter func formula = | MORETHAN (_,_,a) | MAXEXCEPT (_,_,a) -> proc a | ID(a) -> proc a | NORM(a, b) | NORMN(a, b) -> (proc a; proc b) - | CHC (a,b) | CHCN (a,b) -> (proc a ; proc b) + | CHC (a,b) -> (proc a ; proc b) | FUS (_,a) -> proc a let rec convert_post func formula = (* run over all subformulas in post order *) @@ -168,7 +166,6 @@ let rec convert_post func formula = (* run over all subformulas in post order *) | NORM(a, b) -> NORM(c a, c b) | NORMN(a, b) -> NORMN(c a, c b) | CHC (a,b) -> CHC (c a, c b) - | CHCN (a,b) -> CHCN (c a, c b) | FUS (s,a) -> FUS (s, c a)) in func formula @@ -183,7 +180,7 @@ let convertToK formula = (* tries to convert a formula to a pure K formula *) | AND _ | OR _ | AP _ | NOT _ | AX _ | EX _ - | CHC _ | CHCN _ | FUS _ -> formula + | CHC _ | FUS _ -> formula | _ -> raise (ConversionException formula) in convert_post helper formula @@ -196,7 +193,7 @@ let convertToGML formula = (* tries to convert a formula to a pure GML formula * | EQU _ | IMP _ | AND _ | OR _ | AP _ | NOT _ - | CHC _ | CHCN _ | FUS _ -> formula + | CHC _ | FUS _ -> formula | AX (r,a) -> MAXEXCEPT (0,r,a) | EX (r,a) -> MORETHAN (0,r,a) | _ -> raise (ConversionException formula) @@ -348,12 +345,6 @@ let rec exportFormula_buffer sb f = Buffer.add_string sb s | CONSTN s -> Buffer.add_string sb "~="; Buffer.add_string sb s - | CHCN (f1, f2) -> - Buffer.add_string sb "~("; - exportFormula_buffer sb (negate f1); - Buffer.add_string sb " + "; - exportFormula_buffer sb (negate f2); - Buffer.add_string sb ")" | FUS (first, f1) -> Buffer.add_string sb (if first then "[pi1]" else "[pi2]"); prio 4 f1 @@ -437,7 +428,6 @@ let rec exportTatlFormula_buffer sb f = | CONST _ | CONSTN _ | CHC _ - | CHCN _ | ATLEASTPROB _ | LESSPROBFAIL _ | ID _ @@ -871,8 +861,7 @@ let rec nnfNeg f = | ID (f1) -> ID (nnfNeg f1) | NORM(f1, f2) -> NORMN(nnfNeg f1, nnfNeg f2) | NORMN(f1, f2) -> NORM (nnfNeg f1, nnfNeg f2) - | CHC (f1, f2) -> CHCN (nnfNeg f1, nnfNeg f2) - | CHCN (f1, f2) -> CHC (nnfNeg f1, nnfNeg f2) + | CHC (f1, f2) -> CHC (nnfNeg f1, nnfNeg f2) | FUS (first, f1) -> FUS (first, nnfNeg f1) (** Converts a formula to negation normal form @@ -951,10 +940,6 @@ and nnf f = let ft1 = nnf f1 in let ft2 = nnf f2 in if ft1 == f1 && ft2 == f2 then f else CHC (ft1, ft2) - | CHCN (f1, f2) -> - let ft1 = nnf f1 in - let ft2 = nnf f2 in - if ft1 == f1 && ft2 == f2 then f else CHCN (ft1, ft2) | FUS (first, f1) -> let ft = nnf f1 in if ft == f1 then f else FUS (first, ft) @@ -1121,17 +1106,6 @@ let rec simplify f = if (f1 == ft1) && (f2 == ft2) then f else CHC (ft1, ft2) end - | CHCN (f1, f2) -> - let ft1 = simplify f1 in - let ft2 = simplify f2 in - begin - match ft1, ft2 with - | TRUE, TRUE -> TRUE - | FALSE, FALSE -> FALSE - | _, _ -> - if (f1 == ft1) && (f2 == ft2) then f - else CHCN (ft1, ft2) - end | FUS (first, f1) -> let ft = simplify f1 in begin @@ -1582,7 +1556,6 @@ and hcFormula_node = | HCNORM of hcFormula * hcFormula | HCNORMN of hcFormula * hcFormula | HCCHC of hcFormula * hcFormula - | HCCHCN of hcFormula * hcFormula | HCFUS of bool * hcFormula (** Determines whether two formula nodes are structurally equal. @@ -1615,7 +1588,6 @@ let equal_hcFormula_node f1 f2 = | HCID f1, HCID f2 -> f1 == f2 | HCNORM (f1a, f1b), HCNORMN (f2a, f2b) -> f1a == f2a && f1b == f2b | HCCHC (f1a, f1b), HCCHC (f2a, f2b) -> f1a == f2a && f1b == f2b - | HCCHCN (f1a, f1b), HCCHCN (f2a, f2b) -> f1a == f2a && f1b == f2b | HCFUS (first1, f1), HCFUS (first2, f2) -> first1 = first2 && f1 == f2 (* The rest could be shortened to | _ -> false, but then the compiler would not warn if the formula type is extended @@ -1641,7 +1613,6 @@ let equal_hcFormula_node f1 f2 = | HCNORM _, _ | HCNORMN _, _ | HCCHC _, _ - | HCCHCN _, _ | HCFUS _, _ -> false (** Computes the hash value of a formula node. @@ -1665,7 +1636,6 @@ let hash_hcFormula_node f = | HCATLEASTPROB (p,f1) -> base * (base * (base * p.nominator + p.denominator) + f1.HC.hkey) + 9 | HCLESSPROBFAIL (p,f1) -> base * (base * (base * p.nominator + p.denominator) + f1.HC.hkey) + 10 | HCCHC (f1, f2) -> base * (base * f1.HC.hkey + f2.HC.hkey) + 11 - | HCCHCN (f1, f2) -> base * (base * f1.HC.hkey + f2.HC.hkey) + 12 | HCFUS (first, f1) -> base * (base * (Hashtbl.hash first) + f1.HC.hkey) + 13 | HCENFORCES (s, f1) -> base * (base * (Hashtbl.hash s) + f1.HC.hkey) + 14 | HCALLOWS (s, f1) -> base * (base * (Hashtbl.hash s) + f1.HC.hkey) + 15 @@ -1702,7 +1672,6 @@ let toFml_hcFormula_node f = | HCNORM (f1, f2) -> NORM(f1.HC.fml, f2.HC.fml) | HCNORMN (f1, f2) -> NORMN(f1.HC.fml, f2.HC.fml) | HCCHC (f1, f2) -> CHC (f1.HC.fml, f2.HC.fml) - | HCCHCN (f1, f2) -> CHCN (f1.HC.fml, f2.HC.fml) | HCFUS (first, f1) -> FUS (first, f1.HC.fml) (** Determines the negation (in negation normal form) of a formula node. @@ -1731,8 +1700,7 @@ let negNde_hcFormula_node f = | HCID (f1) -> HCID(f1.HC.neg) | HCNORM (f1, f2) -> HCNORMN(f1.HC.neg, f2.HC.neg) | HCNORMN (f1, f2) -> HCNORM(f1.HC.neg, f2.HC.neg) - | HCCHC (f1, f2) -> HCCHCN (f1.HC.neg, f2.HC.neg) - | HCCHCN (f1, f2) -> HCCHC (f1.HC.neg, f2.HC.neg) + | HCCHC (f1, f2) -> HCCHC (f1.HC.neg, f2.HC.neg) | HCFUS (first, f1) -> HCFUS (first, f1.HC.neg) (** An instantiation of hash-consing for formulae. @@ -1817,10 +1785,6 @@ let rec hc_formula hcF f = let tf1 = hc_formula hcF f1 in let tf2 = hc_formula hcF f2 in HcFormula.hashcons hcF (HCCHC (tf1, tf2)) - | CHCN (f1, f2) -> - let tf1 = hc_formula hcF f1 in - let tf2 = hc_formula hcF f2 in - HcFormula.hashcons hcF (HCCHCN (tf1, tf2)) | FUS (first, f1) -> let tf1 = hc_formula hcF f1 in HcFormula.hashcons hcF (HCFUS (first, tf1)) diff --git a/src/lib/CoAlgFormula.mli b/src/lib/CoAlgFormula.mli index 3acba52..3c70e1d 100644 --- a/src/lib/CoAlgFormula.mli +++ b/src/lib/CoAlgFormula.mli @@ -40,7 +40,6 @@ type formula = | NORM of formula * formula (* default implication *) | NORMN of formula * formula (* \neg NORM (\neg A, \neg B) *) | CHC of formula * formula - | CHCN of formula * formula | FUS of bool * formula exception ConversionException of formula @@ -146,7 +145,6 @@ and hcFormula_node = | HCNORM of hcFormula * hcFormula | HCNORMN of hcFormula * hcFormula | HCCHC of hcFormula * hcFormula - | HCCHCN of hcFormula * hcFormula | HCFUS of bool * hcFormula module HcFormula : (HashConsing.S with type nde = hcFormula_node and type fml = formula) diff --git a/src/lib/CoAlgLogics.ml b/src/lib/CoAlgLogics.ml index 8cdc64f..c7f4a37 100644 --- a/src/lib/CoAlgLogics.ml +++ b/src/lib/CoAlgLogics.ml @@ -375,7 +375,7 @@ let mkRule_Const colors sort bs sl : stateExpander = let allneg = List.length colors = List.length neg in let twopos = List.length pos > 1 in let rules = if (clash || allneg || twopos) - then [( (fun x -> bs), lazylistFromList [] )] (* no backjumping *) + then [((fun x -> bs), lazylistFromList [])] (* no backjumping *) else [] in lazylistFromList rules diff --git a/src/lib/CoAlgMisc.ml b/src/lib/CoAlgMisc.ml index 783b8ee..33added 100644 --- a/src/lib/CoAlgMisc.ml +++ b/src/lib/CoAlgMisc.ml @@ -330,8 +330,13 @@ let queueIsEmpty () = let queueInsertState state = queueStates := state::!queueStates +(* original version: breadth-first *) let queueInsertCore core = queueCores2 := core::!queueCores2 +(* experiment: depth first +let queueInsertCore core = queueCores1 := core::!queueCores1 +*) + let queueInsertCnstr cset = queueCnstrs := cset::!queueCnstrs let queueGetElement () = @@ -847,8 +852,7 @@ let rec detClosure nomTbl hcF fset atset nomset s f = detClosure nomTbl hcF fset atset nomset (List.nth sortlst 0) f1; detClosure nomTbl hcF fset atset nomset (List.nth sortlst 1) f2 - | C.HCCHC (f1, f2) - | C.HCCHCN (f1, f2) -> + | C.HCCHC (f1, f2) -> if func <> Choice || List.length sortlst <> 2 then raise (C.CoAlgException "Choice formula is used in wrong sort.") else (); @@ -989,7 +993,7 @@ let initTables nomTbl hcF htF htR s f n = (* idea: hash identifier names *) | C.HCID (f1) -> !arrayType.(s).(n) <- IdF; - !arrayDest1.(s).(n) <- C.HcFHt.find htF.(List.nth sortlst 0) f1; + !arrayDest1.(s).(n) <- C.HcFHt.find htF.(List.nth sortlst 0) f1 | C.HCNORM (f1, f2) -> !arrayType.(s).(n) <- NormF; !arrayDest1.(s).(n) <- C.HcFHt.find htF.(List.nth sortlst 0) f1; @@ -999,8 +1003,7 @@ let initTables nomTbl hcF htF htR s f n = !arrayDest1.(s).(n) <- C.HcFHt.find htF.(List.nth sortlst 0) f1; !arrayDest2.(s).(n) <- C.HcFHt.find htF.(List.nth sortlst 1) f2 (* note that choice is self-dual *) - | C.HCCHC (f1, f2) - | C.HCCHCN (f1, f2) -> + | C.HCCHC (f1, f2) -> !arrayType.(s).(n) <- ChcF; !arrayDest1.(s).(n) <- C.HcFHt.find htF.(List.nth sortlst 0) f1; !arrayDest2.(s).(n) <- C.HcFHt.find htF.(List.nth sortlst 1) f2 -- GitLab