in
aux term
;;
+*)
+(*
let restore_metas (* context *) term =
let module C = Cic in
let rec aux = function
in
aux term
;;
+*)
-
+(*
let rec restore_subst (* context *) subst =
List.map
(fun (i, (c, t, ty)) ->
| Cic.Meta (i, l) -> check_irl 1 l
| Cic.Rel _ -> true
| Cic.Const _ -> true
+ | Cic.MutInd (_, _, []) -> true
+ | Cic.MutConstruct (_, _, _, []) -> true
| _ -> false
;;
| C.Meta (i, _), C.Meta (j, _) when i > j ->
unif subst menv t s
| C.Meta _, t when occurs_check subst s t ->
- raise (U.UnificationFailure "Inference.unification.unif")
+ raise (U.UnificationFailure (U.failure_msg_of_string "Inference.unification.unif"))
| C.Meta (i, l), t -> (
try
let _, _, ty = CicUtil.lookup_meta i menv in
subst, menv
with CicUtil.Meta_not_found m ->
let names = names_of_context context in
- debug_print (
+ debug_print (lazy (
Printf.sprintf "Meta_not_found %d!: %s %s\n%s\n\n%s" m
(CicPp.pp t1 names) (CicPp.pp t2 names)
- (print_metasenv menv) (print_metasenv metasenv));
+ (print_metasenv menv) (print_metasenv metasenv)));
assert false
)
| _, C.Meta _ -> unif subst menv t s
| C.Appl (hds::_), C.Appl (hdt::_) when hds <> hdt ->
- raise (U.UnificationFailure "Inference.unification.unif")
+ raise (U.UnificationFailure (U.failure_msg_of_string "Inference.unification.unif"))
| C.Appl (hds::tls), C.Appl (hdt::tlt) -> (
try
List.fold_left2
(fun (subst', menv) s t -> unif subst' menv s t)
(subst, menv) tls tlt
with Invalid_argument _ ->
- raise (U.UnificationFailure "Inference.unification.unif")
+ raise (U.UnificationFailure (U.failure_msg_of_string "Inference.unification.unif"))
)
- | _, _ -> raise (U.UnificationFailure "Inference.unification.unif")
+ | _, _ -> raise (U.UnificationFailure (U.failure_msg_of_string "Inference.unification.unif"))
in
let subst, menv = unif [] metasenv t1 t2 in
let menv =
let unification metasenv context t1 t2 ugraph =
(* Printf.printf "| unification %s %s\n" (CicPp.ppterm t1) (CicPp.ppterm t2); *)
let subst, menv, ug =
- if not (is_simple_term t1) || not (is_simple_term t2) then
+ if not (is_simple_term t1) || not (is_simple_term t2) then (
+ debug_print (lazy (
+ Printf.sprintf "NOT SIMPLE TERMS: %s %s"
+ (CicPp.ppterm t1) (CicPp.ppterm t2)));
CicUnification.fo_unif metasenv context t1 t2 ugraph
- else
+ ) else
unification_simple metasenv context t1 t2 ugraph
in
let rec fix_term = function
(* let newmeta = ProofEngineHelpers.new_meta_of_proof ~proof in *)
let (head, newmetas, args, newmeta) =
ProofEngineHelpers.saturate_term newmeta []
- context (S.lift index term)
+ context (S.lift index term) 0
in
let p =
if List.length args = 0 then
match head with
| C.Appl [C.MutInd (uri, _, _); ty; t1; t2]
when (UriManager.eq uri eq_uri) && (ok_types ty newmetas) ->
- debug_print (
- Printf.sprintf "OK: %s" (CicPp.ppterm term));
-(* debug_print ( *)
+ debug_print (lazy (
+ Printf.sprintf "OK: %s" (CicPp.ppterm term)));
+(* debug_print (lazy ( *)
(* Printf.sprintf "args: %s\n" *)
-(* (String.concat ", " (List.map CicPp.ppterm args))); *)
-(* debug_print ( *)
+(* (String.concat ", " (List.map CicPp.ppterm args)))); *)
+(* debug_print (lazy ( *)
(* Printf.sprintf "newmetas:\n%s\n" *)
-(* (print_metasenv newmetas)); *)
+(* (print_metasenv newmetas))); *)
let o = !Utils.compare_terms t1 t2 in
let w = compute_equality_weight ty t1 t2 in
let proof = BasicProof p in
"cic:/Coq/Init/Logic/sym_eq.con";
(* "cic:/Coq/Logic/Eqdep/UIP_refl.con"; *)
(* "cic:/Coq/Init/Peano/mult_n_Sm.con"; *)
+
+ (* ALB !!!! questo e` imbrogliare, ma x ora lo lasciamo cosi`...
+ perche' questo cacchio di teorema rompe le scatole :'( *)
+ "cic:/Rocq/SUBST/comparith/mult_n_2.con";
]
;;
let candidates =
List.fold_left
(fun l uri ->
+ let suri = UriManager.string_of_uri uri in
if UriManager.UriSet.mem uri equations_blacklist then
l
else
let rec aux newmeta = function
| [] -> [], newmeta
| (term, termty)::tl ->
+ debug_print (lazy (
+ Printf.sprintf "Examining: %s (%s)"
+ (UriManager.string_of_uri (CicUtil.uri_of_term term))(* (CicPp.ppterm term) *) (CicPp.ppterm termty)));
let res, newmeta =
match termty with
| C.Prod (name, s, t) ->
let head, newmetas, args, newmeta =
- ProofEngineHelpers.saturate_term newmeta [] context termty
+ ProofEngineHelpers.saturate_term newmeta [] context termty 0
in
let p =
if List.length args = 0 then
match head with
| C.Appl [C.MutInd (uri, _, _); ty; t1; t2]
when (iseq uri) && (ok_types ty newmetas) ->
- debug_print (
- Printf.sprintf "OK: %s" (CicPp.ppterm term));
+ debug_print (lazy (
+ Printf.sprintf "OK: %s" (CicPp.ppterm term)));
let o = !Utils.compare_terms t1 t2 in
let w = compute_equality_weight ty t1 t2 in
let proof = BasicProof p in
| None ->
aux newmeta tl
in
- aux maxmeta candidates
+ let found, maxm = aux maxmeta candidates in
+ (List.fold_left
+ (fun l e ->
+ if List.exists (meta_convertibility_eq e) l then (
+ debug_print (lazy (
+ Printf.sprintf "NO!! %s already there!" (string_of_equality e)));
+ l
+ )
+ else e::l)
+ [] found), maxm
;;