* http://cs.unibo.it/helm/.
*)
+type just = [ `Term of Cic.term | `Auto of Auto.auto_params ]
+
+let mk_just ~dbd ~automation_cache =
+ function
+ `Auto (l,params) ->
+ Tactics.auto ~dbd
+ ~params:(l,("skip_trie_filtering","1")::(*("skip_context","1")::*)params) ~automation_cache
+ | `Term t -> Tactics.apply t
+;;
+
let assume id t =
Tacticals.then_
~start:
(fun _ metasenv ugraph -> ty,metasenv,ugraph))
;;
-let by_term_we_proved ~dbd ~universe t ty id ty' =
- let just =
- match t with
- None -> Tactics.auto ~dbd ~params:[] ~universe
- | Some t -> Tactics.apply t
- in
+let by_just_we_proved ~dbd ~automation_cache just ty id ty' =
+ let just = mk_just ~dbd ~automation_cache just in
match id with
None ->
(match ty' with
~continuations:[ Tacticals.id_tac ; continuation ]
;;
-let bydone ~dbd ~universe t =
- let just =
- match t with
- None -> Tactics.auto ~dbd ~params:[] ~universe
- | Some t -> Tactics.apply t
- in
- just
+let bydone ~dbd ~automation_cache just =
+ mk_just ~dbd ~automation_cache just
;;
let we_need_to_prove t id ty =
ProofEngineTypes.mk_tactic aux
;;
-let existselim ~dbd ~universe t id1 t1 id2 t2 =
+let existselim ~dbd ~automation_cache just id1 t1 id2 t2 =
let aux (proof, goal) =
let (n,metasenv,_subst,bo,ty,attrs) = proof in
let metano,context,_ = CicUtil.lookup_meta goal metasenv in
fun _ _ _ ~typ ->
incr i;
if !i = 1 then Cic.Name id1 else Cic.Name id2) ;
- (match t with
- None -> Tactics.auto ~dbd ~params:[] ~universe
- | Some t -> Tactics.apply t)
+ (mk_just ~dbd ~automation_cache just)
]) (proof', goal)
in
ProofEngineTypes.mk_tactic aux
;;
-let andelim t id1 t1 id2 t2 =
- Tactics.elim_intros t
- ~mk_fresh_name_callback:
- (let i = ref 0 in
- fun _ _ _ ~typ ->
- incr i;
- if !i = 1 then Cic.Name id1 else Cic.Name id2)
+let andelim ~dbd ~automation_cache just id1 t1 id2 t2 =
+ Tacticals.thens
+ ~start:(Tactics.cut (Cic.Appl [Cic.MutInd (UriManager.uri_of_string "cic:/matita/logic/connectives/And.ind", 0, []); t1 ; t2]))
+ ~continuations:
+ [ Tactics.elim_intros (Cic.Rel 1)
+ ~mk_fresh_name_callback:
+ (let i = ref 0 in
+ fun _ _ _ ~typ ->
+ incr i;
+ if !i = 1 then Cic.Name id1 else Cic.Name id2) ;
+ (mk_just ~dbd ~automation_cache just) ]
+;;
-let rewritingstep ~dbd ~universe lhs rhs just last_step =
+let rewritingstep ~dbd ~automation_cache lhs rhs just last_step =
let aux ((proof,goal) as status) =
let (curi,metasenv,_subst,proofbo,proofty, attrs) = proof in
let _,context,gty = CicUtil.lookup_meta goal metasenv in
Cic.MutInd (uri,0,[]), Cic.Const (LibraryObjects.trans_eq_URI ~eq:uri,[])
in
let ty,_ =
- CicTypeChecker.type_of_aux' metasenv context rhs CicUniv.empty_ugraph in
- let just =
+ CicTypeChecker.type_of_aux' metasenv context rhs CicUniv.oblivion_ugraph in
+ let just' =
match just with
- `Auto params ->
+ `Auto (univ, params) ->
let params =
if not (List.exists (fun (k,_) -> k = "timeout") params) then
("timeout","3")::params
else params
in
if params = params' then
- Tactics.auto ~dbd ~params ~universe
+ Tactics.auto ~dbd ~params:(univ, params) ~automation_cache
else
Tacticals.first
- [Tactics.auto ~dbd ~params ~universe ;
- Tactics.auto ~dbd ~params:params' ~universe]
- | `Term just ->
- let ty,_ =
- CicTypeChecker.type_of_aux' metasenv context just
- CicUniv.empty_ugraph
- in
- Tactics.solve_rewrite
- ~universe:(Universe.index Universe.empty
- (Universe.key ty) just) ~steps:1 ()
- (* Tactics.apply just *)
+ [Tactics.auto ~dbd ~params:(univ, params) ~automation_cache ;
+ Tactics.auto ~dbd ~params:(univ, params') ~automation_cache]
+ | `Term just -> Tactics.apply just
+ | `SolveWith term ->
+ Tactics.demodulate ~automation_cache ~dbd
+ ~params:(Some [term],
+ ["all","1";"steps","1"; "use_context","false"])
| `Proof ->
Tacticals.id_tac
in
~continuations:[Tacticals.id_tac ; continuation]) (proof,goal)
in
let goals =
- match goals with
- [g1;g2] -> [g2;newmeta;g1]
- | _ -> assert false
+ match just,goals with
+ `Proof, [g1;g2;g3] -> [g2;g3;newmeta;g1]
+ | _, [g1;g2] -> [g2;newmeta;g1]
+ | _, l ->
+ prerr_endline (String.concat "," (List.map string_of_int l));
+ prerr_endline (CicMetaSubst.ppmetasenv [] metasenv);
+ assert false
in
proof,goals)
in
let continuation =
if last_step then
(*CSC:manca controllo sul fatto che rhs sia convertibile con prhs*)
- just
+ just'
else
Tacticals.thens
~start:(Tactics.apply ~term:(Cic.Appl [trans;ty;plhs;rhs;prhs]))
- ~continuations:[just ; Tacticals.id_tac]
+ ~continuations:[just' ; Tacticals.id_tac]
in
prepare continuation
in
;;
let we_proceed_by_induction_on t pat =
- let pattern = None, [], Some pat in
+(* let pattern = None, [], Some pat in *)
Tactics.elim_intros ~depth:0 (*~pattern*) t
;;