From 96fb8710c9d045e85bed88d7ad28e7b77c0a1051 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20Bobot?= <francois@bobot.eu>
Date: Wed, 16 Feb 2011 13:56:29 +0100
Subject: [PATCH] encoding enumerate : forbidden with explicit

---
 src/transform/encoding.ml              | 36 +++++---------------------
 src/transform/encoding.mli             |  1 -
 src/transform/encoding_arrays.ml       | 17 ++++++------
 src/transform/encoding_enumeration.ml  |  7 ++---
 src/transform/encoding_enumeration.mli |  3 ---
 src/transform/encoding_explicit.ml     | 17 +++++++++---
 6 files changed, 30 insertions(+), 51 deletions(-)

diff --git a/src/transform/encoding.ml b/src/transform/encoding.ml
index 2393941a4b..aa73cecdb5 100644
--- a/src/transform/encoding.ml
+++ b/src/transform/encoding.ml
@@ -64,30 +64,6 @@ let enco_kept = enco_gen kept_opt
 let enco_poly_smt = enco_gen poly_smt_opt
 let enco_poly_tptp = enco_gen poly_tptp_opt
 
-let forbid_for_explicit =
-  Encoding_enumeration.forbid_enumeration
-    "explicit is unsound in presence of this finite type"
-
-let maybe_forbid_enumeration =
-  Trans.on_meta_excl poly_smt_opt.meta (fun alo ->
-    let s = match alo with
-      | None -> poly_smt_opt.default
-      | Some [MAstr s] -> s
-      | _ -> assert false in
-    if s = "explicit"
-    then forbid_for_explicit
-    else Trans.identity)
-
-let forbid_enumeration =
-  Trans.on_meta_excl poly_smt_opt.meta (fun alo ->
-    let s = match alo with
-      | None -> poly_smt_opt.default
-      | Some [MAstr s] -> s
-      | _ -> assert false in
-    if s = "explicit"
-    then forbid_for_explicit
-    else Encoding_enumeration.encoding_enumeration)
-
 
 open Ty
 open Term
@@ -113,15 +89,15 @@ let monomorphise_goal =
 
 let encoding_smt env =
   compose monomorphise_goal
-    (compose maybe_forbid_enumeration
-       (compose (enco_select env)
-          (compose (enco_kept env) (enco_poly_smt env))))
+    (compose (enco_select env)
+       (compose (enco_kept env) (enco_poly_smt env)))
 
 let encoding_tptp env =
   compose monomorphise_goal
-    (compose forbid_enumeration
-       (compose (enco_select env)
-          (compose (enco_kept env) (enco_poly_tptp env))))
+    (compose (enco_select env)
+       (compose (enco_kept env)
+          (compose (enco_poly_tptp env)
+             Encoding_enumeration.encoding_enumeration)))
 
 let () =
   register_env_transform "encoding_smt" encoding_smt;
diff --git a/src/transform/encoding.mli b/src/transform/encoding.mli
index 9e30ceca9b..dda00e804d 100644
--- a/src/transform/encoding.mli
+++ b/src/transform/encoding.mli
@@ -32,7 +32,6 @@ val register_enco_poly : string -> (env -> task trans) -> unit
 
 
 val monomorphise_goal : Task.task Trans.trans
-val maybe_forbid_enumeration : Task.task Trans.trans
 
 val enco_poly_smt : Env.env -> Task.task Trans.trans
 val print_kept : Task.task Trans.trans
diff --git a/src/transform/encoding_arrays.ml b/src/transform/encoding_arrays.ml
index af62984049..0c9823999f 100644
--- a/src/transform/encoding_arrays.ml
+++ b/src/transform/encoding_arrays.ml
@@ -576,15 +576,14 @@ let encoding_smt_array env =
   Trans.on_used_theory th_array (fun used ->
     if not used then Encoding.encoding_smt env else
       compose Encoding.monomorphise_goal
-        (compose Encoding.maybe_forbid_enumeration
-           (compose (select_subterm_array th_array)
-              (compose Encoding.print_kept
-                 (compose (Encoding_instantiate.t
-                             (create_env_array env th_array))
-                    (compose meta_arrays_to_meta_kept
-                       (compose Encoding.print_kept
-                          (compose (Encoding_bridge.t env)
-                             (Encoding.enco_poly_smt env)))))))))
+        (compose (select_subterm_array th_array)
+           (compose Encoding.print_kept
+              (compose (Encoding_instantiate.t
+                          (create_env_array env th_array))
+                 (compose meta_arrays_to_meta_kept
+                    (compose Encoding.print_kept
+                       (compose (Encoding_bridge.t env)
+                          (Encoding.enco_poly_smt env))))))))
 
 let () = Trans.register_env_transform "encoding_smt_array" encoding_smt_array
 
diff --git a/src/transform/encoding_enumeration.ml b/src/transform/encoding_enumeration.ml
index b5706f142c..690e5f283a 100644
--- a/src/transform/encoding_enumeration.ml
+++ b/src/transform/encoding_enumeration.ml
@@ -45,6 +45,8 @@ let proj tenv t ty = match ty.ty_node with
   | Tyapp (ts,_) when Sts.mem ts tenv.enum ->
       let fs = Hts.find tenv.projs ts in
       t_app fs [t] t.t_ty
+  | _ when ty_s_any (fun ts -> Sts.mem ts tenv.enum) t.t_ty ->
+      Printer.unsupportedType ty "complexe finite type"
   | _ -> t
 
 let proj tenv t = match t.t_node with
@@ -93,10 +95,5 @@ let encoding_enumeration =
     let tenv = { enum = enum ; projs = projs } in
     Trans.decl (decl tenv) None)
 
-let forbid_enumeration s =
-  Trans.on_tagged_ts meta_enum (fun enum ->
-    if Sts.is_empty enum then Trans.identity
-    else Printer.unsupportedTysymbol (Sts.choose enum) s)
-
 let () = Trans.register_transform "encoding_enumeration" encoding_enumeration
 
diff --git a/src/transform/encoding_enumeration.mli b/src/transform/encoding_enumeration.mli
index 40281732ac..bd1ec2ad3c 100644
--- a/src/transform/encoding_enumeration.mli
+++ b/src/transform/encoding_enumeration.mli
@@ -18,6 +18,3 @@
 (**************************************************************************)
 
 val encoding_enumeration : Task.task Trans.trans
-val forbid_enumeration   : string ->Task.task Trans.trans
-(* [forbid_enumeration s] if the task contains encoded enumeration
-   unsupportedTysymbol is raised with the message [s] *)
diff --git a/src/transform/encoding_explicit.ml b/src/transform/encoding_explicit.ml
index 8381a89223..726d5c5bd3 100644
--- a/src/transform/encoding_explicit.ml
+++ b/src/transform/encoding_explicit.ml
@@ -38,9 +38,11 @@ module Debug = struct
   (** utility to print a list of items *)
   let rec print_list printer fmter = function
     | [] -> Format.fprintf fmter ""
-    | e::es -> if es = []
-        then Format.fprintf fmter "@[%a@] %a" printer e (print_list printer) es
-        else Format.fprintf fmter "@[%a@], %a" printer e (print_list printer) es
+    | e::es ->
+      if es = [] then
+        Format.fprintf fmter "@[%a@] %a" printer e (print_list printer) es
+      else
+        Format.fprintf fmter "@[%a@], %a" printer e (print_list printer) es
 
   let debug x = Format.eprintf "%s@." x
 end
@@ -137,6 +139,15 @@ let decl d = match d.d_node with
 
 let explicit = Trans.decl decl (Task.add_decl None d_ts_type)
 
+let meta_enum = Eliminate_algebraic.meta_enum
+
+let explicit =
+  Trans.on_tagged_ts meta_enum (fun enum ->
+    if Sts.is_empty enum then explicit
+    else Printer.unsupportedTysymbol (Sts.choose enum)
+      "explicit is unsound in presence of type")
+
+
 (** {2 monomorphise task } *)
 
 let ts_base = create_tysymbol (id_fresh "uni") [] None
-- 
GitLab