1 (* Copyright (C) 2002, HELM Team.
3 * This file is part of HELM, an Hypertextual, Electronic
4 * Library of Mathematics, developed at the Computer Science
5 * Department, University of Bologna, Italy.
7 * HELM is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
12 * HELM is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with HELM; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
22 * For details, see the HELM World-Wide-Web page,
23 * http://cs.unibo.it/helm/.
28 module PET = ProofEngineTypes
32 let clearbody (proof, goal) =
33 let curi,metasenv,_subst,pbo,pty, attrs = proof in
34 let metano,_,_ = CicUtil.lookup_meta goal metasenv in
43 (m,canonical_context,ty) when m = metano ->
44 let canonical_context' =
48 Some (C.Name hyp',C.Def (term,ty)) when hyp = hyp' ->
55 (CicTypeChecker.type_of_aux' metasenv context term
56 CicUniv.empty_ugraph) (* TASSI: FIXME *)
58 Some (C.Name hyp, Cic.Decl ty)
60 cleared_entry::context
61 | None -> None::context
63 | Some (n,C.Def (t,None)) ->
66 CicTypeChecker.type_of_aux' metasenv context t
67 CicUniv.empty_ugraph (* TASSI: FIXME *)
72 (lazy ("The correctness of hypothesis " ^
74 " relies on the body of " ^ hyp)
78 | Some (_,Cic.Def (_,Some _)) -> assert false
79 ) canonical_context []
83 CicTypeChecker.type_of_aux' metasenv canonical_context' ty
84 CicUniv.empty_ugraph (* TASSI: FIXME *)
89 (lazy ("The correctness of the goal relies on the body of " ^
92 m,canonical_context',ty
96 (curi,metasenv',_subst,pbo,pty, attrs), [goal]
98 PET.mk_tactic clearbody
101 let clear_one (proof, goal) =
102 let curi,metasenv,_subst,pbo,pty, attrs = proof in
103 let metano,context,ty =
104 CicUtil.lookup_meta goal metasenv
114 (m,canonical_context,ty) when m = metano ->
115 let context_changed, canonical_context' =
117 (fun entry (b, context) ->
119 Some (Cic.Name hyp',_) when hyp' = hyp ->
120 (true, None::context)
121 | None -> (b, None::context)
123 | Some (n,Cic.Def (t,Some _))
124 | Some (n,C.Def (t,None)) ->
128 CicTypeChecker.type_of_aux' metasenv context t
133 (lazy ("Hypothesis " ^ string_of_name n ^
134 " uses hypothesis " ^ hyp)))
139 ) canonical_context (false, [])
141 if not context_changed then
142 raise (PET.Fail (lazy ("Hypothesis " ^ hyp ^ " does not exist")));
145 CicTypeChecker.type_of_aux' metasenv canonical_context' ty
148 raise (PET.Fail (lazy ("Hypothesis " ^ hyp ^ " occurs in the goal")))
150 m,canonical_context',ty
154 (curi,metasenv',_subst,pbo,pty, attrs), [goal]
156 PET.mk_tactic clear_one
161 match PET.apply_tactic (clear_one ~hyp) status with
162 | proof, [g] -> proof, g
163 | _ -> raise (PET.Fail (lazy "clear: internal error"))
165 let proof, g = List.fold_left aux status hyps in
170 (* Warning: this tactic has no effect on the proof term.
171 It just changes the name of an hypothesis in the current sequent *)
172 let rename ~froms ~tos =
173 let rename (proof, goal) =
174 let error = "rename: lists of different length" in
176 try List.combine froms tos
177 with Invalid_argument _ -> raise (PET.Fail (lazy error))
179 let curi, metasenv, _subst, pbo, pty, attrs = proof in
180 let metano, _, _ = CicUtil.lookup_meta goal metasenv in
181 let rename_map = function
182 | Some (Cic.Name hyp, decl_or_def) as entry ->
183 begin try Some (Cic.Name (List.assoc hyp assocs), decl_or_def)
184 with Not_found -> entry end
188 | m, canonical_context, ty when m = metano ->
189 let canonical_context = List.map rename_map canonical_context in
190 m, canonical_context, ty
191 | conjecture -> conjecture
193 let metasenv = List.map map metasenv in
194 (curi, metasenv, _subst, pbo, pty, attrs), [goal]