;;
+let build_ens_for_sym_eq ty x y =
+ [(UriManager.uri_of_string
+ "cic:/Coq/Init/Logic/Logic_lemmas/equality/A.var", ty);
+ (UriManager.uri_of_string
+ "cic:/Coq/Init/Logic/Logic_lemmas/equality/x.var", x);
+ (UriManager.uri_of_string
+ "cic:/Coq/Init/Logic/Logic_lemmas/equality/y.var", y)]
+;;
+
+
let build_newtarget_time = ref 0.;;
let demod_counter = ref 1;;
-let rec demodulation newmeta env table target =
+let rec demodulation newmeta env table sign target =
let module C = Cic in
let module S = CicSubstitution in
let module M = CicMetaSubst in
let metasenv, context, ugraph = env in
let _, proof, (eq_ty, left, right, order), metas, args = target in
let metasenv' = metasenv @ metas in
+
+ let maxmeta = ref newmeta in
+
let build_newtarget is_left (t, subst, menv, ug, (eq_found, eq_URI)) =
let time1 = Unix.gettimeofday () in
let t' =
let name = C.Name ("x_Demod_" ^ (string_of_int !demod_counter)) in
incr demod_counter;
- let l, r = if is_left then bo, right else left, bo in
- (name, ty, eq_ty, l, r)
+ let l, r =
+ if is_left then t, S.lift 1 right else S.lift 1 left, t in
+ (name, ty, S.lift 1 eq_ty, l, r)
in
-(* let bo'' = *)
-(* C.Appl ([C.MutInd (HL.Logic.eq_URI, 0, []); *)
-(* S.lift 1 eq_ty] @ *)
-(* if is_left then [S.lift 1 bo; S.lift 1 right] *)
-(* else [S.lift 1 left; S.lift 1 bo]) *)
-(* in *)
-(* let t' = *)
-(* let name = C.Name ("x_Demod_" ^ (string_of_int !demod_counter)) in *)
-(* incr demod_counter; *)
-(* C.Lambda (name, ty, bo'') *)
-(* in *)
- bo,
- Inference.ProofBlock (subst, eq_URI, t', eq_found, target)
-(* (\* M. *\)apply_subst subst (C.Appl [C.Const (eq_URI, []); ty; what; t'; *)
-(* proof; other; proof']) *)
+ if sign = Utils.Positive then
+ (bo,
+ Inference.ProofBlock (subst, eq_URI, t', eq_found, proof))
+ else
+ let metaproof =
+ incr maxmeta;
+ let irl =
+ CicMkImplicit.identity_relocation_list_for_metavariable context in
+ Printf.printf "\nADDING META: %d\n" !maxmeta;
+ print_newline ();
+ C.Meta (!maxmeta, irl)
+ in
+ let target' =
+ let eq_found =
+ let proof' =
+ let ens =
+ if pos = Utils.Left then
+ build_ens_for_sym_eq ty what other
+ else
+ build_ens_for_sym_eq ty other what
+ in
+ Inference.ProofSymBlock (ens, proof')
+ in
+ let what, other =
+ if pos = Utils.Left then what, other else other, what
+ in
+ pos, (0, proof', (ty, other, what, Utils.Incomparable),
+ menv', args')
+ in
+ let target_proof =
+ let pb =
+ Inference.ProofBlock (subst, eq_URI, t', eq_found,
+ Inference.BasicProof metaproof)
+ in
+ match proof with
+ | Inference.BasicProof _ ->
+ print_endline "replacing a BasicProof";
+ pb
+ | Inference.ProofGoalBlock (_, parent_eq) ->
+ print_endline "replacing another ProofGoalBlock";
+ Inference.ProofGoalBlock (pb, parent_eq)
+ | _ -> assert false
+ in
+ (0, target_proof, (eq_ty, left, right, order), metas, args)
+ in
+ let refl =
+ C.Appl [C.MutConstruct (* reflexivity *)
+ (HelmLibraryObjects.Logic.eq_URI, 0, 1, []);
+ eq_ty; if is_left then right else left]
+ in
+ (bo,
+ Inference.ProofGoalBlock (Inference.BasicProof refl, target'))
in
let left, right = if is_left then newterm, right else left, newterm in
- let m =
- (Inference.metas_of_term left) @ (Inference.metas_of_term right)
- in
+ let m = (Inference.metas_of_term left) @ (Inference.metas_of_term right) in
let newmetasenv = List.filter (fun (i, _, _) -> List.mem i m) metas
and newargs =
List.filter
let w = Utils.compute_equality_weight eq_ty left right in
(w, newproof, (eq_ty, left, right, ordering), newmetasenv, newargs)
in
- newmeta, res
+(* if sign = Utils.Positive then ( *)
+(* let newm, res = Inference.fix_metas !maxmeta res in *)
+(* maxmeta := newm; *)
+(* !maxmeta, res *)
+(* ) else *)
+ !maxmeta(* newmeta *), res
in
-(* let build_newtarget = *)
-(* let profile = CicUtil.profile "Indexing.demodulation.build_newtarget" in *)
-(* (fun a b -> profile (build_newtarget a) b) *)
-(* in *)
let res = demodulate_term metasenv' context ugraph table 0 left in
(* let build_identity (w, p, (t, l, r, o), m, a) = *)
(* match o with *)
(* if subsumption env table newtarget then *)
(* newmeta, build_identity newtarget *)
(* else *)
- demodulation newmeta env table newtarget
+ demodulation newmeta env table sign newtarget
| None ->
let res = demodulate_term metasenv' context ugraph table 0 right in
match res with
(* if subsumption env table newtarget then *)
(* newmeta, build_identity newtarget *)
(* else *)
- demodulation newmeta env table newtarget
+ demodulation newmeta env table sign newtarget
| None ->
newmeta, target
;;
let sup_l_counter = ref 1;;
-let superposition_left (metasenv, context, ugraph) table target =
+let superposition_left newmeta (metasenv, context, ugraph) table target =
let module C = Cic in
let module S = CicSubstitution in
let module M = CicMetaSubst in
let module HL = HelmLibraryObjects in
let module CR = CicReduction in
let module U = Utils in
- let _, proof, (eq_ty, left, right, ordering), _, _ = target in
+ let weight, proof, (eq_ty, left, right, ordering), _, _ = target in
let expansions, _ =
let term = if ordering = U.Gt then left else right in
betaexpand_term metasenv context ugraph table 0 term
in
+ let maxmeta = ref newmeta in
let build_new (bo, s, m, ug, (eq_found, eq_URI)) =
+
+ print_endline "\nSUPERPOSITION LEFT\n";
+
let time1 = Unix.gettimeofday () in
let pos, (_, proof', (ty, what, other, _), menv', args') = eq_found in
let t' =
let name = C.Name ("x_SupL_" ^ (string_of_int !sup_l_counter)) in
incr sup_l_counter;
- let l, r = if ordering = U.Gt then bo', right else left, bo' in
- (name, ty, eq_ty, l, r)
+ let l, r =
+ if ordering = U.Gt then bo, S.lift 1 right else S.lift 1 left, bo in
+ (name, ty, S.lift 1 eq_ty, l, r)
in
(* let bo'' = *)
(* C.Appl ( *)
(* incr sup_l_counter; *)
(* C.Lambda (name, ty, bo'') *)
(* in *)
- bo',
- Inference.ProofBlock (s, eq_URI, t', eq_found, target)
-(* (\* M. *\)apply_subst s *)
-(* (C.Appl [C.Const (eq_URI, []); ty; what; t'; *)
-(* proof; other; proof']) *)
+ incr maxmeta;
+ let metaproof =
+ let irl =
+ CicMkImplicit.identity_relocation_list_for_metavariable context in
+ C.Meta (!maxmeta, irl)
+ in
+ let target' =
+ let eq_found =
+ let proof' =
+ let ens =
+ if pos = Utils.Left then
+ build_ens_for_sym_eq ty what other
+ else
+ build_ens_for_sym_eq ty other what
+ in
+ Inference.ProofSymBlock (ens, proof')
+ in
+ let what, other =
+ if pos = Utils.Left then what, other else other, what
+ in
+ pos, (0, proof', (ty, other, what, Utils.Incomparable), menv', args')
+ in
+ let target_proof =
+ let pb =
+ Inference.ProofBlock (s, eq_URI, t', eq_found,
+ Inference.BasicProof metaproof)
+ in
+ match proof with
+ | Inference.BasicProof _ ->
+ print_endline "replacing a BasicProof";
+ pb
+ | Inference.ProofGoalBlock (_, parent_eq) ->
+ print_endline "replacing another ProofGoalBlock";
+ Inference.ProofGoalBlock (pb, parent_eq)
+ | _ -> assert false
+ in
+ (weight, target_proof, (eq_ty, left, right, ordering), [], [])
+ in
+ let refl =
+ C.Appl [C.MutConstruct (* reflexivity *)
+ (HelmLibraryObjects.Logic.eq_URI, 0, 1, []);
+ eq_ty; if ordering = U.Gt then right else left]
+ in
+ (bo',
+ Inference.ProofGoalBlock (Inference.BasicProof refl, target'))
in
let left, right =
if ordering = U.Gt then newgoal, right else left, newgoal in
in
res
in
-(* let build_new = *)
-(* let profile = CicUtil.profile "Inference.superposition_left.build_new" in *)
-(* (fun e -> profile build_new e) *)
-(* in *)
- List.map build_new expansions
+ !maxmeta, List.map build_new expansions
;;
let t' =
let name = C.Name ("x_SupR_" ^ (string_of_int !sup_r_counter)) in
incr sup_r_counter;
- let l, r = if ordering = U.Gt then bo', right else left, bo' in
- (name, ty, eq_ty, l, r)
+ let l, r =
+ if ordering = U.Gt then bo, S.lift 1 right else S.lift 1 left, bo in
+ (name, ty, S.lift 1 eq_ty, l, r)
in
(* let bo'' = *)
(* C.Appl ( *)
(* C.Lambda (name, ty, bo'') *)
(* in *)
bo',
- Inference.ProofBlock (s, eq_URI, t', eq_found, target)
+ Inference.ProofBlock (s, eq_URI, t', eq_found, eqproof(* target *))
(* (\* M. *\)apply_subst s *)
(* (C.Appl [C.Const (eq_URI, []); ty; what; t'; *)
(* eqproof; other; proof']) *)