]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/ocaml/paramodulation/indexing.ml
added some typechecks to avoid using equations with the wrong type
[helm.git] / helm / ocaml / paramodulation / indexing.ml
index 64a96f82aefdcdb4f11a665c3316538b37519f07..be02d8c1b83eb552523a7a5425e3cb267010299c 100644 (file)
@@ -1,4 +1,7 @@
 
+let debug_print = Utils.debug_print;;
+
+
 type retrieval_mode = Matching | Unification;;
 
 
@@ -142,51 +145,61 @@ let rec find_matches metasenv context ugraph lift_amount term =
   let module HL = HelmLibraryObjects in
   let cmp = !Utils.compare_terms in
   let names = Utils.names_of_context context in
+  let termty, ugraph =
+    CicTypeChecker.type_of_aux' metasenv context term ugraph
+  in
   function
     | [] -> None
     | candidate::tl ->
         let pos, (_, proof, (ty, left, right, o), metas, args) = candidate in
-        let do_match c other eq_URI =
-          let subst', metasenv', ugraph' =
-            let t1 = Unix.gettimeofday () in
-            try
-              let r =
-                Inference.matching (metasenv @ metas) context
-                  term (S.lift lift_amount c) ugraph in
-              let t2 = Unix.gettimeofday () in
-              match_unif_time_ok := !match_unif_time_ok +. (t2 -. t1);
-              r
-            with e ->
-              let t2 = Unix.gettimeofday () in
-              match_unif_time_no := !match_unif_time_no +. (t2 -. t1);
-              raise e
-          in
+        if not (fst (CicReduction.are_convertible
+                       ~metasenv context termty ty ugraph)) then (
+          debug_print (
+            Printf.sprintf "CANDIDATE HAS WRONG TYPE: %s required, %s found"
+              (CicPp.pp termty names) (CicPp.pp ty names));
+          find_matches metasenv context ugraph lift_amount term tl
+        ) else
+          let do_match c other eq_URI =
+            let subst', metasenv', ugraph' =
+              let t1 = Unix.gettimeofday () in
+              try
+                let r =
+                  Inference.matching (metasenv @ metas) context
+                    term (S.lift lift_amount c) ugraph in
+                let t2 = Unix.gettimeofday () in
+                match_unif_time_ok := !match_unif_time_ok +. (t2 -. t1);
+                r
+              with e ->
+                let t2 = Unix.gettimeofday () in
+                match_unif_time_no := !match_unif_time_no +. (t2 -. t1);
+                raise e
+            in
             Some (C.Rel (1 + lift_amount), subst', metasenv', ugraph',
                   (candidate, eq_URI))
-        in
-        let c, other, eq_URI =
-          if pos = Utils.Left then left, right, HL.Logic.eq_ind_URI
-          else right, left, HL.Logic.eq_ind_r_URI
-        in
-        if o <> U.Incomparable then
-          try
-            do_match c other eq_URI
-          with e ->
-            find_matches metasenv context ugraph lift_amount term tl
-        else
-          let res = try do_match c other eq_URI with e -> None in
-          match res with
-          | Some (_, s, _, _, _) ->
-              let c' = (* M. *)apply_subst s c
-              and other' = (* M. *)apply_subst s other in
-              let order = cmp c' other' in
-              let names = U.names_of_context context in
-              if order = U.Gt then
-                res
-              else
-                find_matches metasenv context ugraph lift_amount term tl
-          | None ->
+          in
+          let c, other, eq_URI =
+            if pos = Utils.Left then left, right, HL.Logic.eq_ind_URI
+            else right, left, HL.Logic.eq_ind_r_URI
+          in
+          if o <> U.Incomparable then
+            try
+              do_match c other eq_URI
+            with e ->
               find_matches metasenv context ugraph lift_amount term tl
+          else
+            let res = try do_match c other eq_URI with e -> None in
+            match res with
+            | Some (_, s, _, _, _) ->
+                let c' = (* M. *)apply_subst s c
+                and other' = (* M. *)apply_subst s other in
+                let order = cmp c' other' in
+                let names = U.names_of_context context in
+                if order = U.Gt then
+                  res
+                else
+                  find_matches metasenv context ugraph lift_amount term tl
+            | None ->
+                find_matches metasenv context ugraph lift_amount term tl
 ;;
 
 
@@ -199,58 +212,69 @@ let rec find_all_matches ?(unif_fun=Inference.unification)
   let module HL = HelmLibraryObjects in
   let cmp = !Utils.compare_terms in
   let names = Utils.names_of_context context in
+  let termty, ugraph =
+    CicTypeChecker.type_of_aux' metasenv context term ugraph
+  in
   function
     | [] -> []
     | candidate::tl ->
         let pos, (_, _, (ty, left, right, o), metas, args) = candidate in
-        let do_match c other eq_URI =
-          let subst', metasenv', ugraph' =
-            let t1 = Unix.gettimeofday () in
+        if not (fst (CicReduction.are_convertible
+                       ~metasenv context termty ty ugraph)) then (
+          debug_print (
+            Printf.sprintf "CANDIDATE HAS WRONG TYPE: %s required, %s found"
+              (CicPp.pp termty names) (CicPp.pp ty names));
+          find_all_matches ~unif_fun metasenv context ugraph
+            lift_amount term tl
+        ) else
+          let do_match c other eq_URI =
+            let subst', metasenv', ugraph' =
+              let t1 = Unix.gettimeofday () in
+              try
+                let r = 
+                  unif_fun (metasenv @ metas) context
+                    term (S.lift lift_amount c) ugraph in
+                let t2 = Unix.gettimeofday () in
+                match_unif_time_ok := !match_unif_time_ok +. (t2 -. t1);
+                r
+              with e ->
+                let t2 = Unix.gettimeofday () in
+                match_unif_time_no := !match_unif_time_no +. (t2 -. t1);
+                raise e
+            in
+            (C.Rel (1 + lift_amount), subst', metasenv', ugraph',
+             (candidate, eq_URI))
+          in
+          let c, other, eq_URI =
+            if pos = Utils.Left then left, right, HL.Logic.eq_ind_URI
+            else right, left, HL.Logic.eq_ind_r_URI
+          in
+          if o <> U.Incomparable then
             try
-              let r = 
-                unif_fun (metasenv @ metas) context
-                  term (S.lift lift_amount c) ugraph in
-              let t2 = Unix.gettimeofday () in
-              match_unif_time_ok := !match_unif_time_ok +. (t2 -. t1);
-              r
+              let res = do_match c other eq_URI in
+              res::(find_all_matches ~unif_fun metasenv context ugraph
+                      lift_amount term tl)
             with e ->
-              let t2 = Unix.gettimeofday () in
-              match_unif_time_no := !match_unif_time_no +. (t2 -. t1);
-              raise e
-          in
-          (C.Rel (1 + lift_amount), subst', metasenv', ugraph',
-           (candidate, eq_URI))
-        in
-        let c, other, eq_URI =
-          if pos = Utils.Left then left, right, HL.Logic.eq_ind_URI
-          else right, left, HL.Logic.eq_ind_r_URI
-        in
-        if o <> U.Incomparable then
-          try
-            let res = do_match c other eq_URI in
-            res::(find_all_matches ~unif_fun metasenv context ugraph
-                    lift_amount term tl)
-          with e ->
-            find_all_matches ~unif_fun metasenv context ugraph
-              lift_amount term tl
-        else
-          try
-            let res = do_match c other eq_URI in
-            match res with
-            | _, s, _, _, _ ->
-                let c' = (* M. *)apply_subst s c
-                and other' = (* M. *)apply_subst s other in
-                let order = cmp c' other' in
-                let names = U.names_of_context context in
-                if order <> U.Lt && order <> U.Le then
-                  res::(find_all_matches ~unif_fun metasenv context ugraph
-                          lift_amount term tl)
-                else
-                  find_all_matches ~unif_fun metasenv context ugraph
-                    lift_amount term tl
-          with e ->
-            find_all_matches ~unif_fun metasenv context ugraph
-              lift_amount term tl
+              find_all_matches ~unif_fun metasenv context ugraph
+                lift_amount term tl
+          else
+            try
+              let res = do_match c other eq_URI in
+              match res with
+              | _, s, _, _, _ ->
+                  let c' = (* M. *)apply_subst s c
+                  and other' = (* M. *)apply_subst s other in
+                  let order = cmp c' other' in
+                  let names = U.names_of_context context in
+                  if order <> U.Lt && order <> U.Le then
+                    res::(find_all_matches ~unif_fun metasenv context ugraph
+                            lift_amount term tl)
+                  else
+                    find_all_matches ~unif_fun metasenv context ugraph
+                      lift_amount term tl
+            with e ->
+              find_all_matches ~unif_fun metasenv context ugraph
+                lift_amount term tl
 ;;