]> matita.cs.unibo.it Git - helm.git/blob - helm/ocaml/tactics/reductionTactics.ml
paths trough terms implemented with a nice hack :)
[helm.git] / helm / ocaml / tactics / reductionTactics.ml
1 (* Copyright (C) 2002, HELM Team.
2  * 
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.
6  * 
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.
11  * 
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.
16  *
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,
20  * MA  02111-1307, USA.
21  * 
22  * For details, see the HELM World-Wide-Web page,
23  * http://cs.unibo.it/helm/.
24  *)
25
26 open ProofEngineTypes
27
28 (*
29 let reduction_tac ~reduction (proof,goal) =
30  let curi,metasenv,pbo,pty = proof in
31  let metano,context,ty = CicUtil.lookup_meta goal metasenv in
32   let new_ty = reduction context ty in
33    let new_metasenv = 
34     List.map
35     (function
36       (n,_,_) when n = metano -> (metano,context,new_ty)
37       | _ as t -> t
38     ) metasenv
39    in
40     (curi,new_metasenv,pbo,pty), [metano]
41 ;;
42 *)
43
44 (* The default of term is the thesis of the goal to be prooved *)
45 let reduction_tac ~also_in_hypotheses ~reduction ~terms (proof,goal) =
46  let curi,metasenv,pbo,pty = proof in
47  let metano,context,ty = CicUtil.lookup_meta goal metasenv in
48   let terms =
49    match terms with None -> [ty] | Some l -> l
50   in
51   (* We don't know if [term] is a subterm of [ty] or a subterm of *)
52   (* the type of one metavariable. So we replace it everywhere.   *)
53   (*CSC: Il vero problema e' che non sapendo dove sia il term non *)
54   (*CSC: sappiamo neppure quale sia il suo contesto!!!! Insomma,  *)
55   (*CSC: e' meglio prima cercare il termine e scoprirne il        *)
56   (*CSC: contesto, poi ridurre e infine rimpiazzare.              *)
57    let replace context where=
58 (*CSC: Per il momento se la riduzione fallisce significa solamente che *)
59 (*CSC: siamo nel contesto errato. Metto il try, ma che schifo!!!!      *)
60 (*CSC: Anche perche' cosi' catturo anche quelle del replace che non dovrei *)
61    try
62     let terms' = List.map (reduction context) terms in
63      ProofEngineReduction.replace ~equality:(==) ~what:terms ~with_what:terms'
64       ~where:where
65    with
66     _ -> where
67    in
68     let ty' = replace context ty in
69     let context' =
70      if also_in_hypotheses then
71       List.fold_right
72        (fun entry context ->
73          match entry with
74             Some (name,Cic.Def (t,None)) ->
75              (Some (name,Cic.Def ((replace context t),None)))::context
76           | Some (name,Cic.Decl t) ->
77              (Some (name,Cic.Decl (replace context t)))::context
78           | None -> None::context
79           | Some (_,Cic.Def (_,Some _)) -> assert false
80        ) context []
81      else
82       context
83     in
84      let metasenv' = 
85       List.map
86        (function
87            (n,_,_) when n = metano -> (metano,context',ty')
88          | _ as t -> t
89        ) metasenv
90      in
91       (curi,metasenv',pbo,pty), [metano]
92 ;;
93
94 let simpl_tac ~also_in_hypotheses ~terms = 
95  mk_tactic ( reduction_tac ~reduction:ProofEngineReduction.simpl 
96   ~also_in_hypotheses ~terms);;
97
98 let reduce_tac ~also_in_hypotheses ~terms = 
99  mk_tactic ( reduction_tac ~reduction:ProofEngineReduction.reduce
100   ~also_in_hypotheses ~terms);;
101   
102 let whd_tac ~also_in_hypotheses ~terms = 
103  mk_tactic ( reduction_tac ~reduction:CicReduction.whd 
104   ~also_in_hypotheses ~terms);;
105
106 let normalize_tac ~also_in_hypotheses ~terms = 
107  mk_tactic ( reduction_tac ~reduction:CicReduction.normalize 
108   ~also_in_hypotheses ~terms);;
109
110 let fold_tac ~reduction ~also_in_hypotheses ~term =
111  let fold_tac ~reduction ~also_in_hypotheses ~term (proof,goal) =
112   let curi,metasenv,pbo,pty = proof in
113   let metano,context,ty = CicUtil.lookup_meta goal metasenv in
114    let term' = reduction context term in
115     (* We don't know if [term] is a subterm of [ty] or a subterm of *)
116     (* the type of one metavariable. So we replace it everywhere.   *)
117     (*CSC: ma si potrebbe ovviare al problema. Ma non credo *)
118     (*CSC: che si guadagni nulla in fatto di efficienza.    *) 
119     let replace =
120      ProofEngineReduction.replace ~equality:(=) ~what:[term'] ~with_what:[term]
121     in
122      let ty' = replace ty in
123      let metasenv' =
124       let context' =
125        if also_in_hypotheses then
126         List.map
127          (function
128              Some (n,Cic.Decl t) -> Some (n,Cic.Decl (replace t))
129            | Some (n,Cic.Def (t,None))  -> Some (n,Cic.Def ((replace t),None))
130            | None -> None
131            | Some (_,Cic.Def (_,Some _)) -> assert false
132          ) context
133        else
134         context
135       in
136        List.map
137         (function
138             (n,_,_) when n = metano -> (metano,context',ty')
139           | _ as t -> t
140         ) metasenv
141       
142      in
143       (curi,metasenv',pbo,pty), [metano]
144  in
145   mk_tactic (fold_tac ~reduction ~also_in_hypotheses ~term)
146 ;;