diff --git a/src/lib/CoAlgLogics.ml b/src/lib/CoAlgLogics.ml index c7f4a376ed0cdaf01b58ecd44f4124dd3328321f..45d99f410094db6382f78851512fb86b9685003a 100644 --- a/src/lib/CoAlgLogics.ml +++ b/src/lib/CoAlgLogics.ml @@ -11,8 +11,8 @@ open Gmlmip module S = MiscSolver (** directly return a list of rules **) -let mkRuleList_MultiModalK sort bs sl : rule list = - (* arguments: +let mkRuleList_MultiModalK sort bs defer sl : rule list = + (* arguments: sort: type of formulae in bs (needed to disambiguate hashing) sl: sorts functor arguments, e.g. type of argument formulae bs: tableau sequent consisting of modal atoms @@ -26,6 +26,13 @@ let mkRuleList_MultiModalK sort bs sl : rule list = NB: propagating the whole premiss is always safe. *) assert (List.length sl = 1); + let refocusing = bsetCompare (bsetMakeRealEmpty ()) defer = 0 in + let deferral = + if refocusing then + bsetCopy bs + else + defer + in let dep f bsl = (* dependencies for formula f (f is a diamond) *) assert (List.length bsl = 1); (* -+ *) let bs1 = List.hd bsl in (* -+-> [bs1] := bsl *) @@ -46,17 +53,27 @@ let mkRuleList_MultiModalK sort bs sl : rule list = let getRules f acc = if lfGetType sort f = ExF then (* f = ∃R.C,i.e. a diamond *) let bs1 = bsetMake () in - bsetAdd bs1 (lfGetDest1 sort f); (* bs1 := { C } *) + let defer1 = bsetMakeRealEmpty () in + let nextf = (lfGetDest1 sort f) in + bsetAdd bs1 nextf; (* bs1 := { C } *) + if (refocusing && (lfGetDeferral sort nextf) != (Hashtbl.hash "ε")) || + ((bsetMem defer f) && (lfGetDeferral sort f) = (lfGetDeferral sort nextf)) + then + bsetAdd defer1 nextf; let (role : int) = lfGetDest3 sort f in (* role := R *) let filterFkt f1 = if lfGetType sort f1 = AxF && lfGetDest3 sort f1 = role then (* if f1 = ∀R.D then bs1 = bs1 ∪ { D } *) - bsetAdd bs1 (lfGetDest1 sort f1) + let nextf1 = (lfGetDest1 sort f1) in + bsetAdd bs1 nextf1; + (if (bsetMem defer f1) && + (lfGetDeferral sort f1) = (lfGetDeferral sort nextf1) then + bsetAdd defer1 nextf1;) else () in bsetIter filterFkt bs; (* bs1 := bs1 ∪ { D | some "∀R.D" ∈ bs } *) let s1 = List.hd sl in (* [s1] := sl *) - let rle = (dep f, lazylistFromList [(s1, bs1)]) in + let rle = (dep f, lazylistFromList [(s1, bs1, defer1)]) in rle::acc else acc in @@ -72,14 +89,14 @@ let mkRuleList_MultiModalK sort bs sl : rule list = *) bsetFold getRules bs [] -let mkRule_MultiModalK sort bs sl : stateExpander = - let rules = mkRuleList_MultiModalK sort bs sl in +let mkRule_MultiModalK sort bs defer sl : stateExpander = + let rules = mkRuleList_MultiModalK sort bs defer sl in lazylistFromList rules (* TODO: test it with: make && ./coalg sat <<< $'<R> False \n [R] False \n [R] True' *) -let mkRule_MultiModalKD sort bs sl : stateExpander = +let mkRule_MultiModalKD sort bs defer sl : stateExpander = assert (List.length sl = 1); (* functor has just one argument *) let s1 = List.hd sl in (* [s1] = sl *) let roles = S.makeBS () in @@ -114,6 +131,7 @@ let mkRule_MultiModalKD sort bs sl : stateExpander = res in let succs = bsetMake () in (* succs := {D | ∀r.D ∈ bs *) + let defer1 = bsetMake () in (* TODO: actually track deferrals *) let f formula = if lfGetType sort formula = AxF && lfGetDest3 sort formula = r @@ -121,7 +139,7 @@ let mkRule_MultiModalKD sort bs sl : stateExpander = else () in bsetIter f bs; - (dep r, lazylistFromList [(s1, succs)])::acc + (dep r, lazylistFromList [(s1, succs, defer1)])::acc in (* mkRule_MultiModalKD sort bs [s1] @@ -132,7 +150,7 @@ let mkRule_MultiModalKD sort bs sl : stateExpander = } ∪ mkRule_MultiModalK sort bs [s1] *) - let rules = mkRuleList_MultiModalK sort bs sl in + let rules = mkRuleList_MultiModalK sort bs defer sl in (* extend rules from K with enforcing of successors *) let rules = S.foldBS getRules roles rules in lazylistFromList rules @@ -196,14 +214,15 @@ let compatible sort (a: bset) formula1 = / \i=1 a_i /\ b / \j=1 c_j *) -(* Not yet implemented: backjumping hooks. +(* Not yet implemented: backjumping hooks. E.g. in Rule 1, if a subset I of {a_1, ..., a_n} is unsat, then {[C_i] a_i : i \in I} is already unsat. *) -let mkRule_CL sort bs sl : stateExpander = +let mkRule_CL sort bs defer sl : stateExpander = assert (List.length sl = 1); (* TODO: Why? *) + let defer1 = bsetMake () in (* TODO: track deferrals *) let s1 = List.hd sl in (* [s1] = List.hd sl *) let boxes = bsetFilter bs (fun f -> lfGetType sort f = EnforcesF) in let diamonds = bsetFilter bs (fun f -> lfGetType sort f = AllowsF) in @@ -242,7 +261,7 @@ let mkRule_CL sort bs sl : stateExpander = let children = bsetMakeRealEmpty () in List.iter (bsetAdd children) (b::c_j) ; List.iter (bsetAdd children) (a_i) ; - ((fun bs1 -> bs), lazylistFromList [(s1, children)])::acc + ((fun bs1 -> bs), lazylistFromList [(s1, children, defer1)])::acc in List.fold_left createSingleRule acc maxdisj in @@ -256,7 +275,7 @@ let mkRule_CL sort bs sl : stateExpander = *) let a_i : bset = bsetMakeRealEmpty () in bsetIter (fun f -> bsetAdd a_i (lfGetDest1 sort f)) coalitions ; - ((fun bs1 -> bs), lazylistFromList [(s1, a_i)])::acc + ((fun bs1 -> bs), lazylistFromList [(s1, a_i, defer1)])::acc in let rules = List.fold_left getRule1 rules disjoints in (* @@ -268,8 +287,9 @@ let mkRule_CL sort bs sl : stateExpander = *) lazylistFromList rules -let mkRule_GML sort bs sl : stateExpander = +let mkRule_GML sort bs defer sl : stateExpander = assert (List.length sl = 1); + let defer1 = bsetMake () in (* TODO: track deferrals *) let s1 = List.hd sl in (* [s1] = List.hd sl *) let diamonds = bsetFilter bs (fun f -> lfGetType sort f = MoreThanF) in let boxes = bsetFilter bs (fun f -> lfGetType sort f = MaxExceptF) in @@ -305,7 +325,7 @@ let mkRule_GML sort bs sl : stateExpander = in bsetAdd res f) conj; - (s1,res) + (s1,res, defer1) in let rc = List.map handleConjunction rc in ((fun bs1 -> bs),lazylistFromList rc)::acc @@ -314,8 +334,9 @@ let mkRule_GML sort bs sl : stateExpander = let rules = S.foldBS addRule roles [] in lazylistFromList rules -let mkRule_PML sort bs sl : stateExpander = +let mkRule_PML sort bs defer sl : stateExpander = assert (List.length sl = 1); + let defer1 = bsetMake () in (* TODO: track deferrals *) let s1 = List.hd sl in (* [s1] = List.hd sl *) let diamonds = bsetFilter bs (fun f -> lfGetType sort f = AtLeastProbF) in let boxes = bsetFilter bs (fun f -> lfGetType sort f = LessProbFailF) in @@ -352,7 +373,7 @@ let mkRule_PML sort bs sl : stateExpander = end in List.iter handleLiteral conj; - (s1,res) + (s1,res, defer1) in let rc = List.map handleConjunction rc in ((fun bs1 -> bs),lazylistFromList rc)::acc @@ -361,7 +382,7 @@ let mkRule_PML sort bs sl : stateExpander = lazylistFromList rules (* constant functor *) -let mkRule_Const colors sort bs sl : stateExpander = +let mkRule_Const colors sort bs defer sl : stateExpander = assert (List.length sl = 1); (* just one (formal) argument *) let helper (f:localFormula) (pos, neg) = let col = lfGetDest3 sort f in @@ -370,17 +391,18 @@ let mkRule_Const colors sort bs sl : stateExpander = | ConstF -> ((col::pos), neg) | _ -> (pos, neg) in - let (pos, neg) = bsetFold helper bs ([], []) in (* pos/neg literals *) + let (pos, neg) = bsetFold helper bs ([], []) in (* pos/neg literals *) let clash = List.exists (fun l -> List.mem l pos) neg in (* =a /\ ~ = a *) let allneg = List.length colors = List.length neg in let twopos = List.length pos > 1 in - let rules = if (clash || allneg || twopos) + let rules = if (clash || allneg || twopos) then [((fun x -> bs), lazylistFromList [])] (* no backjumping *) else [] - in + in lazylistFromList rules -let mkRule_Identity sort bs sl : stateExpander = +let mkRule_Identity sort bs defer sl : stateExpander = + let defer1 = bsetMake () in (* TODO: track deferrals *) assert (List.length sl = 1); (* Identity has one argument *) let s1 = List.hd sl in let dep bsl = (* return arguments prefixed with identity operator *) @@ -398,19 +420,20 @@ let mkRule_Identity sort bs sl : stateExpander = in let bs1 = bsetMake () in let getRule f = - if lfGetType sort f = IdF + if lfGetType sort f = IdF then bsetAdd bs1 (lfGetDest1 sort f) else () in bsetIter getRule bs; - lazylistFromList [(dep, lazylistFromList [(s1, bs1)])] + lazylistFromList [(dep, lazylistFromList [(s1, bs1, defer1)])] -let mkRule_DefaultImplication sort bs sl : stateExpander = +let mkRule_DefaultImplication sort bs defer sl : stateExpander = raise (CoAlgFormula.CoAlgException ("Default Implication Not yet implemented.")) - -let mkRule_Choice sort bs sl : stateExpander = + +let mkRule_Choice sort bs defer sl : stateExpander = assert (List.length sl = 2); + let defer1 = bsetMake () in (* TODO: track deferrals *) let dep bsl = assert (List.length bsl = 2); let bs1 = List.nth bsl 0 in @@ -436,11 +459,12 @@ let mkRule_Choice sort bs sl : stateExpander = bsetIter getRule bs; let s1 = List.nth sl 0 in let s2 = List.nth sl 1 in - lazylistFromList [(dep, lazylistFromList [(s1, bs1); (s2, bs2)])] + lazylistFromList [(dep, lazylistFromList [(s1, bs1, defer1); (s2, bs2, defer1)])] -let mkRule_Fusion sort bs sl : stateExpander = +let mkRule_Fusion sort bs defer sl : stateExpander = assert (List.length sl = 2); + let defer1 = bsetMake () in (* TODO: track deferrals *) let dep proj bsl = assert (List.length bsl = 1); let bs1 = List.hd bsl in @@ -465,7 +489,7 @@ let mkRule_Fusion sort bs sl : stateExpander = bsetIter getRule bs; let s1 = List.nth sl 0 in let s2 = List.nth sl 1 in - lazylistFromList [(dep 0, lazylistFromList [(s1, bs1)]); (dep 1, lazylistFromList [(s2, bs2)])] + lazylistFromList [(dep 0, lazylistFromList [(s1, bs1, defer1)]); (dep 1, lazylistFromList [(s2, bs2, defer1)])] (* Maps a logic represented by the type "functors" to the corresponding diff --git a/src/lib/CoAlgLogics.mli b/src/lib/CoAlgLogics.mli index 48d0958b68bceec89898bf9788866dea0e7084bc..dd5c9ad4230fb0ae152217bd8b8c7cf9755e113d 100644 --- a/src/lib/CoAlgLogics.mli +++ b/src/lib/CoAlgLogics.mli @@ -6,4 +6,4 @@ open CoAlgMisc -val getExpandingFunctionProducer : functors -> sort -> bset -> sort list -> stateExpander +val getExpandingFunctionProducer : functors -> sort -> bset -> bset -> sort list -> stateExpander diff --git a/src/lib/CoAlgMisc.ml b/src/lib/CoAlgMisc.ml index 2ea83af44002edae8f2f5a581ac85bc3c1df01b3..071e169a6f60fe2cb0d21db6f51d401490608651 100644 --- a/src/lib/CoAlgMisc.ml +++ b/src/lib/CoAlgMisc.ml @@ -21,6 +21,17 @@ module BsSet = Set.Make( (** An instantiation of a hash table (of the standard library) for bitsets. *) module GHt = Hashtbl.Make( + struct + type t = S.bitset * S.bitset + let equal ((bs1l, bs1r) : t) (bs2l, bs2r) = + (S.compareBS bs1l bs2l = 0) && (S.compareBS bs1r bs2r = 0) + let hash ((bsl, bsr) : t) = (S.hashBS bsl) lxor (S.hashBS bsr) + end + ) + +(** An instantiation of a hash table (of the standard library) for bitsets. + *) +module GHtS = Hashtbl.Make( struct type t = S.bitset let equal (bs1 : t) bs2 = S.compareBS bs1 bs2 = 0 @@ -215,7 +226,7 @@ and setState = state GHt.t array and setCore = core GHt.t array -and setCnstr = unit GHt.t +and setCnstr = unit GHtS.t (*****************************************************************************) @@ -237,7 +248,7 @@ and nodeStatus = and dependencies = bset list -> bset -and rule = (dependencies * (sort * bset) lazylist) +and rule = (dependencies * (sort * bset * bset) lazylist) and 'a lazyliststep = | MultipleElements of 'a list @@ -396,14 +407,14 @@ let doSatPropagation () = let graphStates = ref (Array.make 0 (GHt.create 0 : state GHt.t)) let graphCores = ref (Array.make 0 (GHt.create 0 : core GHt.t)) -let graphCnstrs = ref (GHt.create 0 : constrnt GHt.t) +let graphCnstrs = ref (GHtS.create 0 : constrnt GHtS.t) let graphRoot = ref (None : core option) let graphInit () = let size = Array.length !sortTable in graphStates := Array.init size (fun _ -> GHt.create 128); graphCores := Array.init size (fun _ -> GHt.create 128); - graphCnstrs := GHt.create 128; + graphCnstrs := GHtS.create 128; graphRoot := None let graphIterStates fkt = @@ -412,18 +423,18 @@ let graphIterStates fkt = let graphIterCores fkt = Array.iter (fun ht -> GHt.iter (fun _ x -> fkt x) ht) !graphCores -let graphIterCnstrs fkt = GHt.iter fkt !graphCnstrs +let graphIterCnstrs fkt = GHtS.iter fkt !graphCnstrs let graphClearCnstr () = - let newGraph = GHt.create (GHt.length !graphCnstrs) in + let newGraph = GHtS.create (GHtS.length !graphCnstrs) in let copyCnstr cset cnstr = match cnstr with | UnsatC - | SatC -> GHt.add newGraph cset cnstr - | OpenC _ -> GHt.add newGraph cset (OpenC []) - | UnexpandedC _ -> GHt.add newGraph cset (UnexpandedC []) + | SatC -> GHtS.add newGraph cset cnstr + | OpenC _ -> GHtS.add newGraph cset (OpenC []) + | UnexpandedC _ -> GHtS.add newGraph cset (UnexpandedC []) in - GHt.iter copyCnstr !graphCnstrs; + GHtS.iter copyCnstr !graphCnstrs; graphCnstrs := newGraph let graphFindState sort bs = @@ -438,7 +449,7 @@ let graphFindCore sort bs = let graphFindCnstr cset = try - Some (GHt.find !graphCnstrs cset) + Some (GHtS.find !graphCnstrs cset) with Not_found -> None let graphInsertState sort bs state = @@ -450,17 +461,17 @@ let graphInsertCore sort bs core = GHt.add !graphCores.(sort) bs core let graphInsertCnstr cset cnstr = - assert (not (GHt.mem !graphCnstrs cset)); - GHt.add !graphCnstrs cset cnstr + assert (not (GHtS.mem !graphCnstrs cset)); + GHtS.add !graphCnstrs cset cnstr let graphReplaceCnstr cset cnstr = - GHt.replace !graphCnstrs cset cnstr + GHtS.replace !graphCnstrs cset cnstr let graphSizeState () = Array.fold_left (fun acc ht -> acc + GHt.length ht) 0 !graphStates let graphSizeCore () = Array.fold_left (fun acc ht -> acc + GHt.length ht) 0 !graphCores -let graphSizeCnstr () = GHt.length !graphCnstrs +let graphSizeCnstr () = GHtS.length !graphCnstrs let graphAddRoot core = if !graphRoot = None then graphRoot := Some core @@ -559,19 +570,25 @@ let coreAddConstraintParent core cset = let setEmptyState () = Array.init (Array.length !sortTable) (fun _ -> GHt.create 128) let setEmptyCore () = Array.init (Array.length !sortTable) (fun _ -> GHt.create 128) -let setEmptyCnstr () = GHt.create 128 -let setAddState set state = GHt.add set.(stateGetSort state) (stateGetBs state) state -let setAddCore set core = GHt.add set.(coreGetSort core) (coreGetBs core) core -let setAddCnstr set cset = GHt.add set cset () -let setMemState set state = GHt.mem set.(stateGetSort state) (stateGetBs state) -let setMemCore set core = GHt.mem set.(coreGetSort core) (coreGetBs core) -let setMemCnstr set cset = GHt.mem set cset -let setRemoveState set state = GHt.remove set.(stateGetSort state) (stateGetBs state) -let setRemoveCore set core = GHt.remove set.(coreGetSort core) (coreGetBs core) -let setRemoveCnstr set cset = GHt.remove set cset +let setEmptyCnstr () = GHtS.create 128 +let setAddState set state = + GHt.add set.(stateGetSort state) ((stateGetBs state), (stateGetDeferral state)) state +let setAddCore set core = + GHt.add set.(coreGetSort core) ((coreGetBs core), (coreGetDeferral core)) core +let setAddCnstr set cset = GHtS.add set cset () +let setMemState set state = + GHt.mem set.(stateGetSort state) ((stateGetBs state), (stateGetDeferral state)) +let setMemCore set core = + GHt.mem set.(coreGetSort core) ((coreGetBs core), (coreGetDeferral core)) +let setMemCnstr set cset = GHtS.mem set cset +let setRemoveState set state = + GHt.remove set.(stateGetSort state) ((stateGetBs state), (stateGetDeferral state)) +let setRemoveCore set core = + GHt.remove set.(coreGetSort core) ((coreGetBs core), (coreGetDeferral core)) +let setRemoveCnstr set cset = GHtS.remove set cset let setIterState fkt set = Array.iter (fun ht -> GHt.iter (fun _ x -> fkt x) ht) set let setIterCore fkt set = Array.iter (fun ht -> GHt.iter (fun _ x -> fkt x) ht) set -let setIterCnstr fkt set = GHt.iter (fun cset () -> fkt cset) set +let setIterCnstr fkt set = GHtS.iter (fun cset () -> fkt cset) set (*****************************************************************************) @@ -613,6 +630,7 @@ let bsetMake () = S.makeBS () let bsetAdd bs lf = S.addBSNoChk bs lf let bsetMem bs lf = S.memBS bs lf let bsetRem bs lf = S.remBS bs lf +let bsetCompare bs1 bs2 = S.compareBS bs1 bs2 let bsetMakeRealEmpty () = let res = bsetMake () in bsetRem res !S.bstrue; (* remove bstrue which is initially in an empty bset *) @@ -723,6 +741,8 @@ let coreToString (core:core): string = "Core "^(string_of_int core.idx)^" {\n"^ " Status: " ^ (nodeStatusToString core.statusC) ^ "\n"^ " " ^ bsetToString core.sortC core.bsC ^ "\n" ^ + " Deferrals: \n" ^ + " " ^ bsetToString core.sortC core.deferralC ^ "\n" ^ " Constraints: { "^(String.concat "\n " constraints)^" }\n"^ " Children: { "^(String.concat @@ -751,6 +771,8 @@ let stateToString (state:state): string = "State "^(string_of_int state.idx)^" {\n"^ " Status: " ^ (nodeStatusToString state.statusS) ^ "\n"^ " " ^ bsetToString state.sortS state.bsS ^ "\n" ^ + " Deferrals: \n" ^ + " " ^ bsetToString state.sortS state.deferralS ^ "\n" ^ " Constraints: { "^(String.concat "\n " constraints)^" }\n"^ " Children: { "^(String.concat diff --git a/src/lib/CoAlgMisc.mli b/src/lib/CoAlgMisc.mli index 160222c47a9a95dff147e113dd8f00f3bb27453c..1dcbf77e7edb92dbe93a85d7e61fbdf4b1518baf 100644 --- a/src/lib/CoAlgMisc.mli +++ b/src/lib/CoAlgMisc.mli @@ -95,7 +95,7 @@ and nodeStatus = and dependencies = bset list -> bset -and rule = (dependencies * (sort * bset) lazylist) +and rule = (dependencies * (sort * bset * bset) lazylist) and 'a lazyliststep = | MultipleElements of 'a list @@ -180,11 +180,11 @@ val graphIterStates : (state -> unit) -> unit val graphIterCores : (core -> unit) -> unit val graphIterCnstrs : (cset -> constrnt -> unit) -> unit val graphClearCnstr : unit -> unit -val graphFindState : sort -> bset -> state option -val graphFindCore : sort -> bset -> core option +val graphFindState : sort -> (bset * bset) -> state option +val graphFindCore : sort -> (bset * bset) -> core option val graphFindCnstr : cset -> constrnt option -val graphInsertState : sort -> bset -> state -> unit -val graphInsertCore : sort -> bset -> core -> unit +val graphInsertState : sort -> (bset * bset) -> state -> unit +val graphInsertCore : sort -> (bset * bset) -> core -> unit val graphInsertCnstr : cset -> constrnt -> unit val graphReplaceCnstr : cset -> constrnt -> unit val graphSizeState : unit -> int @@ -311,6 +311,7 @@ val bsetMake : unit -> bset (* a new bset which only contains True *) val bsetMakeRealEmpty : unit -> bset (* a new bset without containing True *) val bsetAdd : bset -> localFormula -> unit val bsetMem : bset -> localFormula -> bool +val bsetCompare : bset -> bset -> int val bsetFold : (localFormula -> 'a -> 'a) -> bset -> 'a -> 'a val bsetIter : (localFormula -> unit) -> bset -> unit val bsetFilter : bset -> (localFormula -> bool) -> bset diff --git a/src/lib/CoAlgReasoner.ml b/src/lib/CoAlgReasoner.ml index 4a13a6abaae9ae1ceaa1990939bbc8e988a5d994..e208997c1e8e69e5c58088e5c7f0fe73ead47130 100644 --- a/src/lib/CoAlgReasoner.ml +++ b/src/lib/CoAlgReasoner.ml @@ -413,7 +413,7 @@ let getLit sort fht solver f = in lit -let newCore sort bs = +let newCore sort bs defer = (* when creating a now core from a set of formulas bs bs = { x_1, ...., x_n } = "x_1 /\ .... /\ x_n" @@ -499,7 +499,7 @@ let newCore sort bs = *) in bsetIter addClauses bs; - coreMake sort bs bs solver fht + coreMake sort bs defer solver fht let getNextState core = (* Create a new state, which is obtained by a satisfying assignment of the @@ -509,7 +509,13 @@ let getNextState core = minisat calls. *) let bs = coreGetBs core in - let deferralS = coreGetDeferral core in + let refocusing = bsetCompare (bsetMakeRealEmpty ()) (coreGetDeferral core) = 0 in + let deferralS = + if refocusing then + bsetCopy bs + else + coreGetDeferral core + in let fht = coreGetFht core in let litset = bsetFold (fun f acc -> (fhtMustFind fht f)::acc) bs [] in let solver = coreGetSolver core in @@ -524,7 +530,7 @@ let getNextState core = satisfiable. *) let newbs = bsetMake () in - let newdefer = bsetMake () in + let newdefer = bsetMakeRealEmpty () in (* if newbs = { l_1, .... l_n }, i.e. newbs = l_1 /\ ... /\ l_n @@ -571,15 +577,16 @@ let getNextState core = (* ... to newbs *) bsetAdd newbs f; let defercandidate = lfGetDeferral sort f in - (if deferral = defercandidate then + (if (defercandidate != (Hashtbl.hash "ε") && + (refocusing || deferral = defercandidate)) then bsetAdd newdefer f); (* ... and to the new clause *) (M.neg_lit (fhtMustFind fht f))::acc in let init_clause f acc = let deferral = - if bsetMem deferralS f then - lfGetDeferral sort f + if bsetMem deferralS f then ( + lfGetDeferral sort f) else (Hashtbl.hash "ε") in @@ -593,15 +600,15 @@ let getNextState core = let newState sort bs defer = let (func, sl) = !sortTable.(sort) in let producer = CoAlgLogics.getExpandingFunctionProducer func in - let exp = producer sort bs sl in + let exp = producer sort bs defer sl in stateMake sort bs defer exp let insertState parent sort bs defer = let child = - match graphFindState sort bs with + match graphFindState sort (bs, defer) with | None -> let s = newState sort bs defer in - graphInsertState sort bs s; + graphInsertState sort (bs, defer) s; queueInsertState s; s | Some s -> s @@ -620,20 +627,20 @@ let expandCore core = else coreSetStatus core Open -let insertCore sort bs = - match graphFindCore sort bs with +let insertCore sort bs defer = + match graphFindCore sort (bs, defer) with | None -> - let c = newCore sort bs in - graphInsertCore sort bs c; - queueInsertCore c; - c + let c = newCore sort bs defer in + graphInsertCore sort (bs, defer) c; + queueInsertCore c; + c | Some c -> c let insertRule state dep chldrn = let chldrn = listFromLazylist chldrn in - let insert (isUns, acc) (sort, bs) = + let insert (isUns, acc) (sort, bs, defer) = let bs1 = bsetAddTBox sort bs in - let core = insertCore sort bs1 in + let core = insertCore sort bs1 defer in let isUns1 = if coreGetStatus core = Unsat then isUns else false in (isUns1, core::acc) in @@ -681,7 +688,7 @@ let expandCnstr cset = in csetIter cset mkCores; let inCores (sort, _) bs (isUns, acc) = - let core = insertCore sort bs in + let core = insertCore sort bs bs in (* TODO: think of deferral / μ stuff here *) coreAddConstraintParent core cset; (coreGetStatus core = Unsat || isUns, core::acc) in @@ -744,9 +751,15 @@ let initReasoner sorts nomTable tbox sf = let (tbox1, sf1, bs) = ppFormulae nomTable tbox sf in let sort = fst sf in let bs1 = bsetAddTBox sort bs in + let deferrals = bsetMakeRealEmpty() in + let markDeferral f = + if (Hashtbl.hash "ε") != (lfGetDeferral sort f) then ( + bsetAdd deferrals f;) + in + bsetIter markDeferral bs; graphInit (); queueInit (); - let root = insertCore sort bs1 in + let root = insertCore sort bs1 deferrals in graphAddRoot root let isRootSat () =