-let demodulate_tac ~dbd ((proof,goal)(*s initialstatus*)) =
- let curi,metasenv,pbo,pty = proof in
- let metano,context,ty = CicUtil.lookup_meta goal metasenv in
- let irl = CicMkImplicit.identity_relocation_list_for_metavariable context in
- let initgoal = [], [], ty in
- let eq_uri = eq_of_goal ty in
- let bag, equalities, cache, maxm =
- find_equalities dbd (proof,goal) false None AutoCache.cache_empty
- in
- let table =
- List.fold_left
- (fun tbl eq -> Indexing.index tbl eq)
- Indexing.empty equalities
- in
- let changed,(newproof,newmetasenv, newty) =
- Indexing.demodulation_goal bag
- (metasenv,context,CicUniv.empty_ugraph) table initgoal
- in
- if changed then
- begin
- let opengoal = Equality.Exact (Cic.Meta(maxm,irl)) in
- let proofterm,_ =
- Equality.build_goal_proof bag
- eq_uri newproof opengoal ty [] context metasenv
- in
- let extended_metasenv = (maxm,context,newty)::metasenv in
- let extended_status =
- (curi,extended_metasenv,pbo,pty),goal in
- let (status,newgoals) =
- ProofEngineTypes.apply_tactic
- (PrimitiveTactics.apply_tac ~term:proofterm)
- extended_status in
- (status,maxm::newgoals)
- end
- else (* if newty = ty then *)
- raise (ProofEngineTypes.Fail (lazy "no progress"))
- (*else ProofEngineTypes.apply_tactic
- (ReductionTactics.simpl_tac
- ~pattern:(ProofEngineTypes.conclusion_pattern None)) initialstatus*)
-;;
-
-let demodulate_tac ~dbd = ProofEngineTypes.mk_tactic (demodulate_tac ~dbd);;
-
-let rec find_in_ctx i name = function
- | [] -> raise (ProofEngineTypes.Fail (lazy ("Hypothesis not found: " ^ name)))
- | Some (Cic.Name name', _)::tl when name = name' -> i
- | _::tl -> find_in_ctx (i+1) name tl
-;;
-
-let rec position_of i x = function
- | [] -> assert false
- | j::tl when j <> x -> position_of (i+1) x tl
- | _ -> i
-;;
-
-(* Syntax:
- * auto superposition target = NAME
- * [table = NAME_LIST] [demod_table = NAME_LIST] [subterms_only]
- *
- * - if table is omitted no superposition will be performed
- * - if demod_table is omitted no demodulation will be prformed
- * - subterms_only is passed to Indexing.superposition_right
- *
- * lists are coded using _ (example: H_H1_H2)
- *)
-
-let superposition_tac ~target ~table ~subterms_only ~demod_table status =
- reset_refs();
- let proof,goalno = status in
- let curi,metasenv,pbo,pty = proof in
- let metano,context,ty = CicUtil.lookup_meta goalno metasenv in
- let eq_uri,tty = eq_and_ty_of_goal ty in
- let env = (metasenv, context, CicUniv.empty_ugraph) in
- let names = Utils.names_of_context context in
- let bag = Equality.mk_equality_bag () in
- let eq_index, equalities, maxm,cache =
- Equality_retrieval.find_context_equalities 0 bag None context proof AutoCache.cache_empty
- in
- let eq_what =
- let what = find_in_ctx 1 target context in
- List.nth equalities (position_of 0 what eq_index)
- in
- let eq_other =
- if table <> "" then
- let other =
- let others = Str.split (Str.regexp "_") table in
- List.map (fun other -> find_in_ctx 1 other context) others
- in
- List.map
- (fun other -> List.nth equalities (position_of 0 other eq_index))
- other
- else
- []
- in
- let index = List.fold_left Indexing.index Indexing.empty eq_other in
- let maxm, eql =
- if table = "" then maxm,[eq_what] else
- Indexing.superposition_right bag
- ~subterms_only eq_uri maxm env index eq_what
- in
- prerr_endline ("Superposition right:");
- prerr_endline ("\n eq: " ^ Equality.string_of_equality eq_what ~env);
- prerr_endline ("\n table: ");
- List.iter (fun e -> prerr_endline (" " ^ Equality.string_of_equality e ~env)) eq_other;
- prerr_endline ("\n result: ");
- List.iter (fun e -> prerr_endline (Equality.string_of_equality e ~env)) eql;
- prerr_endline ("\n result (cut&paste): ");
- List.iter
- (fun e ->
- let t = Equality.term_of_equality eq_uri e in
- prerr_endline (CicPp.pp t names))
- eql;
- prerr_endline ("\n result proofs: ");
- List.iter (fun e ->
- prerr_endline (let _,p,_,_,_ = Equality.open_equality e in
- let s = match p with Equality.Exact _ -> Subst.empty_subst | Equality.Step (s,_) -> s in
- Subst.ppsubst s ^ "\n" ^
- CicPp.pp (Equality.build_proof_term bag eq_uri [] 0 p) names)) eql;
- if demod_table <> "" then
- begin
- let eql =
- if eql = [] then [eq_what] else eql
- in
- let demod =
- let demod = Str.split (Str.regexp "_") demod_table in
- List.map (fun other -> find_in_ctx 1 other context) demod
- in
- let eq_demod =
- List.map
- (fun demod -> List.nth equalities (position_of 0 demod eq_index))
- demod
- in
- let table = List.fold_left Indexing.index Indexing.empty eq_demod in
- let maxm,eql =
- List.fold_left
- (fun (maxm,acc) e ->
- let maxm,eq =
- Indexing.demodulation_equality bag eq_uri maxm env table e
- in
- maxm,eq::acc)
- (maxm,[]) eql
- in
- let eql = List.rev eql in
- prerr_endline ("\n result [demod]: ");
- List.iter
- (fun e -> prerr_endline (Equality.string_of_equality e ~env)) eql;
- prerr_endline ("\n result [demod] (cut&paste): ");
- List.iter
- (fun e ->
- let t = Equality.term_of_equality eq_uri e in
- prerr_endline (CicPp.pp t names))
- eql;
- end;
- proof,[goalno]
-;;
-
-let get_stats () = ""
-(*
- <:show<Saturation.>> ^ Indexing.get_stats () ^ Founif.get_stats () ^
- Equality.get_stats ()
-;;
-*)
-
-(* THINGS USED ONLY BY saturate_main.ml *)
-
-let main _ _ _ _ _ = () ;;
-
-let retrieve_and_print dbd term metasenv ugraph =
- let module C = Cic in
- let module T = CicTypeChecker in
- let module PET = ProofEngineTypes in
- let module PP = CicPp in
- let proof = None, (1, [], term)::metasenv, C.Meta (1, []), term in
- let status = PET.apply_tactic (PrimitiveTactics.intros_tac ()) (proof, 1) in
- let proof, goals = status in
- let goal' = List.nth goals 0 in
- let uri, metasenv, meta_proof, term_to_prove = proof in
- let _, context, type_of_goal = CicUtil.lookup_meta goal' metasenv in
- let eq_uri = eq_of_goal type_of_goal in
- let bag = Equality.mk_equality_bag () in
- let eq_indexes, equalities, maxm,cache =
- Equality_retrieval.find_context_equalities 0 bag None context proof AutoCache.cache_empty in
- let ugraph = CicUniv.empty_ugraph in
- let env = (metasenv, context, ugraph) in
- let t1 = Unix.gettimeofday () in
- let lib_eq_uris, library_equalities, maxm, cache =
- Equality_retrieval.find_library_equalities bag None
- false dbd context (proof, goal') (maxm+2) cache
- in
- let t2 = Unix.gettimeofday () in
- maxmeta := maxm+2;
- let equalities = (* equalities @ *) library_equalities in
- Utils.debug_print
- (lazy
- (Printf.sprintf "\n\nequalities:\n%s\n"
- (String.concat "\n"
- (List.map
- (fun (u, e) ->
-(* Printf.sprintf "%s: %s" *)
- (UriManager.string_of_uri u)
-(* (string_of_equality e) *)
- )
- equalities))));
- Utils.debug_print (lazy "RETR: SIMPLYFYING EQUALITIES...");
- let rec simpl e others others_simpl =
- let (u, e) = e in
- let active = (others @ others_simpl) in
- let tbl =
- List.fold_left
- (fun t (_, e) -> Indexing.index t e)
- Indexing.empty active
- in
- let res = forward_simplify bag eq_uri env e (active, tbl) in
- match others with
- | hd::tl -> (
- match res with
- | None -> simpl hd tl others_simpl
- | Some e -> simpl hd tl ((u, e)::others_simpl)
- )
- | [] -> (
- match res with
- | None -> others_simpl
- | Some e -> (u, e)::others_simpl
- )
- in
- let _equalities =
- match equalities with
- | [] -> []
- | hd::tl ->
- let others = tl in (* List.map (fun e -> (Utils.Positive, e)) tl in *)
- let res =
- List.rev (simpl (*(Positive,*) hd others [])
- in
- Utils.debug_print
- (lazy
- (Printf.sprintf "\nequalities AFTER:\n%s\n"
- (String.concat "\n"
- (List.map
- (fun (u, e) ->
- Printf.sprintf "%s: %s"
- (UriManager.string_of_uri u)
- (Equality.string_of_equality e)
- )
- res))));
- res in
- Utils.debug_print
- (lazy
- (Printf.sprintf "Time to retrieve equalities: %.9f\n" (t2 -. t1)))
-;;
-
-
-let main_demod_equalities dbd term metasenv ugraph =
- let module C = Cic in
- let module T = CicTypeChecker in
- let module PET = ProofEngineTypes in
- let module PP = CicPp in
- let proof = None, (1, [], term)::metasenv, C.Meta (1, []), term in
- let status = PET.apply_tactic (PrimitiveTactics.intros_tac ()) (proof, 1) in
- let proof, goals = status in
- let goal' = List.nth goals 0 in
- let _, metasenv, meta_proof, _ = proof in
- let _, context, goal = CicUtil.lookup_meta goal' metasenv in
- let eq_uri = eq_of_goal goal in
- let bag = Equality.mk_equality_bag () in
- let eq_indexes, equalities, maxm, cache =
- Equality_retrieval.find_context_equalities 0 bag None context proof AutoCache.cache_empty in
- let lib_eq_uris, library_equalities, maxm,cache =
- Equality_retrieval.find_library_equalities bag None
- false dbd context (proof, goal') (maxm+2) cache
- in
- let library_equalities = List.map snd library_equalities in
- maxmeta := maxm+2; (* TODO ugly!! *)
- let irl = CicMkImplicit.identity_relocation_list_for_metavariable context in
- let new_meta_goal, metasenv, type_of_goal =
- let _, context, ty = CicUtil.lookup_meta goal' metasenv in
- Utils.debug_print
- (lazy
- (Printf.sprintf "\n\nTRYING TO INFER EQUALITIES MATCHING: %s\n\n"
- (CicPp.ppterm ty)));
- Cic.Meta (maxm+1, irl),
- (maxm+1, context, ty)::metasenv,
- ty
- in
- let env = (metasenv, context, ugraph) in
- (*try*)
- let goal = [], [], goal
- in
- let equalities =
- simplify_equalities bag eq_uri env (equalities@library_equalities)
- in
- let active = make_empty_active () in
- let passive = make_passive equalities in
- Printf.eprintf "\ncontext:\n%s\n" (PP.ppcontext context);
- Printf.eprintf "\nmetasenv:\n%s\n" (Utils.print_metasenv metasenv);
- Printf.eprintf "\nequalities:\n%s\n"
- (String.concat "\n"
- (List.map
- (Equality.string_of_equality ~env) equalities));
- prerr_endline "--------------------------------------------------";
- prerr_endline "GO!";
- start_time := Unix.gettimeofday ();
- if !time_limit < 1. then time_limit := 60.;
- let ra, rp =
- saturate_equations bag eq_uri env goal (fun e -> true) passive active
- in
-
- let initial =
- List.fold_left (fun s e -> EqualitySet.add e s)
- EqualitySet.empty equalities
- in
- let addfun s e =
- if not (EqualitySet.mem e initial) then EqualitySet.add e s else s
- in
-
- let passive =
- match rp with
- | p, _ ->
- EqualitySet.elements (List.fold_left addfun EqualitySet.empty p)
- in
- let active =
- let l = fst ra in
- EqualitySet.elements (List.fold_left addfun EqualitySet.empty l)
- in
- Printf.eprintf "\n\nRESULTS:\nActive:\n%s\n\nPassive:\n%s\n"
- (String.concat "\n" (List.map (Equality.string_of_equality ~env) active))
- (* (String.concat "\n"
- (List.map (fun e -> CicPp.ppterm (term_of_equality e)) active)) *)
-(* (String.concat "\n" (List.map (string_of_equality ~env) passive)); *)
- (String.concat "\n"
- (List.map
- (fun e -> CicPp.ppterm (Equality.term_of_equality eq_uri e))
- passive));
- print_newline ();
-(*
- with e ->
- Utils.debug_print (lazy ("EXCEPTION: " ^ (Printexc.to_string e)))
-*)
-;;
-let saturate_equations eq_uri env goal accept_fun passive active =
- let bag = Equality.mk_equality_bag () in
- saturate_equations bag eq_uri env goal accept_fun passive active
-;;
-