From 5e185dd3008b1b7ccf6de315a1f74fc8fe8912ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorsten=20Wi=C3=9Fmann?= <uni@thorsten-wissmann.de> Date: Thu, 16 Jan 2014 17:49:50 +0100 Subject: [PATCH] More own helper functions --- CoAlgLogicUtils.ml | 18 ++++++++++++------ CoAlgLogicUtils.mli | 7 ++++++- CoAlgLogics.ml | 17 +++++++++++------ CoAlgLogics.mli | 1 + 4 files changed, 30 insertions(+), 13 deletions(-) diff --git a/CoAlgLogicUtils.ml b/CoAlgLogicUtils.ml index c264178..bea0a51 100644 --- a/CoAlgLogicUtils.ml +++ b/CoAlgLogicUtils.ml @@ -4,11 +4,17 @@ open Graph open CoAlgMisc -let elemArray (x: 'a) (arr: 'a array) = - let res = ref (false) in - let f y = if (x == y) then res := true else () in - Array.iter f arr; - !res +module TArray = struct + let any f arr = + let rec g idx = + if idx >= Array.length arr then false + else if f arr.(idx) then true + else g (idx + 1) + in g 0 + let all f = any (fun x -> not (f x)) + let elem (x: 'a) (arr: 'a array) = + any (fun y -> x == y) arr +end let disjointAgents sort a b = assert (lfGetType sort a = EnforcesF || lfGetType sort a = AllowsF); @@ -17,7 +23,7 @@ let disjointAgents sort a b = let lb = lfGetDestAg sort b in let res = ref (true) in let f idx = - if (elemArray idx lb) then res := false + if (TArray.elem idx lb) then res := false else () in Array.iter f la; diff --git a/CoAlgLogicUtils.mli b/CoAlgLogicUtils.mli index 747b5ef..24982ae 100644 --- a/CoAlgLogicUtils.mli +++ b/CoAlgLogicUtils.mli @@ -6,10 +6,15 @@ open CoAlgMisc +module TArray : sig + val all : ('a -> bool) -> 'a array -> bool + val any : ('a -> bool) -> 'a array -> bool + val elem : 'a -> 'a array -> bool +end + val disjointAgents : sort -> localFormula -> localFormula -> bool val maxDisjoints : sort -> bset -> bset list - diff --git a/CoAlgLogics.ml b/CoAlgLogics.ml index fffff30..1c12404 100644 --- a/CoAlgLogics.ml +++ b/CoAlgLogics.ml @@ -193,6 +193,7 @@ let compatible sort (a: bset) formula1 = /\ n /\ m all C_i ⊆ D / \i=1 a_i /\ b / \j=1 c_j *) +let agents = [|1;2;3;4;5;6;7;8;9;10|] let mkRule_CL sort bs sl = assert (List.length sl = 1); (* TODO: Why? *) @@ -200,14 +201,18 @@ let mkRule_CL sort bs 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 + let nCands = bsetMake () in (* all N-diamonds *) + let hasFullAgentList formula = + let aglist = lfGetDestAg sort formula in + let value = TArray.all (fun x -> TArray.elem x aglist) agents in + if (value) then bsetAdd nCands formula else () ; + value + in + (* Candidates for D in Rule 2 *) + let dCands = bsetFilter diamonds (fun f -> not (hasFullAgentList f)) in (* mkRule_CL sort bs [s1] - = { (λ[bs1]. { ∀R.D - | <D> b ∈ bs - } - ∪ { (λ[bs1].{ [C_i]a_i ∈ bs | a_i ∈ bs1} - , [(s1, { a_i | i∈I })] - ) + = { (λ[bs1]. bs, [(s1, { a_i | i∈I })]) | {[C_i]a_i | i∈I} ⊆ bs, C_i pairwise disjoint and I maximal } diff --git a/CoAlgLogics.mli b/CoAlgLogics.mli index 48d0958..7416575 100644 --- a/CoAlgLogics.mli +++ b/CoAlgLogics.mli @@ -6,4 +6,5 @@ open CoAlgMisc +val agents : int array val getExpandingFunctionProducer : functors -> sort -> bset -> sort list -> stateExpander -- GitLab