From 2a84977e76cdced261fac446be7cc4041dd07557 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorsten=20Wi=C3=9Fmann?= <uni@thorsten-wissmann.de> Date: Tue, 17 Dec 2013 22:57:31 +0100 Subject: [PATCH] Implement complete KD rule --- CoAlgLogics.ml | 28 ++++++++++++++++++++++++---- CoAlgMisc.ml | 5 +++-- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/CoAlgLogics.ml b/CoAlgLogics.ml index 2126293..81059d4 100644 --- a/CoAlgLogics.ml +++ b/CoAlgLogics.ml @@ -71,10 +71,11 @@ let mkRule_MultiModalK sort bs sl = *) let mkRule_MultiModalKD sort bs sl = assert (List.length sl = 1); (* TODO: Why? *) + let s1 = List.hd sl in (* [s1] = List.hd sl *) let roles = S.makeBS () in (* step 1: for each ∀R._ add R *) let addRoleIfBox formula = - if lfGetType sort formula = ExF then + if lfGetType sort formula = AxF then ignore (S.addBS roles (lfGetDest3 sort formula)) else () in @@ -89,9 +90,28 @@ let mkRule_MultiModalKD sort bs sl = (* step 3: for each R in roles enforce one successor *) let getRules r acc = (* add the rule for a concrete R *) let dep r bsl = - bsetIter (rmRoleIfDiamond) bs; + assert (List.length bsl = 1); (* -+ *) + let bs1 = List.hd bsl in (* -+-> [bs1] := bsl *) + let res = bsetMake () in (* res := { ∀R.D ∈ bs | D ∈ bs1} *) + let f formula = + if lfGetType sort formula = AxF + && lfGetDest3 sort formula = r + && bsetMem bs1 (lfGetDest1 sort formula) + then ignore (bsetAdd res formula) + else () + in + bsetIter f bs; (* fill res *) + res + in + let succs = bsetMake () in (* succs := {D | ∀r.D ∈ bs *) + let f formula = + if lfGetType sort formula = AxF + && lfGetDest3 sort formula = r + then ignore (bsetAdd succs (lfGetDest1 sort formula)) + else () in - acc + bsetIter f bs; + (dep r, [(s1, succs)])::acc in (* mkRule_MultiModalKD sort bs [s1] @@ -189,7 +209,7 @@ let mkRule_Fusion sort bs sl = "plug-in" function. *) let getExpandingFunctionProducer = function - | MultiModalK -> mkRule_MultiModalKD + | MultiModalK -> mkRule_MultiModalK | MultiModalKD -> mkRule_MultiModalKD | Choice -> mkRule_Choice | Fusion -> mkRule_Fusion diff --git a/CoAlgMisc.ml b/CoAlgMisc.ml index 16fef0d..c439c12 100644 --- a/CoAlgMisc.ml +++ b/CoAlgMisc.ml @@ -532,8 +532,9 @@ let rec detClosure nomTbl hcF fset atset nomset s f = detClosure nomTbl hcF fset atset nomset s f2 | C.HCEX (_, f1) | C.HCAX (_, f1) -> - if func <> MultiModalK || List.length sortlst <> 1 then - raise (C.CoAlgException "Ex/Ax-formula is used in wrong sort.") + if (func <> MultiModalK && func <> MultiModalKD) + || List.length sortlst <> 1 + then raise (C.CoAlgException "Ex/Ax-formula is used in wrong sort.") else (); detClosure nomTbl hcF fset atset nomset (List.hd sortlst) f1 | C.HCMIN _ -- GitLab