From 9bae2c4f239c82151d97092238c111606ae14d41 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thorsten=20Wi=C3=9Fmann?= <edu@thorsten-wissmann.de>
Date: Mon, 21 Jul 2014 13:49:48 +0200
Subject: [PATCH] Implement the REAL box of PML

---
 src/lib/CoAlgFormula.ml      | 47 ++++++++++++++++++------------------
 src/lib/CoAlgFormula.mli     |  6 ++---
 src/lib/CoAlgLogics.ml       | 19 ++++++++++-----
 src/lib/CoAlgMisc.ml         | 14 +++++++----
 src/lib/CoAlgMisc.mli        |  4 +--
 src/lib/GMLMIP-0.1/onestep.c |  2 +-
 6 files changed, 52 insertions(+), 40 deletions(-)

diff --git a/src/lib/CoAlgFormula.ml b/src/lib/CoAlgFormula.ml
index 8210bd6..aba2496 100644
--- a/src/lib/CoAlgFormula.ml
+++ b/src/lib/CoAlgFormula.ml
@@ -49,7 +49,8 @@ type formula =
   | MAXEXCEPT of int * string * formula (* box of GML *)
   | ATLEASTPROB of rational * formula (* = {>= 0.5} C  ---> C occurs with *)
                                       (*  probability of at least 50% *) 
-  | LESSPROB of rational * formula
+  | LESSPROBFAIL of rational * formula (* = [1/2] C = {< 1/2} ¬ C ---> C fails with *)
+                                        (* probability of less than 50% *)
   | CHC of formula * formula
   | CHCN of formula * formula
   | FUS of bool * formula
@@ -91,7 +92,7 @@ let rec sizeFormula f =
   | MIN (_, _, f1)
   | MAX (_, _, f1)
   | ATLEASTPROB (_, f1)
-  | LESSPROB (_, f1)
+  | LESSPROBFAIL (_, f1)
   | MORETHAN (_, _, f1)
   | MAXEXCEPT (_, _, f1) -> succ (sizeFormula f1)
   | CHC (f1, f2)
@@ -116,7 +117,7 @@ let rec iter func formula =
     | EQU (a,b) | IMP (a,b) -> (proc a ; proc b)
     | ENFORCES (_,a) | ALLOWS   (_,a)
     | MIN (_,_,a)    | MAX (_,_,a)
-    | ATLEASTPROB (_, a) | LESSPROB (_, a)
+    | ATLEASTPROB (_, a) | LESSPROBFAIL (_, a)
     | MORETHAN (_,_,a) | MAXEXCEPT (_,_,a) -> proc a
     | CHC (a,b) | CHCN (a,b) -> (proc a ; proc b)
     | FUS (_,a) -> proc a
@@ -142,7 +143,7 @@ let rec convert_post func formula = (* run over all subformulas in post order *)
   | MIN (n,s,a) -> MIN (n,s,c a)
   | MAX (n,s,a) -> MAX (n,s,c a)
   | ATLEASTPROB (p,a) -> ATLEASTPROB (p, c a)
-  | LESSPROB (p,a) -> LESSPROB (p, c a)
+  | LESSPROBFAIL (p,a) -> LESSPROBFAIL (p, c a)
   | MORETHAN (n,s,a) -> MORETHAN (n,s,c a)
   | MAXEXCEPT (n,s,a) -> MAXEXCEPT (n,s,c a)
   | CHC (a,b) -> CHC (c a, c b)
@@ -268,10 +269,10 @@ let rec exportFormula_buffer sb f =
       Buffer.add_string sb (string_of_rational p);
       Buffer.add_string sb "}";
       prio 4 f1
-  | LESSPROB (p, f1) ->
+  | LESSPROBFAIL (p, f1) ->
       Buffer.add_string sb "{<";
       Buffer.add_string sb (string_of_rational p);
-      Buffer.add_string sb "}";
+      Buffer.add_string sb "} ~ ";
       prio 4 f1
   | MIN (n, s, f1) ->
       Buffer.add_string sb "{>=";
@@ -396,7 +397,7 @@ let rec exportTatlFormula_buffer sb f =
   | CHC _
   | CHCN _
   | ATLEASTPROB _
-  | LESSPROB _
+  | LESSPROBFAIL _
   | FUS _ -> raise (CoAlgException ("export to tatl: Not connectives of CL"))
 
 let exportTatlFormula f =
@@ -635,7 +636,7 @@ and parse_rest ts =
       let (n, denom, s) = boxinternals false "}" in
       let f1 = parse_rest ts in
       if (denom <> 0)
-      then LESSPROB (rational_of_int n denom, f1)
+      then LESSPROBFAIL (rational_of_int n denom, NOT f1)
       else A.printError mk_exn ~ts "The \"Less than\" < is not implemented yet"
   | A.Kwd "(" -> begin
       let f = parse_formula ts in
@@ -782,8 +783,8 @@ let rec nnfNeg f =
   | MAX (n, s, f1) -> MORETHAN (n, s, nnf f1)
   | MORETHAN (n, s, f1) -> MAXEXCEPT (n, s, nnfNeg f1)
   | MAXEXCEPT (n, s, f1) -> MORETHAN (n, s, nnfNeg f1)
-  | ATLEASTPROB (p, f1) -> LESSPROB (p, nnf f1)
-  | LESSPROB (p, f1) -> ATLEASTPROB (p, nnf f1)
+  | ATLEASTPROB (p, f1) -> LESSPROBFAIL (p, nnfNeg f1)
+  | LESSPROBFAIL (p, f1) -> ATLEASTPROB (p, nnfNeg f1)
   | CHC (f1, f2) -> CHCN (nnfNeg f1, nnfNeg f2)  
   | CHCN (f1, f2) -> CHC (nnfNeg f1, nnfNeg f2)  
   | FUS (first, f1) -> FUS (first, nnfNeg f1)
@@ -844,9 +845,9 @@ and nnf f =
   | ATLEASTPROB (p, f1) ->
       let ft = nnf f1 in
       if ft == f1 then f else ATLEASTPROB (p, ft)
-  | LESSPROB (p, f1) ->
+  | LESSPROBFAIL (p, f1) ->
       let ft = nnf f1 in
-      if ft == f1 then f else LESSPROB (p, ft)
+      if ft == f1 then f else LESSPROBFAIL (p, ft)
   | CHC (f1, f2) ->
       let ft1 = nnf f1 in
       let ft2 = nnf f2 in
@@ -973,9 +974,9 @@ let rec simplify f =
         | FALSE -> TRUE
         | _ -> if ft == f1 then f else MAX (n, s, ft)
       end
-  | LESSPROB (p,f1) ->
+  | LESSPROBFAIL (p,f1) ->
       let ft1 = simplify f1 in
-      if (ft1 == f1) then f else LESSPROB (p,ft1)
+      if (ft1 == f1) then f else LESSPROBFAIL (p,ft1)
   | ATLEASTPROB (p,f1) ->
       let ft1 = simplify f1 in
       if (ft1 == f1) then f else ATLEASTPROB (p,ft1)
@@ -1444,7 +1445,7 @@ and hcFormula_node =
   | HCMORETHAN of int * string * hcFormula (* GML Diamond *)
   | HCMAXEXCEPT of int * string * hcFormula (* GML Box *)
   | HCATLEASTPROB of rational * hcFormula
-  | HCLESSPROB of rational * hcFormula
+  | HCLESSPROBFAIL of rational * hcFormula
   | HCCHC of hcFormula * hcFormula
   | HCCHCN of hcFormula * hcFormula
   | HCFUS of bool * hcFormula
@@ -1472,7 +1473,7 @@ let equal_hcFormula_node f1 f2 =
       n1 = n2 && compare s1 s2 = 0 && f1 == f2 
   | HCATLEASTPROB (p1, f1), HCATLEASTPROB (p2,f2) ->
       p1 = p2 && f1 == f2
-  | HCLESSPROB (p1, f1), HCLESSPROB (p2,f2) ->
+  | HCLESSPROBFAIL (p1, f1), HCLESSPROBFAIL (p2,f2) ->
       p1 = p2 && f1 == f2
   | HCCHC (f1a, f1b), HCCHC (f2a, f2b) -> f1a == f2a && f1b == f2b
   | HCCHCN (f1a, f1b), HCCHCN (f2a, f2b) -> f1a == f2a && f1b == f2b
@@ -1494,7 +1495,7 @@ let equal_hcFormula_node f1 f2 =
   | HCMORETHAN _, _
   | HCMAXEXCEPT _, _
   | HCATLEASTPROB _, _
-  | HCLESSPROB _, _
+  | HCLESSPROBFAIL _, _
   | HCCHC _, _
   | HCCHCN _, _
   | HCFUS _, _ -> false
@@ -1517,7 +1518,7 @@ let hash_hcFormula_node f =
   | HCMORETHAN (n, s, f1) -> 19 * (19 * (19 * (Hashtbl.hash s) + n) + f1.HC.hkey) + 7
   | HCMAXEXCEPT (n, s, f1) -> 19 * (19 * (19 * (Hashtbl.hash s) + n) + f1.HC.hkey) + 8
   | HCATLEASTPROB (p,f1) -> 19 * (19 * (19 * p.nominator + p.denominator) + f1.HC.hkey) + 9
-  | HCLESSPROB (p,f1) -> 19 * (19 * (19 * p.nominator + p.denominator) + f1.HC.hkey) + 10
+  | HCLESSPROBFAIL (p,f1) -> 19 * (19 * (19 * p.nominator + p.denominator) + f1.HC.hkey) + 10
   | HCCHC (f1, f2) -> 19 * (19 * f1.HC.hkey + f2.HC.hkey) + 11
   | HCCHCN (f1, f2) -> 19 * (19 * f1.HC.hkey + f2.HC.hkey) + 12
   | HCFUS (first, f1) -> 19 * (19 * (Hashtbl.hash first) + f1.HC.hkey) + 13
@@ -1544,7 +1545,7 @@ let toFml_hcFormula_node f =
   | HCMORETHAN (n, s, f1) -> MORETHAN (n, s, f1.HC.fml)
   | HCMAXEXCEPT (n, s, f1) -> MAXEXCEPT (n, s, f1.HC.fml)
   | HCATLEASTPROB (p, f1) -> ATLEASTPROB (p, f1.HC.fml)
-  | HCLESSPROB (p, f1) -> LESSPROB (p, f1.HC.fml)
+  | HCLESSPROBFAIL (p, f1) -> LESSPROBFAIL (p, f1.HC.fml)
   | HCCHC (f1, f2) -> CHC (f1.HC.fml, f2.HC.fml)
   | HCCHCN (f1, f2) -> CHCN (f1.HC.fml, f2.HC.fml)
   | HCFUS (first, f1) -> FUS (first, f1.HC.fml)
@@ -1568,8 +1569,8 @@ let negNde_hcFormula_node f =
   | HCALLOWS (s, f2) -> HCENFORCES (s, f2.HC.neg)
   | HCMORETHAN (n, s, f1) -> HCMAXEXCEPT (n, s, f1.HC.neg)
   | HCMAXEXCEPT (n, s, f1) -> HCMORETHAN (n, s, f1.HC.neg)
-  | HCATLEASTPROB (p, f1) -> HCLESSPROB (p, f1)
-  | HCLESSPROB (p, f1) -> HCATLEASTPROB (p, f1)
+  | HCATLEASTPROB (p, f1) -> HCLESSPROBFAIL (p, f1.HC.neg)
+  | HCLESSPROBFAIL (p, f1) -> HCATLEASTPROB (p, f1.HC.neg)
   | HCCHC (f1, f2) -> HCCHCN (f1.HC.neg, f2.HC.neg)
   | HCCHCN (f1, f2) -> HCCHC (f1.HC.neg, f2.HC.neg)
   | HCFUS (first, f1) -> HCFUS (first, f1.HC.neg)
@@ -1635,8 +1636,8 @@ let rec hc_formula hcF f =
       HcFormula.hashcons hcF (HCMAXEXCEPT (n, s, tf1))
   | ATLEASTPROB (p, f1) ->
       HcFormula.hashcons hcF (HCATLEASTPROB (p, hc_formula hcF f1))
-  | LESSPROB (p, f1) ->
-      HcFormula.hashcons hcF (HCLESSPROB (p, hc_formula hcF f1))
+  | LESSPROBFAIL (p, f1) ->
+      HcFormula.hashcons hcF (HCLESSPROBFAIL (p, hc_formula hcF f1))
   | CHC (f1, f2) ->
       let tf1 = hc_formula hcF f1 in
       let tf2 = hc_formula hcF f2 in
diff --git a/src/lib/CoAlgFormula.mli b/src/lib/CoAlgFormula.mli
index ea8c662..7e59944 100644
--- a/src/lib/CoAlgFormula.mli
+++ b/src/lib/CoAlgFormula.mli
@@ -32,8 +32,8 @@ type formula =
   | MAXEXCEPT of int * string * formula (* box of GML, means: ¬>_nR.¬C *)
   | ATLEASTPROB of rational * formula (* = {>= 1/2} C  ---> C occurs with *)
                                       (*  probability of at least 50% *) 
-  | LESSPROB of rational * formula (* = [1/2] C = {< 1/2} C ---> C occours with *)
-                                   (* probability of less than 50% *)
+  | LESSPROBFAIL of rational * formula (* = [1/2] C = {< 1/2} ¬ C ---> C fails with *)
+                                        (* probability of less than 50% *)
   | CHC of formula * formula
   | CHCN of formula * formula
   | FUS of bool * formula
@@ -134,7 +134,7 @@ and hcFormula_node =
   | HCMORETHAN of int * string * hcFormula (* GML Diamond *)
   | HCMAXEXCEPT of int * string * hcFormula (* GML Box *)
   | HCATLEASTPROB of rational * hcFormula
-  | HCLESSPROB of rational * hcFormula
+  | HCLESSPROBFAIL of rational * hcFormula (* the probability for failing is less than ... *)
   | HCCHC of hcFormula * hcFormula
   | HCCHCN of hcFormula * hcFormula
   | HCFUS of bool * hcFormula
diff --git a/src/lib/CoAlgLogics.ml b/src/lib/CoAlgLogics.ml
index 6fa92ae..20c78b4 100644
--- a/src/lib/CoAlgLogics.ml
+++ b/src/lib/CoAlgLogics.ml
@@ -299,12 +299,14 @@ let mkRule_PML sort bs sl : stateExpander =
   assert (List.length sl = 1);
   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 = LessProbF) in
+  let boxes = bsetFilter bs (fun f -> lfGetType sort f = LessProbFailF) in
   let premise: (bool*int*int*int) list =
     let modality isDiamond m acc =
         let nominator   = lfGetDestNum sort m in
         let denominator = lfGetDestNum2 sort m in
-        (isDiamond,nominator,denominator,lfToInt (lfGetDest1 sort m))::acc
+        let nestedFormula = lfToInt (lfGetDest1 sort m) in
+        (*print_endline ("putting formula "^(string_of_int nestedFormula)); *)
+        (isDiamond,nominator,denominator,nestedFormula)::acc
     in
     List.append
         (bsetFold (modality true) diamonds [])
@@ -316,14 +318,19 @@ let mkRule_PML sort bs sl : stateExpander =
   let handleRuleConcl rc acc =
     let handleConjunction conj =
         let res = bsetMake () in
-        let handleLiteral = (fun (f,positive) ->
-                    let f = lfFromInt f in
+        let handleLiteral = fun (f_int,positive) -> begin
+                    let f = lfFromInt f_int in
                     let f = if positive
                             then f
-                            else match lfGetNeg sort f with
+                            else begin
+                                (*print_endline ("getting "^(string_of_int f_int)); *)
+                                match lfGetNeg sort f with
                                  | Some nf -> nf
                                  | None -> error ("Negation of formula missing")
-                                 in bsetAdd res f)
+                            end
+                            in
+                    bsetAdd res f
+                    end
         in
         List.iter handleLiteral conj;
         (s1,res)
diff --git a/src/lib/CoAlgMisc.ml b/src/lib/CoAlgMisc.ml
index bbc3689..f34b5fb 100644
--- a/src/lib/CoAlgMisc.ml
+++ b/src/lib/CoAlgMisc.ml
@@ -124,7 +124,7 @@ type formulaType =
   | MoreThanF (* more than n successors = diamond in gml *)
   | MaxExceptF(* at most n exceptions = box in gml *)
   | AtLeastProbF (* for PML *)
-  | LessProbF (* for PML *)
+  | LessProbFailF (* box for PML *)
   | ChcF (* Choice *)
   | FusF (* Fusion *)
 
@@ -674,11 +674,15 @@ let rec detClosure nomTbl hcF fset atset nomset s f =
         else ();
         detClosure nomTbl hcF fset atset nomset (List.hd sortlst) f1
     | C.HCATLEASTPROB (_,f1)
-    | C.HCLESSPROB (_,f1) ->
+    | C.HCLESSPROBFAIL (_,f1) ->
         if func <> PML || List.length sortlst <> 1
         then raise (C.CoAlgException "[{>=,<}]-formula with probability is used in wrong sort.")
         else ();
-        detClosure nomTbl hcF fset atset nomset (List.hd sortlst) f1
+        detClosure nomTbl hcF fset atset nomset (List.hd sortlst) f1;
+        (*
+            TODO: add ¬ f1 to the closure!
+        detClosure nomTbl hcF fset atset nomset (List.hd sortlst) (f1.HC.node.negNde)
+        *)
     | C.HCCHC (f1, f2)
     | C.HCCHCN (f1, f2) ->
         if func <> Choice || List.length sortlst <> 2 then
@@ -788,8 +792,8 @@ let initTables nomTbl hcF htF htR s f n =
       !arrayDest1.(s).(n) <- C.HcFHt.find htF.(List.hd sortlst) f1;
       !arrayDestNum.(s).(n) <- p.C.nominator;
       !arrayDestNum2.(s).(n) <- p.C.denominator
-  | C.HCLESSPROB (p,f1) ->
-      !arrayType.(s).(n) <- LessProbF;
+  | C.HCLESSPROBFAIL (p,f1) ->
+      !arrayType.(s).(n) <- LessProbFailF;
       !arrayDest1.(s).(n) <- C.HcFHt.find htF.(List.hd sortlst) f1;
       !arrayDestNum.(s).(n) <- p.C.nominator;
       !arrayDestNum2.(s).(n) <- p.C.denominator
diff --git a/src/lib/CoAlgMisc.mli b/src/lib/CoAlgMisc.mli
index f42a548..33c5577 100644
--- a/src/lib/CoAlgMisc.mli
+++ b/src/lib/CoAlgMisc.mli
@@ -36,8 +36,8 @@ type formulaType =
   | AllowsF
   | MoreThanF
   | MaxExceptF
-  | AtLeastProbF (* for PML *)
-  | LessProbF (* for PML *)
+  | AtLeastProbF (* diamond for PML *)
+  | LessProbFailF (* box for PML *)
   | ChcF
   | FusF
 
diff --git a/src/lib/GMLMIP-0.1/onestep.c b/src/lib/GMLMIP-0.1/onestep.c
index 4d02a2e..ddc0e8b 100644
--- a/src/lib/GMLMIP-0.1/onestep.c
+++ b/src/lib/GMLMIP-0.1/onestep.c
@@ -87,7 +87,7 @@ static bdd tupleModality2Bdd_PML(IFormula* f, const pair<pair<bool,pair<int,int>
         return f->modal(b, t.first.second.first, t.first.second.second);
     } else {
         /* box */
-        bdd* b = new bdd(f->variable(t.second));
+        bdd* b = new bdd(bdd_not(f->variable(t.second)));
         return bdd_not(f->modal(b, t.first.second.first, t.first.second.second));
     }
 }
-- 
GitLab