From ca99d0c6b1dbb0f8b6a28ae4e6b92bc35ef12b62 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thorsten=20Wi=C3=9Fmann?= <edu@thorsten-wissmann.de>
Date: Tue, 6 May 2014 08:30:52 +0200
Subject: [PATCH] Improve OWL -> CoAlg conversion

---
 src/lib/CoAlgFormula.ml  | 25 ++++++++++++++++++-------
 src/lib/CoAlgFormula.mli |  5 +++--
 src/owl/OWL.ml           | 14 +++++++++++---
 3 files changed, 32 insertions(+), 12 deletions(-)

diff --git a/src/lib/CoAlgFormula.ml b/src/lib/CoAlgFormula.ml
index 8bcaef8..196a2d9 100644
--- a/src/lib/CoAlgFormula.ml
+++ b/src/lib/CoAlgFormula.ml
@@ -16,9 +16,6 @@ module Str = String
  *)
 exception CoAlgException of string
 
-exception ConversionException
-
-
 (** Indicates the sort of a sorted formula
  *)
 type sort = int
@@ -47,6 +44,9 @@ type formula =
   | CHCN of formula * formula
   | FUS of bool * formula
 
+exception ConversionException of formula
+
+
 (** Defines sorted coalgebraic formulae.
  *)
 type sortedFormula = sort * formula
@@ -137,24 +137,33 @@ let rec convert_post func formula = (* run over all subformulas in post order *)
 
 let convertToK formula = (* tries to convert a formula to a pure K formula *)
   let helper formula = match formula with
-  | ENFORCES _ | ALLOWS _ -> raise ConversionException
+  | ENFORCES _ | ALLOWS _ -> raise (ConversionException formula)
   | MORETHAN (0,s,a) | MIN (1,s,a) -> EX (s,a)
   | MAX (0,s,a) -> AX (s, NOT a)
   | MAXEXCEPT (0,s,a) -> AX (s, a)
+  | TRUE | FALSE
+  | EQU _ | IMP _
+  | AND _ | OR _
+  | AP _ | NOT _
   | AX _ | EX _
   | CHC _ | CHCN _ | FUS _ -> formula
-  | _ -> raise ConversionException
+  | _ -> raise (ConversionException formula)
   in
   convert_post helper formula
 
 let convertToGML formula = (* tries to convert a formula to a pure GML formula *)
   let helper formula = match formula with
-  | ENFORCES _ | ALLOWS _ -> raise ConversionException
+  | ENFORCES _ | ALLOWS _ -> raise (ConversionException formula)
   | MORETHAN _ | MIN _ | MAX _ | MAXEXCEPT _ -> formula
+  | TRUE | FALSE
+  | EQU _ | IMP _
+  | AND _ | OR _
+  | AP _ | NOT _
+  | AX _ | EX _
   | CHC _ | CHCN _ | FUS _ -> formula
   | AX (r,a) -> MAXEXCEPT (0,r,a)
   | EX (r,a) -> MORETHAN  (0,r,a)
-  | _ -> raise ConversionException
+  | _ -> raise (ConversionException formula)
   in
   convert_post helper formula
 
@@ -295,6 +304,8 @@ let exportFormula f =
   exportFormula_buffer sb f;
   Buffer.contents sb
 
+let string_of_formula = exportFormula
+
 (** export (CL)-formula suitable for tatl-inputs *)
 let rec exportTatlFormula_buffer sb f =
   let negate = function
diff --git a/src/lib/CoAlgFormula.mli b/src/lib/CoAlgFormula.mli
index 87a6c6c..6b5484d 100644
--- a/src/lib/CoAlgFormula.mli
+++ b/src/lib/CoAlgFormula.mli
@@ -6,8 +6,6 @@
 
 exception CoAlgException of string
 
-exception ConversionException
-
 type sort = int
 
 type formula =
@@ -32,6 +30,8 @@ type formula =
   | CHCN of formula * formula
   | FUS of bool * formula
 
+exception ConversionException of formula
+
 type sortedFormula = sort * formula
 
 val iter : (formula -> unit) -> formula -> unit (* iterate over all sub formulas *)
@@ -44,6 +44,7 @@ val isNominal : string -> bool
 val sizeFormula : formula -> int
 val sizeSortedFormula : sortedFormula -> int
 
+val string_of_formula : formula -> string
 val exportFormula : formula -> string
 val exportTatlFormula : formula -> string
 val exportSortedFormula : sortedFormula -> string
diff --git a/src/owl/OWL.ml b/src/owl/OWL.ml
index 9406051..09efc4d 100644
--- a/src/owl/OWL.ml
+++ b/src/owl/OWL.ml
@@ -138,7 +138,13 @@ let coalg_global_assumption_of_owl (ax:axiom): CoAlgFormula.formula =
     | ANNOTATION _ -> CoAlg.TRUE (* ignore annotations *)
     | DECLARATION _ -> CoAlg.TRUE (* ignore declarations *)
     | SUBCLASS (a,b) -> o2c (OR [NOT a; b])
-    | EQUIVALENTCLASSES l -> raise (ConversionError "not implemented yet")
+    | EQUIVALENTCLASSES l ->
+        (* if a_1 ... a_n are equivalent, then at each point it is
+             a_1 ∧ … ∧ a_n (all hold) or ¬a_1 ∧ … ∧ ¬a_n (none holds) *)
+        let conjunction = L.fold_left (fun x y -> CoAlg.AND (x, y)) CoAlg.TRUE in
+        let allhold = conjunction (L.map o2c l) in
+        let nonehold = conjunction (L.map (CoAlg.const_not << o2c) l) in
+        CoAlg.OR (allhold, nonehold)
     | DISJOINTCLASSES l -> raise (ConversionError "not implemented yet")
     | DISJOINTUNION (c,l) -> raise (ConversionError "not implemented yet")
 
@@ -148,8 +154,10 @@ let to_coalg (uri,axioms): R.sortTable * R.nomTable * R.assumptions =
   let (assumptions, fnctor) = (* ofcourse functor leads to "Error: pattern expected".. *)
     try
       (L.map CoAlg.convertToK assumptions, CM.MultiModalK)
-    with CoAlg.ConversionException ->
-      (L.map CoAlg.convertToGML assumptions, CM.GML)
+    with CoAlg.ConversionException _ ->
+      try (L.map CoAlg.convertToGML assumptions, CM.GML)
+      with CoAlg.ConversionException f ->
+        raise (ConversionError (CoAlg.string_of_formula f))
   in
   let sorts = [| (fnctor, [0]) |] in
   let nomTable name =
-- 
GitLab