* 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
~continuation:just
)
| Some id ->
- let continuation =
+ let ty',continuation =
match ty' with
- None -> Tacticals.id_tac
+ None -> ty,just
| Some ty' ->
- Tactics.change ~pattern:(None,[id,Cic.Implicit (Some `Hole)],None)
- (fun _ metasenv ugraph -> ty',metasenv,ugraph)
+ ty',
+ Tacticals.then_
+ ~start:
+ (Tactics.change
+ ~with_cast:true
+ ~pattern:(None,[id,Cic.Implicit (Some `Hole)],None)
+ (fun _ metasenv ugraph -> ty,metasenv,ugraph))
+ ~continuation:just
in
Tacticals.thens
~start:
- (Tactics.cut ty
+ (Tactics.cut ty'
~mk_fresh_name_callback:(fun _ _ _ ~typ -> Cic.Name id))
- ~continuations:[ continuation ; just ]
+ ~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 t id1 t1 id2 t2 =
-(*BUG: t1 and t2 not used *)
-(*PARSING BUG: t2 is parsed in the current context, but it may
- have occurrences of id1 in it *)
- 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 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
+ let t2, metasenv, _ = t2 (Some (Cic.Name id1, Cic.Decl t1) :: context) metasenv CicUniv.oblivion_ugraph in
+ let proof' = (n,metasenv,_subst,bo,ty,attrs) in
+ ProofEngineTypes.apply_tactic (
+ Tacticals.thens
+ ~start:(Tactics.cut (Cic.Appl [Cic.MutInd (UriManager.uri_of_string "cic:/matita/logic/connectives/ex.ind", 0, []); t1 ; Cic.Lambda (Cic.Name id1, 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)
+ ]) (proof', goal)
+ in
+ ProofEngineTypes.mk_tactic aux
+;;
-let andelim = existselim;;
+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 conclude =
+let rewritingstep ~dbd ~automation_cache lhs rhs just last_step =
let aux ((proof,goal) as status) =
- let (curi,metasenv,proofbo,proofty) = proof in
- let _,context,_ = CicUtil.lookup_meta goal metasenv in
+ let (curi,metasenv,_subst,proofbo,proofty, attrs) = proof in
+ let _,context,gty = CicUtil.lookup_meta goal metasenv in
let eq,trans =
match LibraryObjects.eq_URI () with
None -> raise (ProofEngineTypes.Fail (lazy "You need to register the default equality first. Please use the \"default\" command"))
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
- None ->
- Tactics.auto ~dbd ~params:["paramodulation","1"; "timeout","3"] ~universe
- | Some just -> Tactics.apply just
+ `Auto (univ, params) ->
+ let params =
+ if not (List.exists (fun (k,_) -> k = "timeout") params) then
+ ("timeout","3")::params
+ else params
+ in
+ let params' =
+ if not (List.exists (fun (k,_) -> k = "paramodulation") params) then
+ ("paramodulation","1")::params
+ else params
+ in
+ if params = params' then
+ Tactics.auto ~dbd ~params:(univ, params) ~automation_cache
+ else
+ Tacticals.first
+ [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
- match lhs with
- None ->
- let plhs,prhs =
- match
- fst
- (CicTypeChecker.type_of_aux' metasenv context (Cic.Rel 1)
- CicUniv.empty_ugraph)
- with
- Cic.Appl [_;_;plhs;prhs] -> plhs,prhs
- | _ -> assert false in
- let last_hyp_name =
- match context with
- (Some (Cic.Name id,_))::_ -> id
- | _ -> assert false
- in
- (match conclude with
- None ->
- ProofEngineTypes.apply_tactic
- (Tacticals.thens
- ~start:(Tactics.apply ~term:trans)
- ~continuations:
- [ Tactics.apply prhs ;
- Tactics.apply (Cic.Rel 1) ;
- just]) status
- | Some name ->
- let mk_fresh_name_callback =
- fun metasenv context _ ~typ ->
- FreshNamesGenerator.mk_fresh_name ~subst:[]
- metasenv context name ~typ
- in
- ProofEngineTypes.apply_tactic
- (Tacticals.thens
- ~start:(Tactics.cut ~mk_fresh_name_callback
- (Cic.Appl [eq ; ty ; plhs ; rhs]))
- ~continuations:
- [ Tactics.clear ~hyps:[last_hyp_name] ;
- Tacticals.thens
- ~start:(Tactics.apply ~term:trans)
- ~continuations:
- [ Tactics.apply prhs ;
- Tactics.apply (Cic.Rel 1) ;
- just]
- ]) status)
- | Some lhs ->
- match conclude with
- None -> ProofEngineTypes.apply_tactic just status
- | Some name ->
+ let plhs,prhs,prepare =
+ match lhs with
+ None ->
+ let plhs,prhs =
+ match gty with
+ Cic.Appl [_;_;plhs;prhs] -> plhs,prhs
+ | _ -> assert false
+ in
+ plhs,prhs,
+ (fun continuation ->
+ ProofEngineTypes.apply_tactic continuation status)
+ | Some (None,lhs) ->
+ let plhs,prhs =
+ match gty with
+ Cic.Appl [_;_;plhs;prhs] -> plhs,prhs
+ | _ -> assert false
+ in
+ (*CSC: manca check plhs convertibile con lhs *)
+ plhs,prhs,
+ (fun continuation ->
+ ProofEngineTypes.apply_tactic continuation status)
+ | Some (Some name,lhs) ->
+ let newmeta = CicMkImplicit.new_meta metasenv [] in
+ let irl =
+ CicMkImplicit.identity_relocation_list_for_metavariable context in
+ let plhs = lhs in
+ let prhs = Cic.Meta(newmeta,irl) in
+ plhs,prhs,
+ (fun continuation ->
+ let metasenv = (newmeta, context, ty)::metasenv in
let mk_fresh_name_callback =
- fun metasenv context _ ~typ ->
- FreshNamesGenerator.mk_fresh_name ~subst:[]
- metasenv context name ~typ
+ fun metasenv context _ ~typ ->
+ FreshNamesGenerator.mk_fresh_name ~subst:[] metasenv context
+ (Cic.Name name) ~typ
in
+ let proof = curi,metasenv,_subst,proofbo,proofty, attrs in
+ let proof,goals =
ProofEngineTypes.apply_tactic
(Tacticals.thens
- ~start:
- (Tactics.cut ~mk_fresh_name_callback
- (Cic.Appl [eq ; ty ; lhs ; rhs]))
- ~continuations:[ Tacticals.id_tac ; just ]) status
+ ~start:(Tactics.cut ~mk_fresh_name_callback
+ (Cic.Appl [eq ; ty ; lhs ; prhs]))
+ ~continuations:[Tacticals.id_tac ; continuation]) (proof,goal)
+ in
+ let goals =
+ 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'
+ else
+ Tacticals.thens
+ ~start:(Tactics.apply ~term:(Cic.Appl [trans;ty;plhs;rhs;prhs]))
+ ~continuations:[just' ; Tacticals.id_tac]
+ in
+ prepare continuation
in
ProofEngineTypes.mk_tactic aux
;;
-let we_proceed_by_induction_on t pat =
+let we_proceed_by_cases_on t pat =
(*BUG here: pat unused *)
- Tactics.elim_intros ~depth:0 t
+ Tactics.cases_intros t
+;;
+
+let we_proceed_by_induction_on t pat =
+(* let pattern = None, [], Some pat in *)
+ Tactics.elim_intros ~depth:0 (*~pattern*) t
;;
let case id ~params =
let thesisbecomes t =
let ty = None in
- (*BUG here: missing check on t *)
match ty with
- None -> Tacticals.id_tac
+ None ->
+ Tactics.change ~pattern:(None,[],Some (Cic.Implicit (Some `Hole)))
+ (fun _ metasenv ugraph -> t,metasenv,ugraph)
| Some ty ->
+ (*BUG here: missing check on t *)
Tactics.change ~pattern:(None,[],Some (Cic.Implicit (Some `Hole)))
(fun _ metasenv ugraph -> ty,metasenv,ugraph)
;;