]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/components/tactics/paramodulation/saturation.ml
fixed demodulation of goal
[helm.git] / helm / software / components / tactics / paramodulation / saturation.ml
index 351bc11bd0b88f67def8add7000da426cb418c4a..6ab9f59e28206cdd47331ccd91bdf055d1fb038b 100644 (file)
@@ -142,10 +142,10 @@ let age_factor = 0.01;;
    of weight, age and goal-similarity
 *)
 
-let rec select env goals passive =
+let rec select env (goals,_) passive =
   processed_clauses := !processed_clauses + 1;
   let goal =
-    match (List.rev goals) with (_, goal::_)::_ -> goal | _ -> assert false
+    match (List.rev goals) with goal::_ -> goal | _ -> assert false
   in
   let (pos_list, pos_set), passive_table = passive in
   let remove eq l = List.filter (fun e -> Equality.compare e eq <> 0) l in
@@ -628,12 +628,7 @@ let rec simplify_goal env goal ?passive (active_list, active_table) =
     | None -> None
     | Some ((_, _), pt) -> Some pt
   in
-  let demodulate table goal = 
-    let changed, newmeta, newgoal =
-      Indexing.demodulation_goal !maxmeta env table goal in
-    maxmeta := newmeta;
-    changed, newgoal
-  in
+  let demodulate table goal = Indexing.demodulation_goal env table goal in
   let changed, goal =
     match passive_table with
     | None -> demodulate active_table goal
@@ -654,25 +649,15 @@ let simplify_goals env goals ?passive active =
   let a_goals, p_goals = goals in
   let p_goals = 
     List.map
-      (fun (d, gl) ->
-         let gl =
-           List.map (fun g -> snd (simplify_goal env g ?passive active)) gl in
-         d, gl)
+      (fun g -> snd (simplify_goal env g ?passive active))
       p_goals
   in
-  let goals =
-    List.fold_left
-      (fun (a, p) (d, gl) ->
-         let changed = ref false in
-         let gl =
-           List.map
-             (fun g ->
-                let c, g = simplify_goal env g ?passive active in
-                changed := !changed || c; g) gl in
-         if !changed then (a, (d, gl)::p) else ((d, gl)::a, p))
-      ([], p_goals) a_goals
+  let a_goals = 
+    List.map
+      (fun g -> snd (simplify_goal env g ?passive active))
+      a_goals
   in
-  goals
+  a_goals, p_goals
 ;;
 
 
@@ -718,8 +703,6 @@ let backward_simplify_active env new_pos new_table min_weight active =
          else eq::p)
       newa []
   in
-  if List.length active1 <> List.length (fst active) then
-    prerr_endline "\n\n\nMANCAVANO DELLE PRUNED!!!!\n\n\n";
   match newa with
   | [] -> (active1,tbl), None, pruned 
   | _ -> (active1,tbl), Some newa, pruned
@@ -843,6 +826,9 @@ let make_goals goal =
   active, passive
 ;;
 
+let make_goal_set goal = 
+  ([],[goal]) 
+;;
 
 (** initializes the set of theorems *)
 let make_theorems theorems =
@@ -957,8 +943,8 @@ let print_goals goals =
 ;;
 
 let check_if_goal_is_subsumed ((_,ctx,_) as env) table (goalproof,menv,ty) =
-  let names = names_of_context ctx in
-  Printf.eprintf "check_goal_subsumed: %s\n" (CicPp.pp ty names);
+(*  let names = names_of_context ctx in*)
+(*  Printf.eprintf "check_goal_subsumed: %s\n" (CicPp.pp ty names);*)
   match ty with
   | Cic.Appl[Cic.MutInd(uri,_,_);eq_ty;left;right] 
     when UriManager.eq uri (LibraryObjects.eq_URI ()) ->
@@ -966,8 +952,8 @@ let check_if_goal_is_subsumed ((_,ctx,_) as env) table (goalproof,menv,ty) =
          Equality.mk_equality
            (0,Equality.Exact (Cic.Implicit None),(eq_ty,left,right,Eq),menv) 
       in
-      match Indexing.subsumption env table goal_equation with
-(*       match Indexing.unification env table goal_equation with *)
+(*      match Indexing.subsumption env table goal_equation with*)
+       match Indexing.unification env table goal_equation with 
         | Some (subst, equality ) ->
             let (_,p,(ty,l,r,_),m,id) = Equality.open_equality equality in
             let cicmenv = Subst.apply_subst_metasenv subst (m @ menv) in
@@ -982,11 +968,18 @@ let counter = ref 0
 let rec given_clause_fullred dbd env goals theorems ~passive active =
   let goals = simplify_goals env goals ~passive active in 
   let _,context,_ = env in
-  let ok, goals = activate_goal goals in
+  let ok, (goals:
+    (Equality.goal_proof * Cic.metasenv * Cic.term) list * 
+    (Equality.goal_proof * Cic.metasenv * Cic.term) list) = activate_goal 
+    
+    (goals: 
+  (Equality.goal_proof * Cic.metasenv * Cic.term) list * 
+    (Equality.goal_proof * Cic.metasenv * Cic.term) list)
+  in
 (*   let theorems = simplify_theorems env theorems ~passive active in *)
   if ok then
     let names = List.map (HExtlib.map_option (fun (name,_) -> name)) context in 
-    let _, _, t = List.hd (snd (List.hd (fst goals))) in
+    let _, _, t = List.hd (fst goals) in
     let _ = prerr_endline ("goal activated = " ^ (CicPp.pp t names)) in
 (*     let _ = *)
 (*       debug_print *)
@@ -1003,12 +996,12 @@ let rec given_clause_fullred dbd env goals theorems ~passive active =
     let ok, proof =
       (* apply_goal_to_theorems dbd env theorems ~passive active goals in *)
       let iseq uri = UriManager.eq uri (LibraryObjects.eq_URI ()) in
-      match (fst goals) with
-        | (_,[goalproof,m,Cic.Appl[Cic.MutInd(uri,_,ens);eq_ty;left;right]])::_ 
+      match fst goals with
+        | (goalproof,m,Cic.Appl[Cic.MutInd(uri,_,ens);eq_ty;left;right])::_ 
             when left = right && iseq uri -> 
             let reflproof = Equality.Exact (Equality.refl_proof eq_ty left) in
             true, Some (goalproof, reflproof, Subst.empty_subst,m)
-        | (_, [goal])::_ ->
+        | goal::_ ->
             (match check_if_goal_is_subsumed env (snd active) goal with
             | None -> false,None
             | Some p ->
@@ -1122,7 +1115,7 @@ and given_clause_fullred_aux dbd env goals theorems passive active =
   | true -> ParamodulationFailure ""
       (* given_clause_fullred dbd env goals theorems passive active  *)     
   | false ->
-      let current, passive = select env (fst goals) passive in
+      let current, passive = select env goals passive in
       prerr_endline 
         ("Selected = " ^ Equality.string_of_equality ~env current);
 (* ^ 
@@ -1270,27 +1263,29 @@ let rec check goal = function
 ;;
   
 let simplify_goal_set env goals passive active = 
-  (*
-  let supl_goals = 
-     (List.flatten 
-       (List.map (Indexing.superposition_left env (snd active)) 
-         goals))
+  let active_goals, passive_goals = goals in 
+  let find (_,_,g) where =
+    List.exists (fun (_,_,g1) -> Equality.meta_convertibility g g1) where
   in
-  *)
   let simplified =
-    HExtlib.filter_map 
-      (fun g -> 
-        match simplify_goal env g ~passive active with 
-        | true, g -> Some g
-        | false, g -> Some g)
-      goals
+    List.fold_left
+      (fun acc goal -> 
+        match simplify_goal env goal ~passive active with 
+        | _, g -> if find g acc then acc else g::acc)
+      [] active_goals
   in
+  if List.length active_goals <>  List.length simplified then
+    prerr_endline "SEMPLIFICANDO HO SCARTATO...";
+  (simplified,passive_goals)
+        (*
   HExtlib.list_uniq ~eq:(fun (_,_,t1) (_,_,t2) -> t1 = t2)
     (List.sort (fun (_,_,t1) (_,_,t2) -> compare t1 t1)
       ((*goals @*) simplified))
+      *)
 ;;
 
 let check_if_goals_set_is_solved env active goals =
+  let active_goals, passive_goals = goals in 
   List.fold_left 
     (fun proof goal ->
       match proof with
@@ -1299,14 +1294,49 @@ let check_if_goals_set_is_solved env active goals =
           check goal [
             check_if_goal_is_identity env;
             check_if_goal_is_subsumed env (snd active)])
-    None goals
+    None active_goals
+;;
+
+let infer_goal_set env active goals = 
+  let active_goals, passive_goals = goals in
+  let rec aux = function
+    | [] -> goals
+    | ((_,_,t1) as hd)::tl when 
+       not (List.exists 
+             (fun (_,_,t) -> Equality.meta_convertibility t t1) 
+             active_goals)
+       -> 
+        let selected = hd in
+        let passive_goals = tl in
+        let new' = Indexing.superposition_left env (snd active) selected in
+        let metasenv, context, ugraph = env in
+        let names = names_of_context context in
+        List.iter (fun (_,_,x) -> prerr_endline ("X: " ^ CicPp.pp x names)) new';
+        selected::active_goals, passive_goals @ new'
+    | _::tl -> aux tl
+  in 
+  aux passive_goals
+;;
+
+let infer_goal_set_with_current env current goals = 
+  let active_goals, passive_goals = goals in
+  let _,table,_ = build_table [current] in
+  active_goals,
+  List.fold_left 
+    (fun acc g ->
+      let new' = Indexing.superposition_left env table g in
+      acc @ new')
+    passive_goals active_goals
 ;;
 
-let size_of_goal_set = List.length;;
+
+
+let size_of_goal_set_a (l,_) = List.length l;;
+let size_of_goal_set_p (_,l) = List.length l;;
 
 (** given-clause algorithm with full reduction strategy: NEW implementation *)
 (* here goals is a set of goals in OR *)
-let given_clause
+let given_clause 
   ((_,context,_) as env) goals theorems passive active max_iterations max_time
 = 
   let initial_time = Unix.gettimeofday () in
@@ -1334,9 +1364,9 @@ let given_clause
           ParamodulationSuccess p
       | None -> 
           prerr_endline 
-            (Printf.sprintf "%d #ACTIVES: %d #PASSIVES: %d #GOALSET: %d\n"
+            (Printf.sprintf "%d #ACTIVES: %d #PASSIVES: %d #GOALSET: %d(%d)\n"
             iterno (size_of_active active) (size_of_passive passive)
-            (size_of_goal_set goals));
+            (size_of_goal_set_a goals) (size_of_goal_set_p goals));
           (* PRUNING OF PASSIVE THAT WILL NEVER BE PROCESSED *)  
           let passive =
             let selection_estimate = iterations_left iterno in
@@ -1355,7 +1385,8 @@ let given_clause
             ParamodulationFailure "No more passive" (* maybe this is a success! *)
           else
             begin
-              let current, passive = select env [1,goals] passive in
+              let goals = infer_goal_set env active goals in
+              let current, passive = select env goals passive in
               Printf.eprintf  "Selected = %s\n"
                 (Equality.string_of_equality ~env current);
               (* SIMPLIFICATION OF CURRENT *)
@@ -1367,6 +1398,7 @@ let given_clause
               | Some current ->
                   (* GENERATION OF NEW EQUATIONS *)
                   let new' = infer env current active in
+                  let goals = infer_goal_set_with_current env current goals in
                   let active = 
                     if Equality.is_identity env current then 
                       assert false 
@@ -1405,7 +1437,7 @@ let rec saturate_equations env goal accept_fun passive active =
   if !elapsed_time > !time_limit then
     (active, passive)
   else
-    let current, passive = select env [1, [goal]] passive in
+    let current, passive = select env ([goal],[]) passive in
     let res = forward_simplify env (Positive, current) ~passive active in
     match res with
     | None ->
@@ -1652,31 +1684,18 @@ let saturate
   maxdepth := depth;
   maxwidth := width;
 (*  CicUnification.unif_ty := false;*)
-  let proof, goal = status in
-  let goal' = goal in
+  let proof, goalno = status in
   let uri, metasenv, meta_proof, term_to_prove = proof in
-  let _, context, goal = CicUtil.lookup_meta goal' metasenv in
+  let _, context, type_of_goal = CicUtil.lookup_meta goalno metasenv in
   let names = names_of_context context in
   let eq_indexes, equalities, maxm = find_equalities context proof in
-  let new_meta_goal, metasenv, type_of_goal =
-    let irl =
-      CicMkImplicit.identity_relocation_list_for_metavariable context in
-    let _, context, ty = CicUtil.lookup_meta goal' metasenv in
-    debug_print
-      (lazy (Printf.sprintf "\n\nTIPO DEL GOAL: %s\n" (CicPp.ppterm ty)));
-    Cic.Meta (maxm+1, irl),
-    (maxm+1, context, ty)::metasenv,
-    ty
-  in
   let ugraph = CicUniv.empty_ugraph in
   let env = (metasenv, context, ugraph) in 
-  prerr_endline 
-    ("METASENV DEL GOAL: " ^ CicMetaSubst.ppmetasenv [] metasenv );
-  let goal = [], metasenv, goal in
+  let goal = [], metasenv, type_of_goal in
   let res, time =
     let t1 = Unix.gettimeofday () in
     let lib_eq_uris, library_equalities, maxm =
-      find_library_equalities dbd context (proof, goal') (maxm+2)
+      find_library_equalities dbd context (proof, goalno) (maxm+2)
     in
     let library_equalities = List.map snd library_equalities in
     let t2 = Unix.gettimeofday () in
@@ -1688,7 +1707,7 @@ let saturate
     let t1 = Unix.gettimeofday () in
     let theorems =
       if full then
-        let thms = find_library_theorems dbd env (proof, goal') lib_eq_uris in
+        let thms = find_library_theorems dbd env (proof, goalno) lib_eq_uris in
         let context_hyp = find_context_hypotheses env eq_indexes in
         context_hyp @ thms, []
       else
@@ -1725,12 +1744,9 @@ let saturate
       let goals = make_goals goal in
       given_clause_fullred dbd env goals theorems passive active
 *)
-      let goals = [goal] in
+      let goals = make_goal_set goal in
       let max_iterations = 1000 in
-      let max_time = 
-        Unix.gettimeofday () +. 
-        600. (* minutes *)
-      in
+      let max_time = Unix.gettimeofday () +.  600. (* minutes *) in
       given_clause env goals theorems passive active max_iterations max_time 
     in
     let finish = Unix.gettimeofday () in
@@ -1742,153 +1758,95 @@ let saturate
   | ParamodulationSuccess 
     (goalproof,newproof,subsumption_subst, proof_menv) ->
       prerr_endline "OK, found a proof!";
-
-      prerr_endline "NEWPROOF";
-     (* prerr_endline (Equality.string_of_proof_new ~names newproof
-      * goalproof);*)
       prerr_endline (Equality.pp_proof names goalproof newproof);
-
-(*       assert false; *)
-      
-      (* generation of the proof *)
-      let cic_proof_new = 
-        Equality.build_goal_proof 
-          goalproof (Equality.build_proof_term newproof) type_of_goal
+      prerr_endline "ENDOFPROOFS";
+      (* generation of the CIC proof *)
+      let side_effects = 
+        List.filter (fun i -> i <> goalno)
+          (ProofEngineHelpers.compare_metasenvs 
+            ~newmetasenv:metasenv ~oldmetasenv:proof_menv)
       in
-      let cic_proof_new = 
-        Subst.apply_subst subsumption_subst cic_proof_new 
+      let free_metas = 
+        List.filter (fun i -> i <> goalno)
+          (ProofEngineHelpers.compare_metasenvs 
+            ~oldmetasenv:metasenv ~newmetasenv:proof_menv)
       in
-      
-      (* replacing fake mets with real ones *)
-      let equality_for_replace i t1 =
-        match t1 with
-        | C.Meta (n, _) -> n = i
-        | _ -> false
+      let goal_proof, side_effects_t = 
+        let initial = Equality.build_proof_term newproof in
+        Equality.build_goal_proof goalproof initial type_of_goal side_effects
+      in
+      let goal_proof = Subst.apply_subst subsumption_subst goal_proof in
+      let side_effects_t = 
+        List.map (Subst.apply_subst subsumption_subst) side_effects_t
       in
-      let mkirl = CicMkImplicit.identity_relocation_list_for_metavariable in
-      prerr_endline "replacing metas (new)";
-      let newproof_menv, what, with_what,_ = 
-        let irl = mkirl context in
+      (* replacing fake mets with real ones *)
+      prerr_endline "replacing metas...";
+      let irl=CicMkImplicit.identity_relocation_list_for_metavariable context in
+      let goal_proof_menv, what, with_what,free_meta = 
         List.fold_left 
           (fun (acc1,acc2,acc3,uniq) (i,_,ty) -> 
              match uniq with
                | Some m -> 
-                   acc1, 
-                   (Cic.Meta(i,[]))::acc2, 
-                   m::acc3, uniq
+                   acc1, (Cic.Meta(i,[]))::acc2, m::acc3, uniq
                | None ->
-                   [i,context,ty], 
-                   (Cic.Meta(i,[]))::acc2, 
+                   [i,context,ty], (Cic.Meta(i,[]))::acc2, 
                    (Cic.Meta(i,irl)) ::acc3,Some (Cic.Meta(i,irl))) 
           ([],[],[],None) proof_menv 
       in
-      let cic_proof_new = ProofEngineReduction.replace_lifting
-              ~equality:(=)
-              ~what ~with_what
-              ~where:cic_proof_new
-      in
-
-      (* pp new/old proof *)
-(*      prerr_endline "NEWPROOFCIC";*)
-(*      prerr_endline (CicPp.pp cic_proof_new names); *)
-
-      (* generation of proof metasenv *)
-      let newmetasenv_new = metasenv@newproof_menv in
-      let newmetasenv_new =
-        let i1 =
-          match new_meta_goal with
-          | C.Meta (i, _) -> i | _ -> assert false
-        in
-        List.filter (fun (i, _, _) -> i <> i1 && i <> goal') newmetasenv_new
+      let replace where = 
+        ProofEngineReduction.replace_lifting 
+          ~equality:(=) ~what ~with_what ~where
       in
+      let goal_proof = replace goal_proof in
+        (* ok per le meta libere... ma per quelle che c'erano e sono rimaste? 
+         * what mi pare buono, sostituisce solo le meta farlocche *)
+        prerr_endline (CicPp.pp goal_proof names);
+      let side_effects_t = List.map replace side_effects_t in
       (* check/refine/... build the new proof *)
-      let newstatus =
-        let cic_proof,newmetasenv,proof_menv,ty, ug =
-          let cic_proof_new,new_ty,newmetasenv_new,newug = 
-            try
-              (*
-               prerr_endline "refining ... (new) ";
-               CicRefine.type_of_aux' 
-                newmetasenv_new context cic_proof_new ugraph
-              *)
-              let ty,ug = 
-                prerr_endline "typechecking ... (new) ";
-                CicTypeChecker.type_of_aux' 
-                  newmetasenv_new context cic_proof_new ugraph
-              in
-              cic_proof_new, ty, newmetasenv_new, ug
-            with
-            | CicTypeChecker.TypeCheckerFailure s ->
-                prerr_endline "THE PROOF DOESN'T TYPECHECK!!!";
-                prerr_endline (Lazy.force s);
-                assert false
-            | CicRefine.RefineFailure s 
-            | CicRefine.Uncertain s 
-            | CicRefine.AssertFailure s -> 
-                prerr_endline "FAILURE IN REFINE";
-                prerr_endline (Lazy.force s);
-                assert false
-          in
-          if List.length newmetasenv_new <> 0 then
-            prerr_endline 
-              ("Some METAS are still open: "(* ^ CicMetaSubst.ppmetasenv
-               [] newmetasenv_new*));
-          cic_proof_new, newmetasenv_new, newmetasenv_new,new_ty, newug
-          (* THE OLD PROOF: cic_proof,newmetasenv,proof_menv,oldty,oldug *)
+      let replaced_goal = 
+        ProofEngineReduction.replace
+          ~what:side_effects ~with_what:side_effects_t
+          ~equality:(fun i t -> match t with Cic.Meta(j,_)->j=i|_->false)
+          ~where:type_of_goal
+      in
+      let subst_side_effects,real_menv,_ = 
+        let fail t s = raise (ProofEngineTypes.Fail (lazy (t^Lazy.force s))) in
+        let free_metas_menv = 
+          List.map (fun i -> CicUtil.lookup_meta i goal_proof_menv) free_metas
         in
-        prerr_endline "FINAL PROOF";
-        prerr_endline (CicPp.pp cic_proof names);
-        prerr_endline "ENDOFPROOFS";
-        (*  
-        debug_print
-          (lazy
-             (Printf.sprintf
-                "\nGOAL was: %s\nPROOF has type: %s\nconvertible?: %s\n"
-                (CicPp.pp type_of_goal names) (CicPp.pp ty names)
-                (string_of_bool
-                   (fst (CicReduction.are_convertible
-                           context type_of_goal ty ug)))));
-        *)
-        let real_proof =
-          ProofEngineReduction.replace
-            ~equality:equality_for_replace
-            ~what:[goal'] ~with_what:[cic_proof]
-            ~where:meta_proof
+        try
+          CicUnification.fo_unif_subst [] context (metasenv @ free_metas_menv)
+           replaced_goal type_of_goal CicUniv.empty_ugraph
+        with
+        | CicUnification.UnificationFailure s
+        | CicUnification.Uncertain s 
+        | CicUnification.AssertFailure s -> 
+            fail "Maybe the local context of metas in the goal was not an IRL" s
+      in
+      let final_subst = 
+        (goalno,(context,goal_proof,type_of_goal))::subst_side_effects
+      in
+      let _ = 
+        let ty,_ =
+          CicTypeChecker.type_of_aux' real_menv context goal_proof
+            CicUniv.empty_ugraph
         in
-        (*
-        debug_print
-          (lazy
-             (Printf.sprintf "status:\n%s\n%s\n%s\n%s\n"
-                (match uri with Some uri -> UriManager.string_of_uri uri
-                 | None -> "")
-                (print_metasenv newmetasenv)
-                (CicPp.pp real_proof [](* names *))
-                (CicPp.pp term_to_prove names)));
-        *)
-        let open_goals = List.map (fun (i,_,_) -> i) proof_menv in
-        (uri, newmetasenv, real_proof, term_to_prove), open_goals
+        ty
+      in
+      let proof, real_metasenv = 
+        ProofEngineHelpers.subst_meta_and_metasenv_in_proof
+          proof goalno (CicMetaSubst.apply_subst final_subst) real_menv
       in
-      if Utils.time then
-        begin
-          let tall = fs_time_info.build_all in
-          let tdemodulate = fs_time_info.demodulate in
-          let tsubsumption = fs_time_info.subsumption in
-          prerr_endline (
-            (Printf.sprintf "\nTIME NEEDED: %.9f" time) ^
-              (Printf.sprintf "\ntall: %.9f" tall) ^
-              (Printf.sprintf "\ntdemod: %.9f" tdemodulate) ^
-              (Printf.sprintf "\ntsubsumption: %.9f" tsubsumption) ^
-              (Printf.sprintf "\ninfer_time: %.9f" !infer_time) ^
-              (Printf.sprintf "\nforward_simpl_times: %.9f" 
-                !forward_simpl_time) ^
-              (Printf.sprintf "\nforward_simpl_new_times: %.9f" 
-                !forward_simpl_new_time) ^
-              (Printf.sprintf "\nbackward_simpl_times: %.9f" 
-                !backward_simpl_time) ^
-              (Printf.sprintf "\npassive_maintainance_time: %.9f" 
-                 !passive_maintainance_time))
-        end;
-      newstatus 
+      let open_goals = 
+        match free_meta with Some (Cic.Meta (m,_)) -> [m] | _ -> [] 
+      in
+      Printf.eprintf 
+        "GOALS APERTI: %s\nMETASENV PRIMA:\n%s\nMETASENV DOPO:\n%s\n" 
+          (String.concat ", " (List.map string_of_int open_goals))
+          (CicMetaSubst.ppmetasenv [] metasenv)
+          (CicMetaSubst.ppmetasenv [] real_metasenv);
+      prerr_endline (Printf.sprintf "\nTIME NEEDED: %8.2f" time);
+      proof, open_goals
 ;;
 
 let retrieve_and_print dbd term metasenv ugraph = 
@@ -1901,18 +1859,8 @@ let retrieve_and_print dbd term metasenv ugraph =
   let proof, goals = status in
   let goal' = List.nth goals 0 in
   let uri, metasenv, meta_proof, term_to_prove = proof in
-  let _, context, goal = CicUtil.lookup_meta goal' metasenv in
+  let _, context, type_of_goal = CicUtil.lookup_meta goal' metasenv in
   let eq_indexes, equalities, maxm = find_equalities context proof in
-  let new_meta_goal, metasenv, type_of_goal =
-    let irl =
-      CicMkImplicit.identity_relocation_list_for_metavariable context in
-    let _, context, ty = CicUtil.lookup_meta goal' metasenv in
-    debug_print
-      (lazy (Printf.sprintf "\n\nTIPO DEL GOAL: %s\n" (CicPp.ppterm ty)));
-    Cic.Meta (maxm+1, irl),
-    (maxm+1, context, ty)::metasenv,
-    ty
-  in
   let ugraph = CicUniv.empty_ugraph in
   let env = (metasenv, context, ugraph) in
   let t1 = Unix.gettimeofday () in
@@ -2061,7 +2009,7 @@ let main_demod_equalities dbd term metasenv ugraph =
 *)
 ;;
 
-let demodulate_tac ~dbd ~pattern ((proof,goal) as initialstatus) = 
+let demodulate_tac ~dbd ~pattern ((proof,goal)(*s initialstatus*)) = 
   let module I = Inference in
   let curi,metasenv,pbo,pty = proof in
   let metano,context,ty = CicUtil.lookup_meta goal metasenv in
@@ -2079,15 +2027,15 @@ let demodulate_tac ~dbd ~pattern ((proof,goal) as initialstatus) =
       (fun tbl eq -> Indexing.index tbl eq) 
       Indexing.empty equalities 
   in
-  let _, newmeta,(newproof,newmetasenv, newty) = 
+  let changed,(newproof,newmetasenv, newty) = 
     Indexing.demodulation_goal 
-      maxm (metasenv,context,CicUniv.empty_ugraph) table initgoal 
+      (metasenv,context,CicUniv.empty_ugraph) table initgoal 
   in
-  if newmeta != maxm then
+  if changed then
     begin
       let opengoal = Cic.Meta(maxm,irl) in
-      let proofterm = 
-        Equality.build_goal_proof newproof opengoal ty in
+      let proofterm,_ = 
+        Equality.build_goal_proof newproof opengoal ty [] in
         let extended_metasenv = (maxm,context,newty)::metasenv in
         let extended_status = 
           (curi,extended_metasenv,pbo,pty),goal in
@@ -2097,11 +2045,11 @@ let demodulate_tac ~dbd ~pattern ((proof,goal) as initialstatus) =
             extended_status in
         (status,maxm::newgoals)
     end
-  else if newty = ty then
+  else (* if newty = ty then *)
     raise (ProofEngineTypes.Fail (lazy "no progress"))
-  else ProofEngineTypes.apply_tactic 
+  (*else ProofEngineTypes.apply_tactic 
     (ReductionTactics.simpl_tac ~pattern) 
-    initialstatus
+    initialstatus*)
 ;;
 
 let demodulate_tac ~dbd ~pattern =