diff --git a/src/interpretation.ml b/src/interpretation.ml
index fbd18c2daa78dbd365c5f735659d533554d12c18..a4d03376eb0c3126acbdce2c6d3535e03853fd70 100644
--- a/src/interpretation.ml
+++ b/src/interpretation.ml
@@ -24,31 +24,18 @@ module CRE = Reduction_engine (* Caisar Reduction Engine *)
 open Why3
 open Base
 
-type dataset = CSV of Csv.t [@printer fun fmt _ -> Fmt.pf fmt "<csv>"]
+type dataset = DS_csv of Csv.t [@printer fun fmt _ -> Fmt.pf fmt "<csv>"]
 [@@deriving show]
 
 type classifier = string [@@deriving show]
+type data = D_csv of string list [@@deriving show]
 
 type caisar_op =
-  | Dataset of dataset
-  | Data of string list
   | Classifier of classifier
-  | ClassifierApp of Term.term * Term.term
-      [@printer
-        fun fmt (t1, t2) ->
-          Fmt.pf fmt "%a@@%a" Pretty.print_term t1 Pretty.print_term t2]
-  | VGet of Term.term * Term.term
-      [@printer
-        fun fmt (t1, t2) ->
-          Fmt.pf fmt "%a[%a]" Pretty.print_term t1 Pretty.print_term t2]
-  | EqualShape of Term.term * Term.term
-      [@printer
-        fun fmt (t1, t2) ->
-          Fmt.pf fmt "EqShape %a %a" Pretty.print_term t1 Pretty.print_term t2]
-  | ValidIndex of Term.term * Term.term
-      [@printer
-        fun fmt (t1, t2) ->
-          Fmt.pf fmt "ValidIdx %a %a" Pretty.print_term t1 Pretty.print_term t2]
+  | Dataset of dataset
+  | Data of data
+  | Index of int
+  | Tensor of int
 [@@deriving show]
 
 type caisar_env = {
@@ -104,7 +91,7 @@ let builtin_caisar : caisar_env CRE.built_in_theories list =
     ] -> (
       Fmt.pr "Terms: %a , %a@." Pretty.print_term t1 Pretty.print_term t2;
       match caisar_op_of_ls engine lsapp with
-      | Dataset (CSV csv) ->
+      | Dataset (DS_csv csv) ->
         let row = List.nth_exn csv (Number.to_small_integer i) in
         let label, features =
           match row with
@@ -117,23 +104,16 @@ let builtin_caisar : caisar_env CRE.built_in_theories list =
           | _ -> assert false
         in
         let t_features, t_label =
-          ( term_of_caisar_op engine (Data features) ty_features,
+          ( term_of_caisar_op engine (Data (D_csv features)) ty_features,
             Term.t_int_const (BigInt.of_int (Int.of_string label)) )
         in
         Term (Term.t_tuple [ t_features; t_label ])
-      | ClassifierApp (_, _) -> Term (Term.t_app_infer ls [ t1; t2 ])
-      | Data _ | Classifier _ | VGet (_, _) | EqualShape _ | ValidIndex _ ->
-        assert false)
+      | Data _ | Classifier _ | Var _ | Index _ -> assert false)
     | [
-     Term ({ t_node = Tapp (lsapp, _); _ } as t1);
-     Term ({ t_node = Tvar _; _ } as t2);
-    ] -> (
+     Term ({ t_node = Tapp _; _ } as t1); Term ({ t_node = Tvar _; _ } as t2);
+    ] ->
       Fmt.pr "Terms: %a , %a@." Pretty.print_term t1 Pretty.print_term t2;
-      match caisar_op_of_ls engine lsapp with
-      | Dataset _ -> assert false
-      | ClassifierApp (_, _) -> Term (Term.t_app_infer ls [ t1; t2 ])
-      | Data _ | Classifier _ | VGet (_, _) | EqualShape _ | ValidIndex _ ->
-        assert false)
+      Term (Term.t_app_infer ls [ t1; t2 ])
     | _ -> invalid_arg (error_message ls)
   in
   let length : _ CRE.builtin =
@@ -144,47 +124,8 @@ let builtin_caisar : caisar_env CRE.built_in_theories list =
     match vl with
     | [ Term { t_node = Tapp (ls, []); _ } ] -> (
       match caisar_op_of_ls engine ls with
-      | Dataset (CSV csv) -> Int (BigInt.of_int (Csv.lines csv))
-      | Data _ | Classifier _ | ClassifierApp _ | VGet _ | EqualShape _
-      | ValidIndex _ ->
-        assert false)
-    | [ Term t1; Term ({ t_node = Tvar _; _ } as t2) ] ->
-      Fmt.pr "Terms: %a , %a@." Pretty.print_term t1 Pretty.print_term t2;
-      Term (term_of_caisar_op engine (VGet (t1, t2)) ty)
-    | _ -> invalid_arg (error_message ls)
-  in
-
-  (* Tensor *)
-  let _valid_index : _ CRE.builtin =
-   fun engine ls vl ty ->
-    Fmt.pr "--@.valid_index: ls:%a , ty:%a@." Pretty.print_ls ls
-      Fmt.(option ~none:nop Pretty.print_ty)
-      ty;
-    match vl with
-    | [
-        Term ({ t_node = Tvar _; _ } as t1); Term ({ t_node = Tvar _; _ } as t2);
-      ]
-    | [ Term t1; Term ({ t_node = Tvar _; _ } as t2) ] ->
-      Fmt.pr "Terms: %a , %a@." Pretty.print_term t1 Pretty.print_term t2;
-      Term (term_of_caisar_op engine (ValidIndex (t1, t2)) ty)
-      (* Term Term.t_true *)
-    | _ -> invalid_arg (error_message ls)
-  in
-  let _equal_shape : _ CRE.builtin =
-   fun engine ls vl ty ->
-    Fmt.pr "--@.equal_shape: ls:%a , ty:%a@." Pretty.print_ls ls
-      Fmt.(option ~none:nop Pretty.print_ty)
-      ty;
-    match vl with
-    | [
-     Term ({ t_node = Tvar _; _ } as t1); Term ({ t_node = Tvar _; _ } as t2);
-    ] ->
-      Fmt.pr "Terms: %a , %a@." Pretty.print_term t1 Pretty.print_term t2;
-      Term (Term.t_app_infer ls [ t1; t2 ])
-    | [ Term t1; Term t2 ] ->
-      Fmt.pr "Terms: %a , %a@." Pretty.print_term t1 Pretty.print_term t2;
-      Term (term_of_caisar_op engine (EqualShape (t1, t2)) ty)
-      (* Term Term.t_true *)
+      | Dataset (DS_csv csv) -> Int (BigInt.of_int (Csv.lines csv))
+      | Data _ | Classifier _ | Var _ | Index _ -> assert false)
     | _ -> invalid_arg (error_message ls)
   in
 
@@ -208,7 +149,7 @@ let builtin_caisar : caisar_env CRE.built_in_theories list =
     | _ -> invalid_arg (error_message ls)
   in
   let apply_classifier : _ CRE.builtin =
-   fun engine ls vl ty ->
+   fun _engine ls vl ty ->
     Fmt.pr "--@.apply_classifier: ls:%a , ty:%a@." Pretty.print_ls ls
       Fmt.(option ~none:nop Pretty.print_ty)
       ty;
@@ -219,9 +160,6 @@ let builtin_caisar : caisar_env CRE.built_in_theories list =
     | [ Term ({ t_node = Tapp (_lsapp, _); _ } as t1); Term t2 ] ->
       Fmt.pr "Terms: %a , %a@." Pretty.print_term t1 Pretty.print_term t2;
       Term (Term.t_app_infer ls [ t1; t2 ])
-    | [ Term t1; Term t2 ] ->
-      Fmt.pr "Terms: %a , %a@." Pretty.print_term t1 Pretty.print_term t2;
-      Term (term_of_caisar_op engine (ClassifierApp (t1, t2)) ty)
     | _ -> invalid_arg (error_message ls)
   in
 
@@ -239,7 +177,7 @@ let builtin_caisar : caisar_env CRE.built_in_theories list =
       let { cwd; _ } = CRE.user_env engine in
       let caisar_op =
         let filename = Caml.Filename.concat cwd dataset in
-        let dataset = CSV (Csv.load filename) in
+        let dataset = DS_csv (Csv.load filename) in
         Dataset dataset
       in
       Term (term_of_caisar_op engine caisar_op ty)
@@ -250,11 +188,6 @@ let builtin_caisar : caisar_env CRE.built_in_theories list =
       "Vector",
       [],
       [ (Ident.op_get "" (* ([]) *), None, vget); ("length", None, length) ] );
-    ( [ "interpretation" ],
-      "Tensor",
-      [],
-      [ (* ("valid_index", None, valid_index); *)
-        (* ("equal_shape", None, equal_shape); *) ] );
     ( [ "interpretation" ],
       "Classifier",
       [],
@@ -268,6 +201,72 @@ let builtin_caisar : caisar_env CRE.built_in_theories list =
       [ ("read_dataset", None, read_dataset) ] );
   ]
 
+let bounded_quant engine vs ~cond : CRE.bounded_quant_result option =
+  match cond.Term.t_node with
+  | Tapp
+      ( { ls_name = { id_string = "equal_shape"; _ }; _ },
+        [
+          ({ t_node = Tapp (ls, _); _ } as t1); ({ t_node = Tvar vs2; _ } as t2);
+        ] ) ->
+    Fmt.pr "--@.equal_shape: %a %a@." Pretty.print_term t1 Pretty.print_term t2;
+    if not (Term.vs_equal vs vs2)
+    then None
+    else
+      let new_quant =
+        let n =
+          match caisar_op_of_ls engine ls with
+          | Data (D_csv d) -> List.length d
+          | _ -> assert false
+        in
+        let ty =
+          match vs.vs_ty with
+          | { ty_node = Tyapp (_, ty :: _); _ } -> ty
+          | _ -> assert false
+        in
+        (* Fmt.pr "TY: %a@." Pretty.print_ty ty; *)
+        List.init n ~f:(fun i ->
+          let preid = Ident.id_fresh (Fmt.str "caisar_es%i" i) in
+          Term.create_vsymbol preid ty)
+      in
+      let substitutions =
+        [ term_of_caisar_op engine (Tensor new_quant) (Some vs.vs_ty) ]
+      in
+      Some { new_quant; substitutions }
+  | Tapp
+      ( { ls_name = { id_string = "valid_index"; _ }; _ },
+        [
+          ({ t_node = Tapp (ls, _); _ } as t1); ({ t_node = Tvar vs2; _ } as t2);
+        ] ) ->
+    Fmt.pr "--@.valid_index: %a %a@." Pretty.print_term t1 Pretty.print_term t2;
+    if not (Term.vs_equal vs vs2)
+    then None
+    else
+      let n =
+        match caisar_op_of_ls engine ls with
+        | Var d -> List.length d
+        | _ -> assert false
+        | exception _ -> 5
+      in
+      let new_quant =
+        []
+        (* let ty = *)
+        (*   match vs.vs_ty with *)
+        (*   | { ty_node = Tyapp (_, ty :: _); _ } -> ty *)
+        (*   | _ -> assert false *)
+        (* in *)
+        (* (\* Fmt.pr "TY: %a@." Pretty.print_ty ty; *\) *)
+        (* List.init n ~f:(fun i -> *)
+        (*   let preid = Ident.id_fresh (Fmt.str "caisar_vi%i" i) in *)
+        (*   Term.create_vsymbol preid ty) *)
+      in
+      (* let substitutions = List.map new_quant ~f:Term.t_var in *)
+      let substitutions =
+        List.init n ~f:(fun i ->
+          term_of_caisar_op engine (Index i) (Some vs.vs_ty))
+      in
+      Some { new_quant; substitutions }
+  | _ -> None
+
 let interpret_task ~cwd env task =
   let known_map = Task.task_known task in
   let caisar_env = caisar_env env cwd in
@@ -279,10 +278,12 @@ let interpret_task ~cwd env task =
       compute_max_quantifier_domain = Int.max_value;
     }
   in
-  let engine = CRE.create params env known_map caisar_env builtin_caisar in
+  let engine =
+    CRE.create ~bounded_quant params env known_map caisar_env builtin_caisar
+  in
   let f = Task.task_goal_fmla task in
   Fmt.pr "TERM: %a@." Pretty.print_term f;
-  let f = CRE.normalize ~limit:1000 engine Term.Mvs.empty f in
+  let f = CRE.normalize ~limit:Int.max_value engine Term.Mvs.empty f in
   Fmt.pr "%a : %a@.%a@." Pretty.print_pr (Task.task_goal task) Pretty.print_term
     f print_caisar_op caisar_env
 
diff --git a/src/reduction_engine.mli b/src/reduction_engine.mli
index 695db72ba9833cdae09498d6dd82ea212c3d0fec..bcb1c4863f6441089c3fb45ad0744a5fc6c82ca5 100644
--- a/src/reduction_engine.mli
+++ b/src/reduction_engine.mli
@@ -99,14 +99,14 @@ type 'a built_in_theories =
   * (string * (Ty.tysymbol -> unit)) list
   * (string * Why3.Term.lsymbol ref option * 'a builtin) list
 
-  type bounded_quant_result = {
-    new_quant: Term.vsymbol list;
-    substitutions : Term.term list;
-  }
-
-type 'a bounded_quant = 'a engine -> Term.vsymbol -> cond:Term.term ->
-    bounded_quant_result option
-  
+type bounded_quant_result = {
+  new_quant : Term.vsymbol list;
+  substitutions : Term.term list;
+}
+
+type 'a bounded_quant =
+  'a engine -> Term.vsymbol -> cond:Term.term -> bounded_quant_result option
+
 val create :
   ?bounded_quant:'a bounded_quant ->
   params ->
diff --git a/tests/interpretation_dataset.t b/tests/interpretation_dataset.t
index ca4ded6ccec1b837b797fbc59c755396032c4ae3..4bcaabea3065c710e7b79908a8674b97149bfdb0 100644
--- a/tests/interpretation_dataset.t
+++ b/tests/interpretation_dataset.t
@@ -31,8 +31,8 @@ Test interpret on dataset
   > 
   >   predicate robust_around (c: classifier) (eps: t) (i: image) (l: label_) =
   >     forall perturbed_image: image.
-  >       valid_image perturbed_image ->
   >       equal_shape i perturbed_image ->
+  >       valid_image perturbed_image ->
   >       let p = perturbed_image - i in
   >       bounded_by_epsilon p eps ->
   >       advises c perturbed_image l
@@ -47,57 +47,471 @@ Test interpret on dataset
   >     robust classifier dataset eps
   > end
   > EOF
-  G : match caisar_op[0] with
-      | a, b ->
-          ((fun (y2:tensor t) (y3:int) ->
-             forall perturbed_image:tensor t.
-              (forall v:vector int.
-                valid_index perturbed_image v ->
-                le (0.0:t) (perturbed_image # v) /\
-                le (perturbed_image # v) (1.0:t)) ->
-              equal_shape y2 perturbed_image ->
-              (forall v:vector int.
-                valid_index (perturbed_image - y2) v ->
-                le (neg (0.375:t)) ((perturbed_image - y2) # v) /\
-                le ((perturbed_image - y2) # v) (0.375:t)) ->
-              (0 < y3 \/ 0 = y3) /\ (y3 < 1 \/ y3 = 1) ->
-              (forall j:int.
-                ((0 < j \/ 0 = j) /\ (j < 1 \/ j = 1)) /\ not j = y3 ->
-                lt
-                (read_classifier ("TestNetwork.nnet":string) NNet
-                 @@ perturbed_image)
-                [j]
-                (read_classifier ("TestNetwork.nnet":string) NNet
-                 @@ perturbed_image)
-                [y3]))
-           @ a)
-          @ b
-      end = True /\
-      match caisar_op[1] with
-      | a, b ->
-          ((fun (y2:tensor t) (y3:int) ->
-             forall perturbed_image:tensor t.
-              (forall v:vector int.
-                valid_index perturbed_image v ->
-                le (0.0:t) (perturbed_image # v) /\
-                le (perturbed_image # v) (1.0:t)) ->
-              equal_shape y2 perturbed_image ->
-              (forall v:vector int.
-                valid_index (perturbed_image - y2) v ->
-                le (neg (0.375:t)) ((perturbed_image - y2) # v) /\
-                le ((perturbed_image - y2) # v) (0.375:t)) ->
-              (0 < y3 \/ 0 = y3) /\ (y3 < 1 \/ y3 = 1) ->
-              (forall j:int.
-                ((0 < j \/ 0 = j) /\ (j < 1 \/ j = 1)) /\ not j = y3 ->
-                lt
-                (read_classifier ("TestNetwork.nnet":string) NNet
-                 @@ perturbed_image)
-                [j]
-                (read_classifier ("TestNetwork.nnet":string) NNet
-                 @@ perturbed_image)
-                [y3]))
-           @ a)
-          @ b
-      end = True
+  TERM: let classifier = read_classifier ("TestNetwork.nnet":string) NNet in
+        let dataset =
+          (read_dataset ("dataset.csv":string) CSV: vector (tensor t, int))
+        in let eps = (0.375:t) in robust classifier dataset eps
+  --
+  read_classifier: ls:read_classifier , ty:classifier
+  ls_of_caisar_op: (Interpretation.Classifier
+                      "$TESTCASE_ROOT/TestNetwork.nnet")
+  ty: classifier
+  ls: caisar_op
+  --
+  read_dataset: ls:read_dataset , ty:vector (tensor t,
+  int)
+  ls_of_caisar_op: (Interpretation.Dataset <csv>)
+  ty: vector (tensor t,
+  int)
+  ls: caisar_op1
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: y0 , perturbed_image
+  --
+  vget: ls:([]) , ty:t
+  Terms: y0 @@ perturbed_image , y3
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: y0 , perturbed_image
+  --
+  vget: ls:([]) , ty:t
+  Terms: y0 @@ perturbed_image , 0
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: y0 , perturbed_image
+  --
+  vget: ls:([]) , ty:t
+  Terms: y0 @@ perturbed_image , y3
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: y0 , perturbed_image
+  --
+  vget: ls:([]) , ty:t
+  Terms: y0 @@ perturbed_image , 1
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: y0 , perturbed_image
+  --
+  vget: ls:([]) , ty:t
+  Terms: y0 @@ perturbed_image , y3
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: y0 , perturbed_image
+  --
+  vget: ls:([]) , ty:t
+  Terms: y0 @@ perturbed_image , 2
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , perturbed_image1
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ perturbed_image1 , 0
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , perturbed_image1
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ perturbed_image1 , y31
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , perturbed_image1
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ perturbed_image1 , 1
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , perturbed_image1
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ perturbed_image1 , y31
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , perturbed_image1
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ perturbed_image1 , 2
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , perturbed_image1
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ perturbed_image1 , y31
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , perturbed_image2
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ perturbed_image2 , 0
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , perturbed_image2
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ perturbed_image2 , y32
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , perturbed_image2
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ perturbed_image2 , 1
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , perturbed_image2
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ perturbed_image2 , y32
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , perturbed_image2
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ perturbed_image2 , 2
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , perturbed_image2
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ perturbed_image2 , y32
+  reduce_match@e
+  --
+  length: ls:length , ty:int
+  --
+  vget: ls:([]) , ty:(tensor t,
+  int)
+  Terms: caisar_op1 , 0
+  ls_of_caisar_op: (Interpretation.Data
+                      (Interpretation.D_csv
+                         ["0.0"; "1.0"; "0.784313725"; "0.019607843";
+                           "0.776470588"]))
+  ty: tensor
+  t
+  ls: caisar_op2
+  reduce_match@(caisar_op2,
+  1)
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , perturbed_image3
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ perturbed_image3 , 0
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , perturbed_image3
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ perturbed_image3 , y33
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , perturbed_image3
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ perturbed_image3 , 1
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , perturbed_image3
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ perturbed_image3 , y33
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , perturbed_image3
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ perturbed_image3 , 2
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , perturbed_image3
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ perturbed_image3 , y33
+  --
+  equal_shape: caisar_op2 perturbed_image4
+  ls_of_caisar_op: <var>
+  ty: tensor
+  t
+  ls: caisar_op3
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , caisar_op3
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ caisar_op3 , 0
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , caisar_op3
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ caisar_op3 , y34
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , caisar_op3
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ caisar_op3 , 1
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , caisar_op3
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ caisar_op3 , y34
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , caisar_op3
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ caisar_op3 , 2
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , caisar_op3
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ caisar_op3 , y34
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , caisar_op3
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ caisar_op3 , 0
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , caisar_op3
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ caisar_op3 , 1
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , caisar_op3
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ caisar_op3 , 1
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , caisar_op3
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ caisar_op3 , 1
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , caisar_op3
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ caisar_op3 , 2
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , caisar_op3
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ caisar_op3 , 1
+  --
+  vget: ls:([]) , ty:(tensor t,
+  int)
+  Terms: caisar_op1 , 1
+  ls_of_caisar_op: (Interpretation.Data
+                      (Interpretation.D_csv
+                         ["1.0"; "0.0"; "0.019607843"; "0.776470588";
+                           "0.784313725"]))
+  ty: tensor
+  t
+  ls: caisar_op4
+  reduce_match@(caisar_op4,
+  0)
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , perturbed_image5
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ perturbed_image5 , 0
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , perturbed_image5
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ perturbed_image5 , y35
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , perturbed_image5
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ perturbed_image5 , 1
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , perturbed_image5
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ perturbed_image5 , y35
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , perturbed_image5
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ perturbed_image5 , 2
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , perturbed_image5
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ perturbed_image5 , y35
+  --
+  equal_shape: caisar_op4 perturbed_image6
+  ls_of_caisar_op: <var>
+  ty: tensor
+  t
+  ls: caisar_op5
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , caisar_op5
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ caisar_op5 , 0
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , caisar_op5
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ caisar_op5 , y36
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , caisar_op5
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ caisar_op5 , 1
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , caisar_op5
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ caisar_op5 , y36
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , caisar_op5
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ caisar_op5 , 2
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , caisar_op5
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ caisar_op5 , y36
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , caisar_op5
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ caisar_op5 , 0
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , caisar_op5
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ caisar_op5 , 0
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , caisar_op5
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ caisar_op5 , 1
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , caisar_op5
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ caisar_op5 , 0
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , caisar_op5
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ caisar_op5 , 2
+  --
+  apply_classifier: ls:(@@) , ty:vector
+  t
+  Terms: caisar_op , caisar_op5
+  --
+  vget: ls:([]) , ty:t
+  Terms: caisar_op @@ caisar_op5 , 0
+  G : ((forall v:vector int.
+         valid_index caisar_op3 v ->
+         le (0.0:t) (caisar_op3 # v) /\ le (caisar_op3 # v) (1.0:t)) ->
+       (forall v:vector int.
+         valid_index (caisar_op3 - caisar_op2) v ->
+         le (neg (0.375:t)) ((caisar_op3 - caisar_op2) # v) /\
+         le ((caisar_op3 - caisar_op2) # v) (0.375:t)) ->
+       lt (caisar_op @@ caisar_op3)[0] (caisar_op @@ caisar_op3)[1] /\
+       lt (caisar_op @@ caisar_op3)[2] (caisar_op @@ caisar_op3)[1]) /\
+      ((forall v:vector int.
+         valid_index caisar_op5 v ->
+         le (0.0:t) (caisar_op5 # v) /\ le (caisar_op5 # v) (1.0:t)) ->
+       (forall v:vector int.
+         valid_index (caisar_op5 - caisar_op4) v ->
+         le (neg (0.375:t)) ((caisar_op5 - caisar_op4) # v) /\
+         le ((caisar_op5 - caisar_op4) # v) (0.375:t)) ->
+       lt (caisar_op @@ caisar_op5)[1] (caisar_op @@ caisar_op5)[0] /\
+       lt (caisar_op @@ caisar_op5)[2] (caisar_op @@ caisar_op5)[0])
   caisar_op,
-  (Interpretation.Dataset <csv>)
+  (Interpretation.Classifier
+     "$TESTCASE_ROOT/TestNetwork.nnet")
+  caisar_op5, <var>
+  caisar_op3, <var>
+  caisar_op1, (Interpretation.Dataset <csv>)
+  caisar_op4,
+  (Interpretation.Data
+     (Interpretation.D_csv
+        ["1.0"; "0.0"; "0.019607843"; "0.776470588"; "0.784313725"]))
+  caisar_op2,
+  (Interpretation.Data
+     (Interpretation.D_csv
+        ["0.0"; "1.0"; "0.784313725"; "0.019607843"; "0.776470588"]))