~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 existselim ~dbd ~universe t id1 t1 id2 t2 =
let aux (proof, goal) =
- let (n,metasenv,bo,ty,attrs) = proof in
+ 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,bo,ty,attrs) 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)]))
let rewritingstep ~dbd ~universe lhs rhs just last_step =
let aux ((proof,goal) as status) =
- let (curi,metasenv,proofbo,proofty, attrs) = proof 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
in
let ty,_ =
CicTypeChecker.type_of_aux' metasenv context rhs CicUniv.empty_ugraph in
- let just =
+ let just' =
match just with
`Auto params ->
- let params =
- if not (List.exists (fun (k,_) -> k = "paramodulation") params) then
- ("paramodulation","1")::params
- else params in
let params =
if not (List.exists (fun (k,_) -> k = "timeout") params) then
("timeout","3")::params
else params
in
- Tactics.auto ~dbd ~params ~universe
- | `Term just -> Tactics.apply just
+ 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 ~universe
+ 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 *)
+ | `Proof ->
+ Tacticals.id_tac
in
let plhs,prhs,prepare =
match lhs with
FreshNamesGenerator.mk_fresh_name ~subst:[] metasenv context
(Cic.Name name) ~typ
in
- let proof = curi,metasenv,proofbo,proofty, attrs in
+ let proof = curi,metasenv,_subst,proofbo,proofty, attrs in
let proof,goals =
ProofEngineTypes.apply_tactic
(Tacticals.thens
~continuations:[Tacticals.id_tac ; continuation]) (proof,goal)
in
let goals =
- match goals with
- [g1;g2] -> [g2;newmeta;g1]
+ match just,goals with
+ `Proof, [g1;g2;g3] -> [g2;g3;newmeta;g1]
+ | _, [g1;g2] -> [g2;newmeta;g1]
| _ -> assert false
in
proof,goals)
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 =
- (*BUG here: pat unused *)
- Tactics.elim_intros ~depth:0 t
+ let pattern = None, [], Some pat in
+ Tactics.elim_intros ~depth:0 (*~pattern*) t
;;
let case id ~params =