| Thesisbecomes (_, term) -> "the thesis becomes " ^ term_pp term
| ExistsElim (_, term0, ident, term, ident1, term1) -> "by " ^ term_pp term0 ^ "let " ^ ident ^ ":" ^ term_pp term ^ "such that " ^ term_pp term1 ^ "(" ^ ident1 ^ ")"
| AndElim (_, term, ident1, term1, ident2, term2) -> "by " ^ term_pp term ^ "we have " ^ term_pp term1 ^ " (" ^ ident1 ^ ") " ^ "and " ^ term_pp term2 ^ " (" ^ ident2 ^ ")"
- | RewritingStep (_, term, term1, term2, cont) -> (match term with None -> " " | Some term -> "obtain " ^ term_pp term) ^ "=" ^ term_pp term1 ^ (match term2 with `Auto params -> "_" ^ String.concat " " (List.map (fun (k,v) -> if v <> "" then k ^ "=" ^ v else k) params) | `Term term2 -> term_pp term2) ^ (match cont with None -> " done" | Some Cic.Anonymous -> "" | Some (Cic.Name id) -> " we proved " ^ id)
+ | RewritingStep (_, term, term1, term2, cont) -> (match term with None -> " " | Some (None,term) -> "conclude " ^ term_pp term | Some (Some name,term) -> "obtain (" ^ name ^ ") " ^ term_pp term) ^ "=" ^ term_pp term1 ^ (match term2 with `Auto params -> "_" ^ String.concat " " (List.map (fun (k,v) -> if v <> "" then k ^ "=" ^ v else k) params) | `Term term2 -> term_pp term2) ^ (if cont then " done" else "")
| Case (_, id, args) ->
"case" ^ id ^
String.concat " "
| IDENT "case" ; id = IDENT ; params=LIST0[LPAREN ; i=IDENT ;
SYMBOL":" ; t=tactic_term ; RPAREN -> i,t] ->
GrafiteAst.Case(loc,id,params)
- | IDENT "obtain" ; termine=tactic_term ; SYMBOL "=" ; t1=tactic_term ; IDENT "by" ; t2=[ t=tactic_term -> `Term t | SYMBOL "_" ; params = auto_params' -> `Auto params ] ; cont=rewriting_step_continuation ->
- GrafiteAst.RewritingStep(loc, Some termine, t1, t2, cont)
+ | start=[IDENT "conclude" -> None | IDENT "obtain" ; name = IDENT -> Some name] ; termine=tactic_term ; SYMBOL "=" ; t1=tactic_term ; IDENT "by" ; t2=[ t=tactic_term -> `Term t | SYMBOL "_" ; params = auto_params' -> `Auto params ] ; cont=rewriting_step_continuation ->
+ GrafiteAst.RewritingStep(loc, Some (start,termine), t1, t2, cont)
| SYMBOL "=" ; t1=tactic_term ; IDENT "by" ; t2=[ t=tactic_term -> `Term t | SYMBOL "_" ; params = auto_params' -> `Auto params ] ;
cont=rewriting_step_continuation ->
GrafiteAst.RewritingStep(loc, None, t1, t2, cont)
]
];
rewriting_step_continuation : [
- [ IDENT "done" -> None
- | IDENT "we" ; IDENT "proved" ; id=IDENT -> Some (Cic.Name id)
- | -> Some Cic.Anonymous
+ [ IDENT "done" -> true
+ | -> false
]
];
atomic_tactical:
let andelim = existselim;;
-let rewritingstep ~dbd ~universe lhs rhs just conclude =
+let rewritingstep ~dbd ~universe 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 _,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"))
Tactics.auto ~dbd ~params ~universe
| `Term just -> Tactics.apply just
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) ;
- Tacticals.then_
- ~start:(Tactics.clear ~hyps:[last_hyp_name])
- ~continuation: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) ;
- Tacticals.then_
- ~start:(Tactics.clear ~hyps:[last_hyp_name])
- ~continuation: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,proofbo,proofty 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 goals with
+ [g1;g2] -> [g2;newmeta;g1]
+ | _ -> 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
;;