From b7445f7e5ccfe5f05ca2109e7f0e124950523204 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thorsten=20Wi=C3=9Fmann?= <uni@thorsten-wissmann.de>
Date: Tue, 17 Dec 2013 18:00:00 +0100
Subject: [PATCH] Add pseudo rule for MultiModalKD

The rule creator for MultiModalKD does not do anything but calling the
one of MultiModalK.
---
 CoAlgLogics.ml | 51 ++++++++++++++++++++++++++++++++++++++++++++++----
 CoAlgMisc.ml   |  1 +
 2 files changed, 48 insertions(+), 4 deletions(-)

diff --git a/CoAlgLogics.ml b/CoAlgLogics.ml
index fd2e1ef..2126293 100644
--- a/CoAlgLogics.ml
+++ b/CoAlgLogics.ml
@@ -5,8 +5,10 @@
 
 open CoAlgMisc
 
+module S = MiscSolver
 
-let mkRule_MultiModalK sort bs sl =
+(** 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 *)
     assert (List.length bsl = 1); (* -+                 *)
@@ -52,7 +54,10 @@ let mkRule_MultiModalK sort bs sl =
               | "∃R.C" ∈ bs
               }
   *)
-  let rules = bsetFold getRules bs [] in
+  bsetFold getRules bs []
+
+let mkRule_MultiModalK sort bs sl =
+  let rules = mkRuleList_MultiModalK sort bs sl in
   let res = ref (Some rules) in
   fun () ->
     match !res with
@@ -61,8 +66,46 @@ let mkRule_MultiModalK sort bs sl =
         res := None;
         AllInOne rules
 
+(* TODO: test it with:
+     make && ./coalg sat <<< $'<R> False \n [R] False \n [R] True'
+*)
 let mkRule_MultiModalKD sort bs sl =
-  let rules = bsetFold getRules bs [] in
+  assert (List.length sl = 1); (* TODO: Why? *)
+  let roles = S.makeBS () in
+  (* step 1: for each ∀R._ add R *)
+  let addRoleIfBox formula =
+    if lfGetType sort formula = ExF then
+      ignore (S.addBS roles (lfGetDest3 sort formula))
+    else ()
+  in
+  bsetIter (addRoleIfBox) bs;
+  (* step 2: for each ∃R._ remove R again from roles (optimization) *)
+  let rmRoleIfDiamond formula =
+    if lfGetType sort formula = ExF then
+      S.remBS roles (lfGetDest3 sort formula)
+    else ()
+  in
+  bsetIter (rmRoleIfDiamond) bs;
+  (* 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;
+    in
+    acc
+  in
+  (*
+    mkRule_MultiModalKD sort bs [s1]
+        = { (λ[bs1]. { ∀R.D ∈ bs | D ∈ bs1}
+            , [(s1, {D | "∀R.D" ∈ bs)]
+            )
+          | R ∈ signature(bs) (or R ∈ roles)
+          }
+          ∪ mkRule_MultiModalK sort bs [s1]
+  *)
+  let rules = mkRuleList_MultiModalK sort bs sl in
+  (* extend rules from K with enforcing of successors *)
+  let rules = S.foldBS getRules roles rules in
+  (* TODO: replace cannonical wrapper by helper function *)
   let res = ref (Some rules) in
   fun () ->
     match !res with
@@ -146,7 +189,7 @@ let mkRule_Fusion sort bs sl =
    "plug-in" function.
  *)
 let getExpandingFunctionProducer = function
-  | MultiModalK -> mkRule_MultiModalK
   | MultiModalK -> mkRule_MultiModalKD
+  | MultiModalKD -> mkRule_MultiModalKD
   | Choice -> mkRule_Choice
   | Fusion -> mkRule_Fusion
diff --git a/CoAlgMisc.ml b/CoAlgMisc.ml
index d856373..16fef0d 100644
--- a/CoAlgMisc.ml
+++ b/CoAlgMisc.ml
@@ -421,6 +421,7 @@ let tboxTable = ref (Array.make 0 S.dummyBS)
 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 bsetFold fkt bs init = S.foldBS fkt bs init
 let bsetIter fkt bset = S.iterBS fkt bset
 let bsetAddTBox sort bs = S.unionBSNoChk bs !tboxTable.(sort)
-- 
GitLab