diff --git a/CoAlgLogics.ml b/CoAlgLogics.ml index 9671694788cc025abae7fac389d94d5d1b193003..fffff305e85695933c7402caa40bdca662cf3d3c 100644 --- a/CoAlgLogics.ml +++ b/CoAlgLogics.ml @@ -11,7 +11,7 @@ module S = MiscSolver (** directly return a list of rules **) let mkRuleList_MultiModalK sort bs sl = assert (List.length sl = 1); - let dep f bsl = (* dependencies for formula f *) + 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 *) let res = bsetMake () in @@ -29,7 +29,7 @@ let mkRuleList_MultiModalK sort bs sl = res in let getRules f acc = - if lfGetType sort f = ExF then (* f = ∃R.C *) + 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 (role : int) = lfGetDest3 sort f in (* role := R *) @@ -153,11 +153,6 @@ let subset (a: bset) (b: bset) : bool = bsetIter f a; !res && (bsetlen a < bsetlen b) -let bsetFilter (a: bset) (f: CoAlgMisc.localFormula -> bool) : bset = - let res = bsetMake () in - bsetIter (fun form -> if (f form) then bsetAdd res form else ()) a; - res - let bsetForall (a: bset) (f: CoAlgMisc.localFormula -> bool) : bool = let res = ref (true) in let helper formula = @@ -202,6 +197,9 @@ let compatible sort (a: bset) formula1 = let mkRule_CL sort bs sl = assert (List.length sl = 1); (* TODO: Why? *) 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 + let disjoints = maxDisjoints sort boxes in (* mkRule_CL sort bs [s1] = { (λ[bs1]. { ∀R.D diff --git a/CoAlgMisc.ml b/CoAlgMisc.ml index a8e5d3083ed141b14b5053a0b9fcd5292d3756b8..31077526442f263cc173c47db136233f54a22e37 100644 --- a/CoAlgMisc.ml +++ b/CoAlgMisc.ml @@ -429,6 +429,11 @@ let bsetRem bs lf = S.remBS bs lf let bsetCopy bs = S.copyBS bs let bsetFold fkt bs init = S.foldBS fkt bs init let bsetIter fkt bset = S.iterBS fkt bset +let bsetFilter (a: bset) (f: localFormula -> bool) : bset = + let res = bsetMake () in + bsetIter (fun form -> if (f form) then bsetAdd res form else ()) a; + res + let bsetAddTBox sort bs = S.unionBSNoChk bs !tboxTable.(sort) let csetCompare cs1 cs2 = S.compareBS cs1 cs2 diff --git a/CoAlgMisc.mli b/CoAlgMisc.mli index 51e86c5dff601ffc516ef4c44a7b3b7fa7aa9dc1..de8f1c5856171a713945353e1ef986f5987d63bd 100644 --- a/CoAlgMisc.mli +++ b/CoAlgMisc.mli @@ -250,6 +250,7 @@ val bsetAdd : bset -> localFormula -> unit val bsetMem : bset -> localFormula -> bool val bsetFold : (localFormula -> 'a -> 'a) -> bset -> 'a -> 'a val bsetIter : (localFormula -> unit) -> bset -> unit +val bsetFilter : bset -> (localFormula -> bool) -> bset val bsetAddTBox : sort -> bset -> bset val bsetCopy : bset -> bset