| author | bulwahn | 
| Mon, 15 Oct 2012 16:18:48 +0200 | |
| changeset 49857 | 7bf407d77152 | 
| parent 46219 | 426ed18eba43 | 
| child 55627 | 95c8ef02f04b | 
| permissions | -rw-r--r-- | 
| 
32733
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
1  | 
(* Title: Tools/cong_tac.ML  | 
| 
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
2  | 
Author: Stefan Berghofer, TU Muenchen  | 
| 
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
3  | 
|
| 
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
4  | 
Congruence tactic based on explicit instantiation.  | 
| 
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
5  | 
*)  | 
| 
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
6  | 
|
| 
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
7  | 
signature CONG_TAC =  | 
| 
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
8  | 
sig  | 
| 
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
9  | 
val cong_tac: thm -> int -> tactic  | 
| 
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
10  | 
end;  | 
| 
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
11  | 
|
| 
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
12  | 
structure Cong_Tac: CONG_TAC =  | 
| 
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
13  | 
struct  | 
| 
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
14  | 
|
| 
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
15  | 
fun cong_tac cong = CSUBGOAL (fn (cgoal, i) =>  | 
| 
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
16  | 
let  | 
| 
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
17  | 
val cert = Thm.cterm_of (Thm.theory_of_cterm cgoal);  | 
| 
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
18  | 
val goal = Thm.term_of cgoal;  | 
| 
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
19  | 
in  | 
| 
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
20  | 
(case Logic.strip_assums_concl goal of  | 
| 
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
21  | 
_ $ (_ $ (f $ x) $ (g $ y)) =>  | 
| 
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
22  | 
let  | 
| 
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
23  | 
val cong' = Thm.lift_rule cgoal cong;  | 
| 
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
24  | 
val _ $ (_ $ (f' $ x') $ (g' $ y')) =  | 
| 
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
25  | 
Logic.strip_assums_concl (Thm.prop_of cong');  | 
| 
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
26  | 
val ps = Logic.strip_params (Thm.concl_of cong');  | 
| 
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
27  | 
val insts = [(f', f), (g', g), (x', x), (y', y)]  | 
| 
46219
 
426ed18eba43
discontinued old-style Term.list_abs in favour of plain Term.abs;
 
wenzelm 
parents: 
32733 
diff
changeset
 | 
28  | 
|> map (fn (t, u) => (cert (Term.head_of t), cert (fold_rev Term.abs ps u)));  | 
| 
32733
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
29  | 
in  | 
| 
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
30  | 
fn st => compose_tac (false, Drule.cterm_instantiate insts cong', 2) i st  | 
| 
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
31  | 
handle THM _ => no_tac st  | 
| 
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
32  | 
end  | 
| 
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
33  | 
| _ => no_tac)  | 
| 
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
34  | 
end);  | 
| 
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
35  | 
|
| 
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
36  | 
end;  | 
| 
 
71618deaf777
moved generic cong_tac from HOL/Tools/datatype_aux.ML to Tools/cong_tac.ML, proper subgoal selection (failure, not exception);
 
wenzelm 
parents:  
diff
changeset
 | 
37  |