| author | wenzelm | 
| Tue, 27 Jun 2017 11:47:14 +0200 | |
| changeset 66200 | 02c66b71c013 | 
| parent 64705 | 7596b0736ab9 | 
| child 66251 | cd935b7cb3fb | 
| permissions | -rw-r--r-- | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1  | 
(* Title: HOL/Tools/BNF/bnf_gfp_grec_sugar.ML  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2  | 
Author: Aymeric Bouzy, Ecole polytechnique  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
3  | 
Author: Jasmin Blanchette, Inria, LORIA, MPII  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
4  | 
Author: Dmitriy Traytel, ETH Zürich  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
5  | 
Copyright 2015, 2016  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
6  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
7  | 
Generalized corecursor sugar ("corec" and friends).
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
8  | 
*)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
9  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
10  | 
signature BNF_GFP_GREC_SUGAR =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
11  | 
sig  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
12  | 
datatype corec_option =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
13  | 
Plugins_Option of Proof.context -> Plugin_Name.filter |  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
14  | 
Friend_Option |  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
15  | 
Transfer_Option  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
16  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
17  | 
val parse_corec_equation: Proof.context -> term list -> term -> term list * term  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
18  | 
val explore_corec_equation: Proof.context -> bool -> bool -> string -> term ->  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
19  | 
BNF_GFP_Grec_Sugar_Util.s_parse_info -> typ -> term list * term -> term list * term  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
20  | 
val build_corecUU_arg_and_goals: bool -> term -> term list * term -> local_theory ->  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
21  | 
(((thm list * thm list * thm list) * term list) * term) * local_theory  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
22  | 
val derive_eq_corecUU: Proof.context -> BNF_GFP_Grec.corec_info -> term -> term -> thm -> thm  | 
| 62746 | 23  | 
val derive_unique: Proof.context -> morphism -> term -> BNF_GFP_Grec.corec_info -> string ->  | 
24  | 
thm -> thm  | 
|
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
25  | 
|
| 
64674
 
ef0a5fd30f3b
print constants in 'primrec', 'primcorec(ursive)', 'corec(ursive)', like in 'definition' and 'fun(ction)'
 
blanchet 
parents: 
64637 
diff
changeset
 | 
26  | 
val corec_cmd: bool -> corec_option list -> (binding * string option * mixfix) list * string ->  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
27  | 
local_theory -> local_theory  | 
| 
64674
 
ef0a5fd30f3b
print constants in 'primrec', 'primcorec(ursive)', 'corec(ursive)', like in 'definition' and 'fun(ction)'
 
blanchet 
parents: 
64637 
diff
changeset
 | 
28  | 
val corecursive_cmd: bool -> corec_option list ->  | 
| 
 
ef0a5fd30f3b
print constants in 'primrec', 'primcorec(ursive)', 'corec(ursive)', like in 'definition' and 'fun(ction)'
 
blanchet 
parents: 
64637 
diff
changeset
 | 
29  | 
(binding * string option * mixfix) list * string -> local_theory -> Proof.state  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
30  | 
val friend_of_corec_cmd: (string * string option) * string -> local_theory -> Proof.state  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
31  | 
val coinduction_upto_cmd: string * string -> local_theory -> local_theory  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
32  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
33  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
34  | 
structure BNF_GFP_Grec_Sugar : BNF_GFP_GREC_SUGAR =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
35  | 
struct  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
36  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
37  | 
open Ctr_Sugar  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
38  | 
open BNF_Util  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
39  | 
open BNF_Tactics  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
40  | 
open BNF_Def  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
41  | 
open BNF_Comp  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
42  | 
open BNF_FP_Util  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
43  | 
open BNF_FP_Def_Sugar  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
44  | 
open BNF_FP_N2M_Sugar  | 
| 63801 | 45  | 
open BNF_GFP_Util  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
46  | 
open BNF_GFP_Rec_Sugar  | 
| 63801 | 47  | 
open BNF_FP_Rec_Sugar_Transfer  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
48  | 
open BNF_GFP_Grec  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
49  | 
open BNF_GFP_Grec_Sugar_Util  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
50  | 
open BNF_GFP_Grec_Sugar_Tactics  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
51  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
52  | 
val cong_N = "cong_";  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
53  | 
val baseN = "base";  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
54  | 
val reflN = "refl";  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
55  | 
val symN = "sym";  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
56  | 
val transN = "trans";  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
57  | 
val cong_introsN = prefix cong_N "intros";  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
58  | 
val codeN = "code";  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
59  | 
val coinductN = "coinduct";  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
60  | 
val coinduct_uptoN = "coinduct_upto";  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
61  | 
val corecN = "corec";  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
62  | 
val ctrN = "ctr";  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
63  | 
val discN = "disc";  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
64  | 
val disc_iffN = "disc_iff";  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
65  | 
val eq_algrhoN = "eq_algrho";  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
66  | 
val eq_corecUUN = "eq_corecUU";  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
67  | 
val friendN = "friend";  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
68  | 
val inner_elimN = "inner_elim";  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
69  | 
val inner_inductN = "inner_induct";  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
70  | 
val inner_simpN = "inner_simp";  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
71  | 
val rhoN = "rho";  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
72  | 
val selN = "sel";  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
73  | 
val uniqueN = "unique";  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
74  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
75  | 
val inner_fp_suffix = "_inner_fp";  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
76  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
77  | 
val nitpicksimp_attrs = @{attributes [nitpick_simp]};
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
78  | 
val simp_attrs = @{attributes [simp]};
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
79  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
80  | 
val unfold_id_thms1 =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
81  | 
  map (fn thm => thm RS eq_reflection) @{thms id_bnf_o o_id_bnf id_apply o_apply} @
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
82  | 
  @{thms fst_def[abs_def, symmetric] snd_def[abs_def, symmetric]};
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
83  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
84  | 
fun unfold_id_bnf_etc lthy =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
85  | 
let val thy = Proof_Context.theory_of lthy in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
86  | 
Raw_Simplifier.rewrite_term thy unfold_id_thms1 []  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
87  | 
    #> Raw_Simplifier.rewrite_term thy @{thms BNF_Composition.id_bnf_def} []
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
88  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
89  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
90  | 
datatype corec_option =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
91  | 
Plugins_Option of Proof.context -> Plugin_Name.filter |  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
92  | 
Friend_Option |  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
93  | 
Transfer_Option;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
94  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
95  | 
val corec_option_parser = Parse.group (K "option")  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
96  | 
(Plugin_Name.parse_filter >> Plugins_Option  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
97  | 
|| Parse.reserved "friend" >> K Friend_Option  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
98  | 
|| Parse.reserved "transfer" >> K Transfer_Option);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
99  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
100  | 
type codatatype_extra =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
101  | 
  {case_dtor: thm,
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
102  | 
case_trivial: thm,  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
103  | 
abs_rep_transfers: thm list};  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
104  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
105  | 
fun morph_codatatype_extra phi ({case_dtor, case_trivial, abs_rep_transfers} : codatatype_extra) =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
106  | 
  {case_dtor = Morphism.thm phi case_dtor, case_trivial = Morphism.thm phi case_trivial,
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
107  | 
abs_rep_transfers = map (Morphism.thm phi) abs_rep_transfers};  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
108  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
109  | 
val transfer_codatatype_extra = morph_codatatype_extra o Morphism.transfer_morphism;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
110  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
111  | 
type coinduct_extra =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
112  | 
  {coinduct: thm,
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
113  | 
coinduct_attrs: Token.src list,  | 
| 62743 | 114  | 
cong_intro_pairs: (string * thm) list};  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
115  | 
|
| 62743 | 116  | 
fun morph_coinduct_extra phi ({coinduct, coinduct_attrs, cong_intro_pairs} : coinduct_extra) =
 | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
117  | 
  {coinduct = Morphism.thm phi coinduct, coinduct_attrs = coinduct_attrs,
 | 
| 62743 | 118  | 
cong_intro_pairs = map (apsnd (Morphism.thm phi)) cong_intro_pairs};  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
119  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
120  | 
val transfer_coinduct_extra = morph_coinduct_extra o Morphism.transfer_morphism;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
121  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
122  | 
type friend_extra =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
123  | 
  {eq_algrhos: thm list,
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
124  | 
algrho_eqs: thm list};  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
125  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
126  | 
val empty_friend_extra = {eq_algrhos = [], algrho_eqs = []};
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
127  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
128  | 
fun merge_friend_extras ({eq_algrhos = eq_algrhos1, algrho_eqs = algrho_eqs1},
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
129  | 
    {eq_algrhos = eq_algrhos2, algrho_eqs = algrho_eqs2}) =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
130  | 
  {eq_algrhos = union Thm.eq_thm_prop eq_algrhos1 eq_algrhos2,
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
131  | 
algrho_eqs = union Thm.eq_thm_prop algrho_eqs1 algrho_eqs2};  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
132  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
133  | 
type corec_sugar_data =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
134  | 
codatatype_extra Symtab.table * coinduct_extra Symtab.table * friend_extra Symtab.table;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
135  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
136  | 
structure Data = Generic_Data  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
137  | 
(  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
138  | 
type T = corec_sugar_data;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
139  | 
val empty = (Symtab.empty, Symtab.empty, Symtab.empty);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
140  | 
val extend = I;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
141  | 
fun merge data : T =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
142  | 
(Symtab.merge (K true) (apply2 #1 data), Symtab.merge (K true) (apply2 #2 data),  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
143  | 
Symtab.join (K merge_friend_extras) (apply2 #3 data));  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
144  | 
);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
145  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
146  | 
fun register_codatatype_extra fpT_name extra =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
147  | 
  Local_Theory.declaration {syntax = false, pervasive = true} (fn phi =>
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
148  | 
    Data.map (@{apply 3(1)} (Symtab.update (fpT_name, morph_codatatype_extra phi extra))));
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
149  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
150  | 
fun codatatype_extra_of ctxt =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
151  | 
Symtab.lookup (#1 (Data.get (Context.Proof ctxt)))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
152  | 
#> Option.map (transfer_codatatype_extra (Proof_Context.theory_of ctxt));  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
153  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
154  | 
fun all_codatatype_extras_of ctxt =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
155  | 
Symtab.dest (#1 (Data.get (Context.Proof ctxt)));  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
156  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
157  | 
fun register_coinduct_extra fpT_name extra =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
158  | 
  Local_Theory.declaration {syntax = false, pervasive = true} (fn phi =>
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
159  | 
    Data.map (@{apply 3(2)} (Symtab.update (fpT_name, morph_coinduct_extra phi extra))));
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
160  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
161  | 
fun coinduct_extra_of ctxt =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
162  | 
Symtab.lookup (#2 (Data.get (Context.Proof ctxt)))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
163  | 
#> Option.map (transfer_coinduct_extra (Proof_Context.theory_of ctxt));  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
164  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
165  | 
fun register_friend_extra fun_name eq_algrho algrho_eq =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
166  | 
  Local_Theory.declaration {syntax = false, pervasive = true} (fn phi =>
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
167  | 
    Data.map (@{apply 3(3)} (Symtab.map_default (fun_name, empty_friend_extra)
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
168  | 
      (fn {eq_algrhos, algrho_eqs} =>
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
169  | 
        {eq_algrhos = Morphism.thm phi eq_algrho :: eq_algrhos,
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
170  | 
algrho_eqs = Morphism.thm phi algrho_eq :: algrho_eqs}))));  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
171  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
172  | 
fun all_friend_extras_of ctxt =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
173  | 
Symtab.dest (#3 (Data.get (Context.Proof ctxt)));  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
174  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
175  | 
fun coinduct_extras_of_generic context =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
176  | 
corec_infos_of_generic context  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
177  | 
#> map (#corecUU #> dest_Const #> fst #> Symtab.lookup (#2 (Data.get context)) #> the  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
178  | 
#> transfer_coinduct_extra (Context.theory_of context));  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
179  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
180  | 
fun get_coinduct_uptos fpT_name context =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
181  | 
coinduct_extras_of_generic context fpT_name |> map #coinduct;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
182  | 
fun get_cong_all_intros fpT_name context =  | 
| 62743 | 183  | 
coinduct_extras_of_generic context fpT_name |> maps (#cong_intro_pairs #> map snd);  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
184  | 
fun get_cong_intros fpT_name name context =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
185  | 
coinduct_extras_of_generic context fpT_name  | 
| 62743 | 186  | 
|> map_filter (#cong_intro_pairs #> (fn ps => AList.lookup (op =) ps name));  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
187  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
188  | 
fun ctr_names_of_fp_name lthy fpT_name =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
189  | 
fpT_name |> fp_sugar_of lthy |> the |> #fp_ctr_sugar |> #ctr_sugar |> #ctrs  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
190  | 
|> map (Long_Name.base_name o name_of_ctr);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
191  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
192  | 
fun register_coinduct_dynamic_base fpT_name lthy =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
193  | 
let val fp_b = Binding.name (Long_Name.base_name fpT_name) in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
194  | 
lthy  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
195  | 
|> fold Local_Theory.add_thms_dynamic  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
196  | 
((mk_fp_binding fp_b coinduct_uptoN, get_coinduct_uptos fpT_name) ::  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
197  | 
map (fn N =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
198  | 
let val N = cong_N ^ N in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
199  | 
(mk_fp_binding fp_b N, get_cong_intros fpT_name N)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
200  | 
end)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
201  | 
([baseN, reflN, symN, transN] @ ctr_names_of_fp_name lthy fpT_name))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
202  | 
|> Local_Theory.add_thms_dynamic  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
203  | 
(mk_fp_binding fp_b cong_introsN, get_cong_all_intros fpT_name)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
204  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
205  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
206  | 
fun register_coinduct_dynamic_friend fpT_name friend_name =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
207  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
208  | 
val fp_b = Binding.name (Long_Name.base_name fpT_name);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
209  | 
val friend_base_name = cong_N ^ Long_Name.base_name friend_name;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
210  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
211  | 
Local_Theory.add_thms_dynamic  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
212  | 
(mk_fp_binding fp_b friend_base_name, get_cong_intros fpT_name friend_base_name)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
213  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
214  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
215  | 
fun derive_case_dtor ctxt fpT_name =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
216  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
217  | 
val thy = Proof_Context.theory_of ctxt;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
218  | 
|
| 62699 | 219  | 
    val SOME ({fp_res_index, fp_res = {dtors = dtors0, dtor_ctors, ...},
 | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
220  | 
        absT_info = {rep = rep0, abs_inverse, ...},
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
221  | 
        fp_ctr_sugar = {ctr_defs, ctr_sugar = {casex, exhaust, case_thms, ...}, ...}, ...}) =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
222  | 
fp_sugar_of ctxt fpT_name;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
223  | 
|
| 62699 | 224  | 
val (f_Ts, Type (_, [fpT as Type (_, As), _])) = strip_fun_type (fastype_of casex);  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
225  | 
val x_Tss = map binder_types f_Ts;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
226  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
227  | 
val (((u, fs), xss), _) = ctxt  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
228  | 
|> yield_singleton (mk_Frees "y") fpT  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
229  | 
||>> mk_Frees "f" f_Ts  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
230  | 
||>> mk_Freess "x" x_Tss;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
231  | 
|
| 62699 | 232  | 
val dtor0 = nth dtors0 fp_res_index;  | 
233  | 
val dtor = mk_dtor As dtor0;  | 
|
234  | 
||
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
235  | 
val u' = dtor $ u;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
236  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
237  | 
val absT = fastype_of u';  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
238  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
239  | 
val rep = mk_rep absT rep0;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
240  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
241  | 
val goal = mk_Trueprop_eq (list_comb (casex, fs) $ u,  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
242  | 
mk_case_absumprod absT rep fs xss xss $ u')  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
243  | 
      |> Raw_Simplifier.rewrite_term thy @{thms comp_def[THEN eq_reflection]} [];
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
244  | 
val vars = map (fst o dest_Free) (u :: fs);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
245  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
246  | 
val dtor_ctor = nth dtor_ctors fp_res_index;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
247  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
248  | 
    Goal.prove_sorry ctxt vars [] goal (fn {context = ctxt, prems = _} =>
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
249  | 
mk_case_dtor_tac ctxt u abs_inverse dtor_ctor ctr_defs exhaust case_thms)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
250  | 
|> Thm.close_derivation  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
251  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
252  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
253  | 
fun derive_case_trivial ctxt fpT_name =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
254  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
255  | 
    val SOME {casex, exhaust, case_thms, ...} = ctr_sugar_of ctxt fpT_name;
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
256  | 
|
| 62746 | 257  | 
val Type (_, As0) = domain_type (body_fun_type (fastype_of casex));  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
258  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
259  | 
val (As, _) = ctxt  | 
| 62699 | 260  | 
|> mk_TFrees' (map Type.sort_of_atyp As0);  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
261  | 
val fpT = Type (fpT_name, As);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
262  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
263  | 
    val (var_name, ()) = singleton (Variable.variant_frees ctxt []) ("x", ());
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
264  | 
val var = Free (var_name, fpT);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
265  | 
val goal = mk_Trueprop_eq (expand_to_ctr_term ctxt fpT var, var);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
266  | 
|
| 62727 | 267  | 
val exhaust' = infer_instantiate' ctxt [SOME (Thm.cterm_of ctxt var)] exhaust;  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
268  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
269  | 
    Goal.prove_sorry ctxt [var_name] [] goal (fn {context = ctxt, prems = _} =>
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
270  | 
HEADGOAL (rtac ctxt exhaust') THEN ALLGOALS (hyp_subst_tac ctxt) THEN  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
271  | 
unfold_thms_tac ctxt case_thms THEN ALLGOALS (rtac ctxt refl))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
272  | 
|> Thm.close_derivation  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
273  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
274  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
275  | 
fun mk_abs_rep_transfers ctxt fpT_name =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
276  | 
[mk_abs_transfer ctxt fpT_name, mk_rep_transfer ctxt fpT_name]  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
277  | 
handle Fail _ => [];  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
278  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
279  | 
fun ensure_codatatype_extra fpT_name ctxt =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
280  | 
(case codatatype_extra_of ctxt fpT_name of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
281  | 
NONE =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
282  | 
let val abs_rep_transfers = mk_abs_rep_transfers ctxt fpT_name in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
283  | 
ctxt  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
284  | 
|> register_codatatype_extra fpT_name  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
285  | 
        {case_dtor = derive_case_dtor ctxt fpT_name,
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
286  | 
case_trivial = derive_case_trivial ctxt fpT_name,  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
287  | 
abs_rep_transfers = abs_rep_transfers}  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
288  | 
|> set_transfer_rule_attrs abs_rep_transfers  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
289  | 
end  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
290  | 
  | SOME {abs_rep_transfers, ...} => ctxt |> set_transfer_rule_attrs abs_rep_transfers);
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
291  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
292  | 
fun setup_base fpT_name =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
293  | 
register_coinduct_dynamic_base fpT_name  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
294  | 
#> ensure_codatatype_extra fpT_name;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
295  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
296  | 
fun is_set ctxt (const_name, T) =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
297  | 
(case T of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
298  | 
    Type (@{type_name fun}, [Type (fpT_name, _), Type (@{type_name set}, [_])]) =>
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
299  | 
(case bnf_of ctxt fpT_name of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
300  | 
SOME bnf => exists (fn Const (s, _) => s = const_name | _ => false) (sets_of_bnf bnf)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
301  | 
| NONE => false)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
302  | 
| _ => false);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
303  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
304  | 
fun case_eq_if_thms_of_term ctxt t =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
305  | 
let val ctr_sugars = map_filter (ctr_sugar_of_case ctxt o fst) (Term.add_consts t []) in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
306  | 
maps #case_eq_ifs ctr_sugars  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
307  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
308  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
309  | 
fun all_algrho_eqs_of ctxt =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
310  | 
maps (#algrho_eqs o snd) (all_friend_extras_of ctxt);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
311  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
312  | 
fun derive_code ctxt inner_fp_simps goal  | 
| 62746 | 313  | 
    {sig_fp_sugars, ssig_fp_sugar, eval, eval_simps, all_algLam_algs, corecUU_thm, ...} fun_t
 | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
314  | 
fun_def =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
315  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
316  | 
val fun_T = fastype_of fun_t;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
317  | 
val (arg_Ts, Type (fpT_name, _)) = strip_type fun_T;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
318  | 
val num_args = length arg_Ts;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
319  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
320  | 
    val SOME {pre_bnf, fp_bnf, absT_info, fp_nesting_bnfs, live_nesting_bnfs, fp_ctr_sugar, ...} =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
321  | 
fp_sugar_of ctxt fpT_name;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
322  | 
    val SOME {case_trivial, ...} = codatatype_extra_of ctxt fpT_name;
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
323  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
324  | 
val ctr_sugar = #ctr_sugar fp_ctr_sugar;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
325  | 
val pre_map_def = map_def_of_bnf pre_bnf;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
326  | 
val abs_inverse = #abs_inverse absT_info;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
327  | 
val ctr_defs = #ctr_defs fp_ctr_sugar;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
328  | 
val case_eq_ifs = #case_eq_ifs ctr_sugar @ case_eq_if_thms_of_term ctxt goal;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
329  | 
val all_sig_map_thms = maps (#map_thms o #fp_bnf_sugar) sig_fp_sugars;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
330  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
331  | 
val fp_map_ident = map_ident_of_bnf fp_bnf;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
332  | 
val fpsig_nesting_bnfs = fp_nesting_bnfs @ maps #live_nesting_bnfs sig_fp_sugars;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
333  | 
val fpsig_nesting_T_names = map (fst o dest_Type o T_of_bnf) fpsig_nesting_bnfs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
334  | 
val fpsig_nesting_fp_sugars = map_filter (fp_sugar_of ctxt) fpsig_nesting_T_names;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
335  | 
val fpsig_nesting_fp_bnf_sugars = map #fp_bnf_sugar fpsig_nesting_fp_sugars;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
336  | 
val ssig_fp_bnf_sugar = #fp_bnf_sugar ssig_fp_sugar;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
337  | 
val ssig_bnf = #fp_bnf ssig_fp_sugar;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
338  | 
val ssig_map = map_of_bnf ssig_bnf;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
339  | 
val fpsig_nesting_maps = map map_of_bnf fpsig_nesting_bnfs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
340  | 
val fpsig_nesting_map_ident0s = map map_ident0_of_bnf fpsig_nesting_bnfs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
341  | 
val fpsig_nesting_map_comps = map map_comp_of_bnf fpsig_nesting_bnfs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
342  | 
val fpsig_nesting_map_thms = maps #map_thms fpsig_nesting_fp_bnf_sugars;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
343  | 
val live_nesting_map_ident0s = map map_ident0_of_bnf live_nesting_bnfs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
344  | 
val ssig_map_thms = #map_thms ssig_fp_bnf_sugar;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
345  | 
val all_algLam_alg_pointfuls = map (mk_pointful ctxt) all_algLam_algs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
346  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
347  | 
Variable.add_free_names ctxt goal []  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
348  | 
    |> (fn vars => Goal.prove_sorry ctxt vars [] goal (fn {context = ctxt, prems = _} =>
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
349  | 
mk_code_tac ctxt num_args fpsig_nesting_maps ssig_map eval pre_map_def abs_inverse  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
350  | 
fpsig_nesting_map_ident0s fpsig_nesting_map_comps fpsig_nesting_map_thms  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
351  | 
live_nesting_map_ident0s fp_map_ident case_trivial ctr_defs case_eq_ifs corecUU_thm  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
352  | 
all_sig_map_thms ssig_map_thms all_algLam_alg_pointfuls (all_algrho_eqs_of ctxt) eval_simps  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
353  | 
inner_fp_simps fun_def))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
354  | 
|> Thm.close_derivation  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
355  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
356  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
357  | 
fun derive_unique ctxt phi code_goal  | 
| 62746 | 358  | 
    {sig_fp_sugars, ssig_fp_sugar, eval, eval_simps, all_algLam_algs, corecUU_unique, ...} fpT_name
 | 
359  | 
eq_corecUU =  | 
|
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
360  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
361  | 
    val SOME {pre_bnf, fp_bnf, absT_info, fp_nesting_bnfs, live_nesting_bnfs, fp_ctr_sugar, ...} =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
362  | 
fp_sugar_of ctxt fpT_name;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
363  | 
    val SOME {case_trivial, ...} = codatatype_extra_of ctxt fpT_name;
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
364  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
365  | 
val ctr_sugar = #ctr_sugar fp_ctr_sugar;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
366  | 
val pre_map_def = map_def_of_bnf pre_bnf;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
367  | 
val abs_inverse = #abs_inverse absT_info;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
368  | 
val ctr_defs = #ctr_defs fp_ctr_sugar;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
369  | 
val case_eq_ifs = #case_eq_ifs ctr_sugar @ case_eq_if_thms_of_term ctxt code_goal;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
370  | 
val all_sig_map_thms = maps (#map_thms o #fp_bnf_sugar) sig_fp_sugars;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
371  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
372  | 
val fp_map_ident = map_ident_of_bnf fp_bnf;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
373  | 
val fpsig_nesting_bnfs = fp_nesting_bnfs @ maps #live_nesting_bnfs sig_fp_sugars;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
374  | 
val fpsig_nesting_T_names = map (fst o dest_Type o T_of_bnf) fpsig_nesting_bnfs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
375  | 
val fpsig_nesting_fp_sugars = map_filter (fp_sugar_of ctxt) fpsig_nesting_T_names;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
376  | 
val fpsig_nesting_fp_bnf_sugars = map #fp_bnf_sugar fpsig_nesting_fp_sugars;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
377  | 
val ssig_fp_bnf_sugar = #fp_bnf_sugar ssig_fp_sugar;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
378  | 
val ssig_bnf = #fp_bnf ssig_fp_sugar;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
379  | 
val ssig_map = map_of_bnf ssig_bnf;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
380  | 
val fpsig_nesting_maps = map map_of_bnf fpsig_nesting_bnfs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
381  | 
val fpsig_nesting_map_ident0s = map map_ident0_of_bnf fpsig_nesting_bnfs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
382  | 
val fpsig_nesting_map_comps = map map_comp_of_bnf fpsig_nesting_bnfs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
383  | 
val fpsig_nesting_map_thms = maps #map_thms fpsig_nesting_fp_bnf_sugars;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
384  | 
val live_nesting_map_ident0s = map map_ident0_of_bnf live_nesting_bnfs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
385  | 
val ssig_map_thms = #map_thms ssig_fp_bnf_sugar;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
386  | 
val all_algLam_alg_pointfuls = map (mk_pointful ctxt) all_algLam_algs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
387  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
388  | 
    val @{const Trueprop} $ (Const (@{const_name HOL.eq}, _) $ lhs $ rhs) = code_goal;
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
389  | 
val (fun_t, args) = strip_comb lhs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
390  | 
val closed_rhs = fold_rev lambda args rhs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
391  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
392  | 
val fun_T = fastype_of fun_t;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
393  | 
val num_args = num_binder_types fun_T;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
394  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
395  | 
    val f = Free (singleton (Variable.variant_frees ctxt []) ("f", fun_T));
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
396  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
397  | 
val is_self_call = curry (op aconv) fun_t;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
398  | 
val has_self_call = exists_subterm is_self_call;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
399  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
400  | 
fun fify args (t $ u) = fify (u :: args) t $ fify [] u  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
401  | 
| fify _ (Abs (s, T, t)) = Abs (s, T, fify [] t)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
402  | 
| fify args t = if t = fun_t andalso not (exists has_self_call args) then f else t;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
403  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
404  | 
val goal = Logic.mk_implies (mk_Trueprop_eq (f, fify [] closed_rhs), mk_Trueprop_eq (f, fun_t))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
405  | 
|> Morphism.term phi;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
406  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
407  | 
    Goal.prove_sorry ctxt [fst (dest_Free f)] [] goal (fn {context = ctxt, prems = _} =>
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
408  | 
mk_unique_tac ctxt num_args fpsig_nesting_maps ssig_map eval pre_map_def abs_inverse  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
409  | 
fpsig_nesting_map_ident0s fpsig_nesting_map_comps fpsig_nesting_map_thms  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
410  | 
live_nesting_map_ident0s fp_map_ident case_trivial ctr_defs case_eq_ifs all_sig_map_thms  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
411  | 
ssig_map_thms all_algLam_alg_pointfuls (all_algrho_eqs_of ctxt) eval_simps corecUU_unique  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
412  | 
eq_corecUU)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
413  | 
|> Thm.close_derivation  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
414  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
415  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
416  | 
fun derive_last_disc ctxt fcT_name =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
417  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
418  | 
    val SOME {T = fcT, discs, exhaust, disc_thmss, ...} = ctr_sugar_of ctxt fcT_name;
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
419  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
420  | 
val (u, _) = ctxt  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
421  | 
|> yield_singleton (mk_Frees "x") fcT;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
422  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
423  | 
val udiscs = map (rapp u) discs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
424  | 
val (not_udiscs, last_udisc) = split_last udiscs  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
425  | 
|>> map HOLogic.mk_not;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
426  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
427  | 
val goal = mk_Trueprop_eq (last_udisc, foldr1 HOLogic.mk_conj not_udiscs);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
428  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
429  | 
    Goal.prove_sorry ctxt [fst (dest_Free u)] [] goal (fn {context = ctxt, prems = _} =>
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
430  | 
mk_last_disc_tac ctxt u exhaust (flat disc_thmss))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
431  | 
|> Thm.close_derivation  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
432  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
433  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
434  | 
fun derive_eq_algrho ctxt {sig_fp_sugars, ssig_fp_sugar, eval, eval_simps, all_algLam_algs,
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
435  | 
corecUU_unique, ...}  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
436  | 
    ({algrho = algrho0, dtor_algrho, ...} : friend_info) fun_t k_T code_goal const_transfers rho_def
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
437  | 
eq_corecUU =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
438  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
439  | 
val fun_T = fastype_of fun_t;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
440  | 
val (arg_Ts, Type (fpT_name, Ts)) = strip_type fun_T;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
441  | 
val num_args = length arg_Ts;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
442  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
443  | 
    val SOME {fp_res_index, fp_res, pre_bnf, fp_bnf, absT_info, fp_nesting_bnfs, live_nesting_bnfs,
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
444  | 
fp_ctr_sugar, ...} =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
445  | 
fp_sugar_of ctxt fpT_name;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
446  | 
    val SOME {case_dtor, ...} = codatatype_extra_of ctxt fpT_name;
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
447  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
448  | 
val fp_nesting_Ts = map T_of_bnf fp_nesting_bnfs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
449  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
450  | 
    fun is_nullary_disc_def (@{const Trueprop} $ (Const (@{const_name HOL.eq}, _) $ _
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
451  | 
          $ (Const (@{const_name HOL.eq}, _) $ _ $ _))) = true
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
452  | 
      | is_nullary_disc_def (Const (@{const_name Pure.eq}, _) $ _
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
453  | 
          $ (Const (@{const_name HOL.eq}, _) $ _ $ _)) = true
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
454  | 
| is_nullary_disc_def _ = false;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
455  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
456  | 
val dtor_ctor = nth (#dtor_ctors fp_res) fp_res_index;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
457  | 
val ctor_iff_dtor = #ctor_iff_dtor fp_ctr_sugar;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
458  | 
val ctr_sugar = #ctr_sugar fp_ctr_sugar;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
459  | 
val pre_map_def = map_def_of_bnf pre_bnf;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
460  | 
val abs_inverse = #abs_inverse absT_info;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
461  | 
val ctr_defs = #ctr_defs fp_ctr_sugar;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
462  | 
val nullary_disc_defs = filter (is_nullary_disc_def o Thm.prop_of) (#disc_defs ctr_sugar);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
463  | 
val disc_sel_eq_cases = #disc_eq_cases ctr_sugar @ #sel_defs ctr_sugar;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
464  | 
val case_eq_ifs = #case_eq_ifs ctr_sugar @ case_eq_if_thms_of_term ctxt code_goal;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
465  | 
val all_sig_map_thms = maps (#map_thms o #fp_bnf_sugar) sig_fp_sugars;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
466  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
467  | 
fun add_tnameT (Type (s, Ts)) = insert (op =) s #> fold add_tnameT Ts  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
468  | 
| add_tnameT _ = I;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
469  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
470  | 
fun map_disc_sels'_of s =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
471  | 
(case fp_sugar_of ctxt s of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
472  | 
        SOME {fp_bnf_sugar = {map_disc_iffs, map_selss, ...}, ...} =>
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
473  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
474  | 
val map_selss' =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
475  | 
if length map_selss <= 1 then map_selss  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
476  | 
else map (map (unfold_thms ctxt (no_refl [derive_last_disc ctxt s]))) map_selss;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
477  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
478  | 
map_disc_iffs @ flat map_selss'  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
479  | 
end  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
480  | 
| NONE => []);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
481  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
482  | 
fun mk_const_pointful_natural const_transfer =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
483  | 
SOME (mk_pointful_natural_from_transfer ctxt const_transfer)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
484  | 
handle UNNATURAL () => NONE;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
485  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
486  | 
val const_pointful_natural_opts = map mk_const_pointful_natural const_transfers;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
487  | 
val const_pointful_naturals = map_filter I const_pointful_natural_opts;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
488  | 
val fp_nesting_k_T_names = fold add_tnameT (k_T :: fp_nesting_Ts) [];  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
489  | 
val fp_nesting_k_map_disc_sels' = maps map_disc_sels'_of fp_nesting_k_T_names;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
490  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
491  | 
val fp_map_ident = map_ident_of_bnf fp_bnf;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
492  | 
val fpsig_nesting_bnfs = fp_nesting_bnfs @ maps #live_nesting_bnfs sig_fp_sugars;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
493  | 
val fpsig_nesting_T_names = map (fst o dest_Type o T_of_bnf) fpsig_nesting_bnfs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
494  | 
val fpsig_nesting_fp_sugars = map_filter (fp_sugar_of ctxt) fpsig_nesting_T_names;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
495  | 
val fpsig_nesting_fp_bnf_sugars = map #fp_bnf_sugar fpsig_nesting_fp_sugars;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
496  | 
val ssig_fp_bnf_sugar = #fp_bnf_sugar ssig_fp_sugar;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
497  | 
val ssig_bnf = #fp_bnf ssig_fp_sugar;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
498  | 
val ssig_map = map_of_bnf ssig_bnf;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
499  | 
val fpsig_nesting_maps = map map_of_bnf fpsig_nesting_bnfs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
500  | 
val fpsig_nesting_map_ident0s = map map_ident0_of_bnf fpsig_nesting_bnfs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
501  | 
val fpsig_nesting_map_comps = map map_comp_of_bnf fpsig_nesting_bnfs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
502  | 
val fpsig_nesting_map_thms = maps #map_thms fpsig_nesting_fp_bnf_sugars;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
503  | 
val live_nesting_map_ident0s = map map_ident0_of_bnf live_nesting_bnfs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
504  | 
val ssig_map_thms = #map_thms ssig_fp_bnf_sugar;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
505  | 
val all_algLam_alg_pointfuls = map (mk_pointful ctxt) all_algLam_algs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
506  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
507  | 
val ctor = nth (#ctors fp_res) fp_res_index;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
508  | 
val abs = #abs absT_info;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
509  | 
val rep = #rep absT_info;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
510  | 
val algrho = mk_ctr Ts algrho0;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
511  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
512  | 
val goal = mk_Trueprop_eq (fun_t, abs_curried_balanced arg_Ts algrho);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
513  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
514  | 
fun const_of_transfer thm =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
515  | 
      (case Thm.prop_of thm of @{const Trueprop} $ (_ $ cst $ _) => cst);
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
516  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
517  | 
val eq_algrho =  | 
| 62729 | 518  | 
      Goal.prove (*no sorry*) ctxt [] [] goal (fn {context = ctxt, prems = _} =>
 | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
519  | 
mk_eq_algrho_tac ctxt fpsig_nesting_maps abs rep ctor ssig_map eval pre_map_def abs_inverse  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
520  | 
fpsig_nesting_map_ident0s fpsig_nesting_map_comps fpsig_nesting_map_thms  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
521  | 
live_nesting_map_ident0s fp_map_ident dtor_ctor ctor_iff_dtor ctr_defs nullary_disc_defs  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
522  | 
disc_sel_eq_cases case_dtor case_eq_ifs const_pointful_naturals  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
523  | 
fp_nesting_k_map_disc_sels' rho_def dtor_algrho corecUU_unique eq_corecUU all_sig_map_thms  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
524  | 
ssig_map_thms all_algLam_alg_pointfuls (all_algrho_eqs_of ctxt) eval_simps)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
525  | 
|> Thm.close_derivation  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
526  | 
handle e as ERROR _ =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
527  | 
(case filter (is_none o snd) (const_transfers ~~ const_pointful_natural_opts) of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
528  | 
[] => Exn.reraise e  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
529  | 
| thm_nones =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
530  | 
          error ("Failed to state naturality property for " ^
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
531  | 
commas (map (Syntax.string_of_term ctxt o const_of_transfer o fst) thm_nones)));  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
532  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
533  | 
val algrho_eq = eq_algrho RS (mk_curry_uncurryN_balanced ctxt num_args RS iffD2) RS sym;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
534  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
535  | 
(eq_algrho, algrho_eq)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
536  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
537  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
538  | 
fun prime_rho_transfer_goal ctxt fpT_name rho_def goal =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
539  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
540  | 
val thy = Proof_Context.theory_of ctxt;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
541  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
542  | 
    val SOME {pre_bnf, ...} = fp_sugar_of ctxt fpT_name;
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
543  | 
    val SOME {abs_rep_transfers, ...} = codatatype_extra_of ctxt fpT_name;
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
544  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
545  | 
val simps = rel_def_of_bnf pre_bnf :: rho_transfer_simps;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
546  | 
    val fold_rho = unfold_thms ctxt [rho_def RS @{thm symmetric}];
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
547  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
548  | 
fun derive_unprimed rho_transfer' =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
549  | 
Variable.add_free_names ctxt goal []  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
550  | 
      |> (fn vars => Goal.prove_sorry ctxt vars [] goal (fn {context = ctxt, prems = _} =>
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
551  | 
unfold_thms_tac ctxt simps THEN HEADGOAL (rtac ctxt rho_transfer')))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
552  | 
|> Thm.close_derivation;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
553  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
554  | 
val goal' = Raw_Simplifier.rewrite_term thy simps [] goal;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
555  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
556  | 
if null abs_rep_transfers then (goal', derive_unprimed #> fold_rho)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
557  | 
else (goal, fold_rho)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
558  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
559  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
560  | 
fun derive_rho_transfer_folded ctxt fpT_name const_transfers rho_def goal =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
561  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
562  | 
    val SOME {pre_bnf, ...} = fp_sugar_of ctxt fpT_name;
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
563  | 
    val SOME {abs_rep_transfers, ...} = codatatype_extra_of ctxt fpT_name;
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
564  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
565  | 
Variable.add_free_names ctxt goal []  | 
| 62729 | 566  | 
    |> (fn vars => Goal.prove (*no sorry*) ctxt vars [] goal (fn {context = ctxt, prems = _} =>
 | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
567  | 
mk_rho_transfer_tac ctxt (null abs_rep_transfers) (rel_def_of_bnf pre_bnf)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
568  | 
const_transfers))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
569  | 
    |> unfold_thms ctxt [rho_def RS @{thm symmetric}]
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
570  | 
|> Thm.close_derivation  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
571  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
572  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
573  | 
fun mk_cong_intro_ctr_or_friend_goal ctxt fpT Rcong alg =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
574  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
575  | 
val xy_Ts = binder_types (fastype_of alg);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
576  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
577  | 
val ((xs, ys), _) = ctxt  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
578  | 
|> mk_Frees "x" xy_Ts  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
579  | 
||>> mk_Frees "y" xy_Ts;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
580  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
581  | 
fun mk_prem xy_T x y =  | 
| 
64627
 
8d7cb22482e3
generalized ML function (towards nonuniform datatypes)
 
blanchet 
parents: 
64559 
diff
changeset
 | 
582  | 
build_rel [] ctxt [fpT] [] (fn (T, _) => if T = fpT then Rcong else HOLogic.eq_const T)  | 
| 62746 | 583  | 
(xy_T, xy_T) $ x $ y;  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
584  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
585  | 
    val prems = @{map 3} mk_prem xy_Ts xs ys;
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
586  | 
val concl = Rcong $ list_comb (alg, xs) $ list_comb (alg, ys);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
587  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
588  | 
Logic.list_implies (map HOLogic.mk_Trueprop prems, HOLogic.mk_Trueprop concl)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
589  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
590  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
591  | 
fun derive_cong_ctr_intros ctxt cong_ctor_intro =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
592  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
593  | 
    val @{const Pure.imp} $ _ $ (@{const Trueprop} $ ((Rcong as _ $ _) $ _ $ (ctor $ _))) =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
594  | 
Thm.prop_of cong_ctor_intro;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
595  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
596  | 
val fpT as Type (fpT_name, fp_argTs) = range_type (fastype_of ctor);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
597  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
598  | 
    val SOME {pre_bnf, absT_info = {abs_inverse, ...},
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
599  | 
        fp_ctr_sugar = {ctr_defs, ctr_sugar = {ctrs = ctrs0, ...}, ...}, ...} =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
600  | 
fp_sugar_of ctxt fpT_name;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
601  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
602  | 
val ctrs = map (mk_ctr fp_argTs) ctrs0;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
603  | 
val pre_rel_def = rel_def_of_bnf pre_bnf;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
604  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
605  | 
fun prove ctr_def goal =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
606  | 
Variable.add_free_names ctxt goal []  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
607  | 
      |> (fn vars => Goal.prove_sorry ctxt vars [] goal (fn {context = ctxt, prems = _} =>
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
608  | 
mk_cong_intro_ctr_or_friend_tac ctxt ctr_def [pre_rel_def, abs_inverse] cong_ctor_intro))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
609  | 
|> Thm.close_derivation;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
610  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
611  | 
val goals = map (mk_cong_intro_ctr_or_friend_goal ctxt fpT Rcong) ctrs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
612  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
613  | 
map2 prove ctr_defs goals  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
614  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
615  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
616  | 
fun derive_cong_friend_intro ctxt cong_algrho_intro =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
617  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
618  | 
    val @{const Pure.imp} $ _ $ (@{const Trueprop} $ ((Rcong as _ $ _) $ _
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
619  | 
$ ((algrho as Const (algrho_name, _)) $ _))) =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
620  | 
Thm.prop_of cong_algrho_intro;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
621  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
622  | 
val fpT as Type (_, fp_argTs) = range_type (fastype_of algrho);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
623  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
624  | 
    fun has_algrho (@{const Trueprop} $ (Const (@{const_name HOL.eq}, _) $ _ $ rhs)) =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
625  | 
fst (dest_Const (head_of (strip_abs_body rhs))) = algrho_name;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
626  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
627  | 
val eq_algrho :: _ =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
628  | 
maps (filter (has_algrho o Thm.prop_of) o #eq_algrhos o snd) (all_friend_extras_of ctxt);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
629  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
630  | 
    val @{const Trueprop} $ (Const (@{const_name HOL.eq}, _) $ friend0 $ _) = Thm.prop_of eq_algrho;
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
631  | 
val friend = mk_ctr fp_argTs friend0;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
632  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
633  | 
val goal = mk_cong_intro_ctr_or_friend_goal ctxt fpT Rcong friend;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
634  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
635  | 
Variable.add_free_names ctxt goal []  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
636  | 
    |> (fn vars => Goal.prove_sorry ctxt vars [] goal (fn {context = ctxt, prems = _} =>
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
637  | 
mk_cong_intro_ctr_or_friend_tac ctxt eq_algrho [] cong_algrho_intro))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
638  | 
|> Thm.close_derivation  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
639  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
640  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
641  | 
fun derive_cong_intros lthy ctr_names friend_names  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
642  | 
    ({cong_base, cong_refl, cong_sym, cong_trans, cong_alg_intros, ...} : dtor_coinduct_info) =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
643  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
644  | 
val cong_ctor_intro :: cong_algrho_intros = rev cong_alg_intros;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
645  | 
val names = map (prefix cong_N) ([baseN, reflN, symN, transN] @ ctr_names @ friend_names);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
646  | 
val thms = [cong_base, cong_refl, cong_sym, cong_trans] @  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
647  | 
derive_cong_ctr_intros lthy cong_ctor_intro @  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
648  | 
map (derive_cong_friend_intro lthy) cong_algrho_intros;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
649  | 
in  | 
| 62743 | 650  | 
names ~~ thms  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
651  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
652  | 
|
| 62699 | 653  | 
fun derive_coinduct ctxt (fpT as Type (fpT_name, fpT_args)) dtor_coinduct =  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
654  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
655  | 
val thy = Proof_Context.theory_of ctxt;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
656  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
657  | 
    val @{const Pure.imp} $ (@{const Trueprop} $ (_ $ Abs (_, _, _ $
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
658  | 
        Abs (_, _, @{const implies} $ _ $ (_ $ (cong0 $ _) $ _ $ _))))) $ _ =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
659  | 
Thm.prop_of dtor_coinduct;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
660  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
661  | 
    val SOME {X as TVar ((X_s, _), _), fp_res = {dtor_ctors, ...}, pre_bnf,
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
662  | 
        absT_info = {abs_inverse, ...}, live_nesting_bnfs,
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
663  | 
        fp_ctr_sugar = {ctrXs_Tss, ctr_defs,
 | 
| 62699 | 664  | 
          ctr_sugar = ctr_sugar0 as {T = Type (_, T0_args), ctrs = ctrs0, discs = discs0, ...},
 | 
665  | 
...}, ...} =  | 
|
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
666  | 
fp_sugar_of ctxt fpT_name;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
667  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
668  | 
val n = length ctrXs_Tss;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
669  | 
val ms = map length ctrXs_Tss;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
670  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
671  | 
    val X' = TVar ((X_s, maxidx_of_typ fpT + 1), @{sort type});
 | 
| 62699 | 672  | 
val As_rho = tvar_subst thy T0_args fpT_args;  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
673  | 
val substXAT = Term.typ_subst_TVars As_rho o Tsubst X X';  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
674  | 
val substXA = Term.subst_TVars As_rho o substT X X';  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
675  | 
val phi = Morphism.typ_morphism "BNF" substXAT $> Morphism.term_morphism "BNF" substXA;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
676  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
677  | 
fun mk_applied_cong arg =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
678  | 
enforce_type ctxt domain_type (fastype_of arg) cong0 $ arg;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
679  | 
|
| 
64637
 
a15785625f7c
export ML functions (towards nonuniform codatatypes) + signature tuning
 
blanchet 
parents: 
64627 
diff
changeset
 | 
680  | 
val thm = derive_coinduct_thms_for_types ctxt false mk_applied_cong [pre_bnf] dtor_coinduct  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
681  | 
dtor_ctors live_nesting_bnfs [fpT] [substXAT X] [map (map substXAT) ctrXs_Tss] [n]  | 
| 
64637
 
a15785625f7c
export ML functions (towards nonuniform codatatypes) + signature tuning
 
blanchet 
parents: 
64627 
diff
changeset
 | 
682  | 
[abs_inverse] [abs_inverse] I [ctr_defs] [morph_ctr_sugar phi ctr_sugar0]  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
683  | 
|> map snd |> the_single;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
684  | 
val (attrs, _) = mk_coinduct_attrs [fpT] [ctrs0] [discs0] [ms];  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
685  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
686  | 
(thm, attrs)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
687  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
688  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
689  | 
type explore_parameters =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
690  | 
  {bound_Us: typ list,
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
691  | 
bound_Ts: typ list,  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
692  | 
U: typ,  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
693  | 
T: typ};  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
694  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
695  | 
fun update_UT {bound_Us, bound_Ts, ...} U T =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
696  | 
  {bound_Us = bound_Us, bound_Ts = bound_Ts, U = U, T = T};
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
697  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
698  | 
fun explore_nested lthy explore {bound_Us, bound_Ts, U, T} t =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
699  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
700  | 
fun build_simple (T, U) =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
701  | 
if T = U then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
702  | 
        @{term "%y. y"}
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
703  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
704  | 
Bound 0  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
705  | 
        |> explore {bound_Us = T :: bound_Us, bound_Ts = T :: bound_Ts, U = U, T = T}
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
706  | 
|> (fn t => Abs (Name.uu, T, t));  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
707  | 
in  | 
| 
64627
 
8d7cb22482e3
generalized ML function (towards nonuniform datatypes)
 
blanchet 
parents: 
64559 
diff
changeset
 | 
708  | 
betapply (build_map lthy [] [] build_simple (T, U), t)  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
709  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
710  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
711  | 
fun add_boundvar t = betapply (incr_boundvars 1 t, Bound 0);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
712  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
713  | 
fun explore_fun (arg_U :: arg_Us) explore {bound_Us, bound_Ts, U, T} t =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
714  | 
let val arg_name = the_default Name.uu (try (fn (Abs (s, _, _)) => s) t) in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
715  | 
add_boundvar t  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
716  | 
|> explore_fun arg_Us explore  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
717  | 
        {bound_Us = arg_U :: bound_Us, bound_Ts = domain_type T :: bound_Ts, U = range_type U,
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
718  | 
T = range_type T}  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
719  | 
|> (fn t => Abs (arg_name, arg_U, t))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
720  | 
end  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
721  | 
| explore_fun [] explore params t = explore params t;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
722  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
723  | 
fun massage_fun explore (params as {T, U, ...}) =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
724  | 
if can dest_funT T then explore_fun [domain_type U] explore params else explore params;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
725  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
726  | 
fun massage_star massages explore =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
727  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
728  | 
fun after_massage massages' t params t' =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
729  | 
if t aconv t' then massage_any massages' params t else massage_any massages params t'  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
730  | 
and massage_any [] params t = explore params t  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
731  | 
| massage_any (massage :: massages') params t =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
732  | 
massage (after_massage massages' t) params t;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
733  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
734  | 
massage_any massages  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
735  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
736  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
737  | 
fun massage_let explore params t =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
738  | 
(case strip_comb t of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
739  | 
    (Const (@{const_name Let}, _), [_, _]) => unfold_lets_splits t
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
740  | 
| _ => t)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
741  | 
|> explore params;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
742  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
743  | 
fun check_corec_equation ctxt fun_frees (lhs, rhs) =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
744  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
745  | 
val (fun_t, arg_ts) = strip_comb lhs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
746  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
747  | 
fun check_fun_name () =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
748  | 
null fun_frees orelse member (op aconv) fun_frees fun_t orelse  | 
| 
64705
 
7596b0736ab9
more uniform errors in '(prim)(co)rec(ursive)' variants
 
blanchet 
parents: 
64674 
diff
changeset
 | 
749  | 
ill_formed_equation_head ctxt [] fun_t;  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
750  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
751  | 
fun check_no_other_frees () =  | 
| 62724 | 752  | 
(case Term.add_frees rhs [] |> map Free |> subtract (op =) (fun_frees @ arg_ts)  | 
| 
64705
 
7596b0736ab9
more uniform errors in '(prim)(co)rec(ursive)' variants
 
blanchet 
parents: 
64674 
diff
changeset
 | 
753  | 
|> find_first (not o Variable.is_fixed ctxt o fst o dest_Free) of  | 
| 
 
7596b0736ab9
more uniform errors in '(prim)(co)rec(ursive)' variants
 
blanchet 
parents: 
64674 
diff
changeset
 | 
754  | 
NONE => ()  | 
| 
 
7596b0736ab9
more uniform errors in '(prim)(co)rec(ursive)' variants
 
blanchet 
parents: 
64674 
diff
changeset
 | 
755  | 
| SOME t => extra_variable_in_rhs ctxt [] t);  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
756  | 
in  | 
| 
64705
 
7596b0736ab9
more uniform errors in '(prim)(co)rec(ursive)' variants
 
blanchet 
parents: 
64674 
diff
changeset
 | 
757  | 
check_duplicate_variables_in_lhs ctxt [] arg_ts;  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
758  | 
check_fun_name ();  | 
| 
64705
 
7596b0736ab9
more uniform errors in '(prim)(co)rec(ursive)' variants
 
blanchet 
parents: 
64674 
diff
changeset
 | 
759  | 
check_all_fun_arg_frees ctxt [] (filter_out is_Var arg_ts);  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
760  | 
check_no_other_frees ()  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
761  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
762  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
763  | 
fun parse_corec_equation ctxt fun_frees eq =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
764  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
765  | 
val (lhs, rhs) = HOLogic.dest_eq (HOLogic.dest_Trueprop (drop_all eq))  | 
| 
64705
 
7596b0736ab9
more uniform errors in '(prim)(co)rec(ursive)' variants
 
blanchet 
parents: 
64674 
diff
changeset
 | 
766  | 
handle TERM _ => ill_formed_equation_lhs_rhs ctxt [eq];  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
767  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
768  | 
val _ = check_corec_equation ctxt fun_frees (lhs, rhs);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
769  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
770  | 
val (fun_t, arg_ts) = strip_comb lhs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
771  | 
val (arg_Ts, _) = strip_type (fastype_of fun_t);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
772  | 
val added_Ts = drop (length arg_ts) arg_Ts;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
773  | 
val free_names = mk_names (length added_Ts) "x" ~~ added_Ts;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
774  | 
val free_args = Variable.variant_frees ctxt [rhs, lhs] free_names |> map Free;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
775  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
776  | 
(arg_ts @ free_args, list_comb (rhs, free_args))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
777  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
778  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
779  | 
fun morph_views phi (code, ctrs, discs, disc_iffs, sels) =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
780  | 
(Morphism.term phi code, map (Morphism.term phi) ctrs, map (Morphism.term phi) discs,  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
781  | 
map (Morphism.term phi) disc_iffs, map (Morphism.term phi) sels);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
782  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
783  | 
fun generate_views ctxt eq fun_t (lhs_free_args, rhs) =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
784  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
785  | 
val lhs = list_comb (fun_t, lhs_free_args);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
786  | 
val T as Type (T_name, Ts) = fastype_of rhs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
787  | 
    val SOME {fp_ctr_sugar = {ctr_sugar = {ctrs = ctrs0, discs = discs0, selss = selss0, ...}, ...},
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
788  | 
...} =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
789  | 
fp_sugar_of ctxt T_name;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
790  | 
val ctrs = map (mk_ctr Ts) ctrs0;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
791  | 
val discs = map (mk_disc_or_sel Ts) discs0;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
792  | 
val selss = map (map (mk_disc_or_sel Ts)) selss0;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
793  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
794  | 
val code_view = drop_all eq;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
795  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
796  | 
fun can_case_expand t = not (can (dest_ctr ctxt T_name) t);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
797  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
798  | 
fun generate_raw_views conds t raw_views =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
799  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
800  | 
fun analyse (ctr :: ctrs) (disc :: discs) ctr' =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
801  | 
if ctr = ctr' then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
802  | 
(conds, disc, ctr)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
803  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
804  | 
analyse ctrs discs ctr';  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
805  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
806  | 
(analyse ctrs discs (fst (strip_comb t))) :: raw_views  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
807  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
808  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
809  | 
fun generate_disc_views raw_views =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
810  | 
if length discs = 1 then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
811  | 
([], [])  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
812  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
813  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
814  | 
fun collect_condss_disc condss [] _ = condss  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
815  | 
| collect_condss_disc condss ((conds, disc', _) :: raw_views) disc =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
816  | 
collect_condss_disc (condss |> disc = disc' ? cons conds) raw_views disc;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
817  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
818  | 
val grouped_disc_views = discs  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
819  | 
|> map (collect_condss_disc [] raw_views)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
820  | 
|> curry (op ~~) (map (fn disc => disc $ lhs) discs);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
821  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
822  | 
fun mk_disc_iff_props props [] = props  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
823  | 
            | mk_disc_iff_props _ ((lhs, @{const HOL.True}) :: _) = [lhs]
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
824  | 
| mk_disc_iff_props props ((lhs, rhs) :: views) =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
825  | 
mk_disc_iff_props ((HOLogic.mk_eq (lhs, rhs)) :: props) views;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
826  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
827  | 
(grouped_disc_views  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
828  | 
|> map swap,  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
829  | 
grouped_disc_views  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
830  | 
|> map (apsnd (s_dnf #> mk_conjs))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
831  | 
|> mk_disc_iff_props []  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
832  | 
|> map (fn eq => ([[]], eq)))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
833  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
834  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
835  | 
fun generate_ctr_views raw_views =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
836  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
837  | 
fun collect_condss_ctr condss [] _ = condss  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
838  | 
| collect_condss_ctr condss ((conds, _, ctr') :: raw_views) ctr =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
839  | 
collect_condss_ctr (condss |> ctr = ctr' ? cons conds) raw_views ctr;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
840  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
841  | 
fun mk_ctr_eq ctr_sels ctr =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
842  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
843  | 
fun extract_arg n sel _(*bound_Ts*) fun_t arg_ts =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
844  | 
if ctr = fun_t then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
845  | 
nth arg_ts n  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
846  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
847  | 
let val t = list_comb (fun_t, arg_ts) in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
848  | 
if can_case_expand t then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
849  | 
sel $ t  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
850  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
851  | 
Term.dummy_pattern (range_type (fastype_of sel))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
852  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
853  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
854  | 
ctr_sels  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
855  | 
|> map_index (uncurry extract_arg)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
856  | 
|> map (fn extract => massage_corec_code_rhs ctxt extract [] rhs)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
857  | 
|> curry list_comb ctr  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
858  | 
|> curry HOLogic.mk_eq lhs  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
859  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
860  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
861  | 
fun remove_condss_if_alone [(_, concl)] = [([[]], concl)]  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
862  | 
| remove_condss_if_alone views = views;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
863  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
864  | 
ctrs  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
865  | 
|> `(map (collect_condss_ctr [] raw_views))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
866  | 
||> map2 mk_ctr_eq selss  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
867  | 
|> op ~~  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
868  | 
|> filter_out (null o fst)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
869  | 
|> remove_condss_if_alone  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
870  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
871  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
872  | 
fun generate_sel_views raw_views only_one_ctr =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
873  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
874  | 
fun mk_sel_positions sel =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
875  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
876  | 
fun get_sel_position _ [] = NONE  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
877  | 
| get_sel_position i (sel' :: sels) =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
878  | 
if sel = sel' then SOME i else get_sel_position (i + 1) sels;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
879  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
880  | 
ctrs ~~ map (get_sel_position 0) selss  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
881  | 
|> map_filter (fn (ctr, pos_opt) =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
882  | 
if is_some pos_opt then SOME (ctr, the pos_opt) else NONE)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
883  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
884  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
885  | 
fun collect_sel_condss0 condss [] _ = condss  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
886  | 
| collect_sel_condss0 condss ((conds, _, ctr) :: raw_views) sel_positions =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
887  | 
let val condss' = condss |> is_some (AList.lookup (op =) sel_positions ctr) ? cons conds  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
888  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
889  | 
collect_sel_condss0 condss' raw_views sel_positions  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
890  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
891  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
892  | 
val collect_sel_condss =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
893  | 
if only_one_ctr then K [[]] else collect_sel_condss0 [] raw_views;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
894  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
895  | 
fun mk_sel_rhs sel_positions sel =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
896  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
897  | 
val sel_T = range_type (fastype_of sel);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
898  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
899  | 
fun extract_sel_value _(*bound_Ts*) fun_t arg_ts =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
900  | 
(case AList.lookup (op =) sel_positions fun_t of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
901  | 
SOME n => nth arg_ts n  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
902  | 
| NONE =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
903  | 
let val t = list_comb (fun_t, arg_ts) in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
904  | 
if can_case_expand t then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
905  | 
sel $ t  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
906  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
907  | 
Term.dummy_pattern sel_T  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
908  | 
end);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
909  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
910  | 
massage_corec_code_rhs ctxt extract_sel_value [] rhs  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
911  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
912  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
913  | 
val ordered_sels = distinct (op =) (flat selss);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
914  | 
val sel_positionss = map mk_sel_positions ordered_sels;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
915  | 
val sel_rhss = map2 mk_sel_rhs sel_positionss ordered_sels;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
916  | 
val sel_lhss = map (rapp lhs o mk_disc_or_sel Ts) ordered_sels;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
917  | 
val sel_condss = map collect_sel_condss sel_positionss;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
918  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
919  | 
        fun is_undefined (Const (@{const_name undefined}, _)) = true
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
920  | 
| is_undefined _ = false;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
921  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
922  | 
sel_condss ~~ (sel_lhss ~~ sel_rhss)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
923  | 
|> filter_out (is_undefined o snd o snd)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
924  | 
|> map (apsnd HOLogic.mk_eq)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
925  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
926  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
927  | 
fun mk_atomic_prop fun_args (condss, concl) =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
928  | 
(Logic.list_all (map dest_Free fun_args, abstract_over_list fun_args  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
929  | 
(Logic.list_implies (map HOLogic.mk_Trueprop (s_dnf condss), HOLogic.mk_Trueprop concl))));  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
930  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
931  | 
val raw_views = rhs  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
932  | 
|> massage_let_if_case ctxt (K false) (fn _(*bound_Ts*) => fn t => t  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
933  | 
|> can_case_expand t ? expand_to_ctr_term ctxt T) (K (K ())) (K I) []  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
934  | 
|> (fn expanded_rhs => fold_rev_let_if_case ctxt generate_raw_views [] expanded_rhs [])  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
935  | 
|> rev;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
936  | 
val (disc_views, disc_iff_views) = generate_disc_views raw_views;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
937  | 
val ctr_views = generate_ctr_views raw_views;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
938  | 
val sel_views = generate_sel_views raw_views (length ctr_views = 1);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
939  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
940  | 
val mk_props = filter_out (null o fst) #> map (mk_atomic_prop lhs_free_args);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
941  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
942  | 
(code_view, mk_props ctr_views, mk_props disc_views, mk_props disc_iff_views,  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
943  | 
mk_props sel_views)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
944  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
945  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
946  | 
fun find_all_associated_types [] _ = []  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
947  | 
| find_all_associated_types ((Type (_, Ts1), Type (_, Ts2)) :: TTs) T =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
948  | 
find_all_associated_types ((Ts1 ~~ Ts2) @ TTs) T  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
949  | 
| find_all_associated_types ((T1, T2) :: TTs) T =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
950  | 
find_all_associated_types TTs T |> T1 = T ? cons T2;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
951  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
952  | 
fun as_member_of tab = try dest_Const #> Option.mapPartial (fst #> Symtab.lookup tab);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
953  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
954  | 
fun extract_rho_from_equation  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
955  | 
    ({ctr_guards, inner_buffer = {Oper, VLeaf, CLeaf, ctr_wrapper, friends}, ...},
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
956  | 
     {pattern_ctrs, discs, sels, it, mk_case})
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
957  | 
b version Y preT ssig_T friend_tm (lhs_args, rhs) lthy =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
958  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
959  | 
val thy = Proof_Context.theory_of lthy;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
960  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
961  | 
val res_T = fastype_of rhs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
962  | 
val YpreT = HOLogic.mk_prodT (Y, preT);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
963  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
964  | 
fun fpT_to new_T T =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
965  | 
if T = res_T then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
966  | 
new_T  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
967  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
968  | 
(case T of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
969  | 
Type (s, Ts) => Type (s, map (fpT_to new_T) Ts)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
970  | 
| _ => T);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
971  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
972  | 
fun build_params bound_Us bound_Ts T =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
973  | 
      {bound_Us = bound_Us, bound_Ts = bound_Ts, U = T, T = T};
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
974  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
975  | 
    fun typ_before explore {bound_Us, bound_Ts, ...} t =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
976  | 
explore (build_params bound_Us bound_Ts (fastype_of1 (bound_Ts, t))) t;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
977  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
978  | 
val is_self_call = curry (op aconv) friend_tm;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
979  | 
val has_self_call = Term.exists_subterm is_self_call;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
980  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
981  | 
fun has_res_T bound_Ts t = fastype_of1 (bound_Ts, t) = res_T;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
982  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
983  | 
fun contains_res_T (Type (s, Ts)) = s = fst (dest_Type res_T) orelse exists contains_res_T Ts  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
984  | 
| contains_res_T _ = false;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
985  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
986  | 
val is_lhs_arg = member (op =) lhs_args;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
987  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
988  | 
fun is_constant t =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
989  | 
not (Term.exists_subterm is_lhs_arg t orelse has_self_call t orelse loose_bvar (t, 0));  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
990  | 
fun is_nested_type T = T <> res_T andalso T <> YpreT andalso T <> ssig_T;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
991  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
992  | 
val is_valid_case_argumentT = not o member (op =) [Y, ssig_T];  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
993  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
994  | 
fun is_same_type_constr (Type (s, _)) (Type (s', _)) = (s = s')  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
995  | 
| is_same_type_constr _ _ = false;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
996  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
997  | 
exception NO_ENCAPSULATION of unit;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
998  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
999  | 
val parametric_consts = Unsynchronized.ref [];  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1000  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1001  | 
(* We are assuming that set functions are marked with "[transfer_rule]" (cf. the "transfer"  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1002  | 
plugin). Otherwise, the "eq_algrho" tactic might fail. *)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1003  | 
fun is_special_parametric_const (x as (s, _)) =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1004  | 
      s = @{const_name id} orelse is_set lthy x;
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1005  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1006  | 
fun add_parametric_const s general_T T U =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1007  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1008  | 
fun tupleT_of_funT T =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1009  | 
let val (Ts, T) = strip_type T in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1010  | 
mk_tupleT_balanced (Ts @ [T])  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1011  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1012  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1013  | 
fun funT_of_tupleT n =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1014  | 
dest_tupleT_balanced (n + 1)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1015  | 
#> split_last  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1016  | 
#> op --->;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1017  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1018  | 
val m = num_binder_types general_T;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1019  | 
val param1_T = Type_Infer.paramify_vars general_T;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1020  | 
val param2_T = Type_Infer.paramify_vars param1_T;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1021  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1022  | 
val deadfixed_T =  | 
| 
64627
 
8d7cb22482e3
generalized ML function (towards nonuniform datatypes)
 
blanchet 
parents: 
64559 
diff
changeset
 | 
1023  | 
build_map lthy [] [] (mk_undefined o op -->) (apply2 tupleT_of_funT (param1_T, param2_T))  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1024  | 
|> singleton (Type_Infer_Context.infer_types lthy)  | 
| 
62958
 
b41c1cb5e251
Type_Infer.object_logic controls improvement of type inference result;
 
wenzelm 
parents: 
62746 
diff
changeset
 | 
1025  | 
|> singleton (Type_Infer.fixate lthy false)  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1026  | 
|> type_of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1027  | 
|> dest_funT  | 
| 62746 | 1028  | 
|-> generalize_types 1  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1029  | 
|> funT_of_tupleT m;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1030  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1031  | 
val j = maxidx_of_typ deadfixed_T + 1;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1032  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1033  | 
fun varifyT (Type (s, Ts)) = Type (s, map varifyT Ts)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1034  | 
| varifyT (TFree (s, T)) = TVar ((s, j), T)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1035  | 
| varifyT T = T;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1036  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1037  | 
val dedvarified_T = varifyT deadfixed_T;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1038  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1039  | 
val new_vars = Sign.typ_match thy (dedvarified_T, T) Vartab.empty  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1040  | 
|> Vartab.dest  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1041  | 
|> filter (curry (op =) j o snd o fst)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1042  | 
|> Vartab.make;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1043  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1044  | 
val deadinstantiated_T = map_atyps (Type.devar new_vars) dedvarified_T;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1045  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1046  | 
val final_T =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1047  | 
if Sign.typ_instance thy (U, deadinstantiated_T) then deadfixed_T else general_T;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1048  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1049  | 
parametric_consts := insert (op =) (s, final_T) (!parametric_consts)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1050  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1051  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1052  | 
    fun encapsulate (params as {U, T, ...}) t =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1053  | 
if U = T then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1054  | 
t  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1055  | 
else if T = Y then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1056  | 
VLeaf $ t  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1057  | 
else if T = res_T then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1058  | 
CLeaf $ t  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1059  | 
else if T = YpreT then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1060  | 
it $ t  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1061  | 
else if is_nested_type T andalso is_same_type_constr T U then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1062  | 
explore_nested lthy encapsulate params t  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1063  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1064  | 
raise NO_ENCAPSULATION ();  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1065  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1066  | 
    fun build_function_after_encapsulation fun_t fun_t' (params as {bound_Us, ...}) arg_ts arg_ts' =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1067  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1068  | 
val arg_Us' = fst (strip_typeN (length arg_ts) (fastype_of1 (bound_Us, fun_t')));  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1069  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1070  | 
fun the_or_error arg NONE =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1071  | 
            error ("Illegal argument " ^ quote (Syntax.string_of_term lthy arg) ^
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1072  | 
" to " ^ quote (Syntax.string_of_term lthy fun_t))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1073  | 
| the_or_error _ (SOME arg') = arg';  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1074  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1075  | 
arg_ts'  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1076  | 
|> `(map (curry fastype_of1 bound_Us))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1077  | 
|>> map2 (update_UT params) arg_Us'  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1078  | 
|> op ~~  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1079  | 
|> map (try (uncurry encapsulate))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1080  | 
|> map2 the_or_error arg_ts  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1081  | 
|> curry list_comb fun_t'  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1082  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1083  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1084  | 
fun rebuild_function_after_exploration old_fn new_fn explore params arg_ts =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1085  | 
arg_ts  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1086  | 
|> map (typ_before explore params)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1087  | 
|> build_function_after_encapsulation old_fn new_fn params arg_ts;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1088  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1089  | 
fun update_case Us U casex =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1090  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1091  | 
val Type (T_name, _) = domain_type (snd (strip_fun_type (fastype_of casex)));  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1092  | 
        val SOME {fp_ctr_sugar = {ctr_sugar = {T = Type (_, Ts), casex, ...}, ...}, ...} =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1093  | 
fp_sugar_of lthy T_name;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1094  | 
val T = body_type (fastype_of casex);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1095  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1096  | 
Term.subst_atomic_types ((T :: Ts) ~~ (U :: Us)) casex  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1097  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1098  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1099  | 
fun deduce_according_type default_T [] = default_T  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1100  | 
| deduce_according_type default_T Ts = (case distinct (op =) Ts of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1101  | 
U :: [] => U  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1102  | 
| _ => fpT_to ssig_T default_T);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1103  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1104  | 
    fun massage_if explore_cond explore (params as {bound_Us, bound_Ts, ...}) t =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1105  | 
(case strip_comb t of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1106  | 
        (const as Const (@{const_name If}, _), obj :: (branches as [_, _])) =>
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1107  | 
(case List.partition Term.is_dummy_pattern (map (explore params) branches) of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1108  | 
(dummy_branch' :: _, []) => dummy_branch'  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1109  | 
| (_, [branch']) => branch'  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1110  | 
| (_, branches') =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1111  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1112  | 
val brancheUs = map (curry fastype_of1 bound_Us) branches';  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1113  | 
val U = deduce_according_type (fastype_of1 (bound_Ts, hd branches)) brancheUs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1114  | 
val const_obj' = (If_const U, obj)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1115  | 
              ||> explore_cond (update_UT params @{typ bool} @{typ bool})
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1116  | 
|> op $;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1117  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1118  | 
build_function_after_encapsulation (const $ obj) const_obj' params branches branches'  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1119  | 
end)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1120  | 
| _ => explore params t);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1121  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1122  | 
    fun massage_map explore (params as {bound_Us, bound_Ts, T = Type (T_name, Ts), ...})
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1123  | 
(t as func $ mapped_arg) =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1124  | 
if is_self_call (head_of func) then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1125  | 
explore params t  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1126  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1127  | 
(case try (dest_map lthy T_name) func of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1128  | 
SOME (map_tm, fs) =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1129  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1130  | 
val n = length fs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1131  | 
val mapped_arg' = mapped_arg  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1132  | 
|> `(curry fastype_of1 bound_Ts)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1133  | 
|>> build_params bound_Us bound_Ts  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1134  | 
|-> explore;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1135  | 
in  | 
| 64559 | 1136  | 
(case fastype_of1 (bound_Us, mapped_arg') of  | 
1137  | 
Type (U_name, Us0) =>  | 
|
1138  | 
if U_name = T_name then  | 
|
1139  | 
let  | 
|
1140  | 
val Us = map (fpT_to ssig_T) Us0;  | 
|
1141  | 
val temporary_map = map_tm  | 
|
1142  | 
|> mk_map n Us Ts;  | 
|
1143  | 
val map_fn_Ts = fastype_of #> strip_fun_type #> fst;  | 
|
1144  | 
val binder_Uss = map_fn_Ts temporary_map  | 
|
1145  | 
|> map (map (fpT_to ssig_T) o binder_types);  | 
|
1146  | 
val fun_paramss = map_fn_Ts (head_of func)  | 
|
1147  | 
|> map (build_params bound_Us bound_Ts);  | 
|
1148  | 
val fs' = fs  | 
|
1149  | 
                      |> @{map 4} explore_fun binder_Uss (replicate n explore) fun_paramss;
 | 
|
1150  | 
val SOME bnf = bnf_of lthy T_name;  | 
|
1151  | 
val Type (_, bnf_Ts) = T_of_bnf bnf;  | 
|
1152  | 
val typ_alist =  | 
|
1153  | 
lives_of_bnf bnf ~~ map (curry fastype_of1 bound_Us #> range_type) fs';  | 
|
1154  | 
val Us' = map2 the_default Us (map (AList.lookup (op =) typ_alist) bnf_Ts);  | 
|
1155  | 
val map_tm' = map_tm |> mk_map n Us Us';  | 
|
1156  | 
in  | 
|
1157  | 
build_function_after_encapsulation func (list_comb (map_tm', fs')) params  | 
|
1158  | 
[mapped_arg] [mapped_arg']  | 
|
1159  | 
end  | 
|
1160  | 
else  | 
|
1161  | 
explore params t  | 
|
1162  | 
| _ => explore params t)  | 
|
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1163  | 
end  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1164  | 
| NONE => explore params t)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1165  | 
| massage_map explore params t = explore params t;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1166  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1167  | 
    fun massage_comp explore (params as {bound_Us, ...}) t =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1168  | 
(case strip_comb t of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1169  | 
        (Const (@{const_name comp}, _), f1 :: f2 :: args) =>
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1170  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1171  | 
val args' = map (typ_before explore params) args;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1172  | 
val f2' = typ_before (explore_fun (map (curry fastype_of1 bound_Us) args') explore) params  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1173  | 
f2;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1174  | 
val f1' = typ_before (explore_fun [range_type (fastype_of1 (bound_Us, f2'))] explore)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1175  | 
params f1;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1176  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1177  | 
betapply (f1', list_comb (f2', args'))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1178  | 
end  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1179  | 
| _ => explore params t);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1180  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1181  | 
    fun massage_ctr explore (params as {T = T as Type (s, Ts), bound_Us, ...}) t =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1182  | 
if T <> res_T then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1183  | 
(case try (dest_ctr lthy s) t of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1184  | 
SOME (ctr, args) =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1185  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1186  | 
val args' = map (typ_before explore params) args;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1187  | 
              val SOME {T = Type (_, ctr_Ts), ...} = ctr_sugar_of lthy s;
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1188  | 
val temp_ctr = mk_ctr ctr_Ts ctr;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1189  | 
val argUs = map (curry fastype_of1 bound_Us) args';  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1190  | 
val typ_alist = binder_types (fastype_of temp_ctr) ~~ argUs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1191  | 
val Us = ctr_Ts  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1192  | 
|> map (find_all_associated_types typ_alist)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1193  | 
|> map2 deduce_according_type Ts;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1194  | 
val ctr' = mk_ctr Us ctr;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1195  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1196  | 
build_function_after_encapsulation ctr ctr' params args args'  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1197  | 
end  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1198  | 
| NONE => explore params t)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1199  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1200  | 
explore params t  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1201  | 
| massage_ctr explore params t = explore params t;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1202  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1203  | 
fun const_of [] _ = NONE  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1204  | 
| const_of ((sel as Const (s1, _)) :: r) (const as Const (s2, _)) =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1205  | 
if s1 = s2 then SOME sel else const_of r const  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1206  | 
| const_of _ _ = NONE;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1207  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1208  | 
    fun massage_disc explore (params as {T, bound_Us, bound_Ts, ...}) t =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1209  | 
      (case (strip_comb t, T = @{typ bool}) of
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1210  | 
((fun_t, arg :: []), true) =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1211  | 
let val arg_T = fastype_of1 (bound_Ts, arg) in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1212  | 
if arg_T <> res_T then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1213  | 
(case arg_T |> try (fst o dest_Type) |> Option.mapPartial (ctr_sugar_of lthy) of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1214  | 
              SOME {discs, T = Type (_, Ts), ...} =>
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1215  | 
(case const_of discs fun_t of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1216  | 
SOME disc =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1217  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1218  | 
val arg' = arg |> typ_before explore params;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1219  | 
val Type (_, Us) = fastype_of1 (bound_Us, arg');  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1220  | 
val disc' = disc |> Term.subst_TVars (map (fst o dest_TVar) Ts ~~ Us);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1221  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1222  | 
disc' $ arg'  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1223  | 
end  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1224  | 
| NONE => explore params t)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1225  | 
| NONE => explore params t)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1226  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1227  | 
explore params t  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1228  | 
end  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1229  | 
| _ => explore params t);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1230  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1231  | 
    fun massage_sel explore (params as {bound_Us, bound_Ts, ...}) t =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1232  | 
let val (fun_t, args) = strip_comb t in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1233  | 
if args = [] then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1234  | 
explore params t  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1235  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1236  | 
let val T = fastype_of1 (bound_Ts, hd args) in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1237  | 
(case (Option.mapPartial (ctr_sugar_of lthy) (try (fst o dest_Type) T), T <> res_T) of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1238  | 
              (SOME {selss, T = Type (_, Ts), ...}, true) =>
 | 
| 63391 | 1239  | 
(case const_of (flat selss) fun_t of  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1240  | 
SOME sel =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1241  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1242  | 
val args' = args |> map (typ_before explore params);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1243  | 
val Type (_, Us) = fastype_of1 (bound_Us, hd args');  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1244  | 
val sel' = sel |> Term.subst_TVars (map (fst o dest_TVar) Ts ~~ Us);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1245  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1246  | 
build_function_after_encapsulation sel sel' params args args'  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1247  | 
end  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1248  | 
| NONE => explore params t)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1249  | 
| _ => explore params t)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1250  | 
end  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1251  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1252  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1253  | 
    fun massage_equality explore (params as {bound_Us, bound_Ts, ...})
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1254  | 
          (t as Const (@{const_name HOL.eq}, _) $ t1 $ t2) =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1255  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1256  | 
val check_is_VLeaf =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1257  | 
not o (Term.exists_subterm (fn t => t aconv CLeaf orelse t aconv Oper));  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1258  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1259  | 
fun try_pattern_matching (fun_t, arg_ts) t =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1260  | 
(case as_member_of pattern_ctrs fun_t of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1261  | 
SOME (disc, sels) =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1262  | 
let val t' = typ_before explore params t in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1263  | 
if fastype_of1 (bound_Us, t') = YpreT then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1264  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1265  | 
val arg_ts' = map (typ_before explore params) arg_ts;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1266  | 
val sels_t' = map (fn sel => betapply (sel, t')) sels;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1267  | 
val Ts = map (curry fastype_of1 bound_Us) arg_ts';  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1268  | 
val Us = map (curry fastype_of1 bound_Us) sels_t';  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1269  | 
val arg_ts' = map2 encapsulate (map2 (update_UT params) Us Ts) arg_ts';  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1270  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1271  | 
if forall check_is_VLeaf arg_ts' then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1272  | 
SOME (Library.foldl1 HOLogic.mk_conj  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1273  | 
(betapply (disc, t') :: (map HOLogic.mk_eq (arg_ts' ~~ sels_t'))))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1274  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1275  | 
NONE  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1276  | 
end  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1277  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1278  | 
NONE  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1279  | 
end  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1280  | 
| NONE => NONE);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1281  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1282  | 
(case try_pattern_matching (strip_comb t1) t2 of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1283  | 
SOME cond => cond  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1284  | 
| NONE => (case try_pattern_matching (strip_comb t2) t1 of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1285  | 
SOME cond => cond  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1286  | 
| NONE =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1287  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1288  | 
val T = fastype_of1 (bound_Ts, t1);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1289  | 
val params' = build_params bound_Us bound_Ts T;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1290  | 
val t1' = explore params' t1;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1291  | 
val t2' = explore params' t2;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1292  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1293  | 
if fastype_of1 (bound_Us, t1') = T andalso fastype_of1 (bound_Us, t2') = T then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1294  | 
HOLogic.mk_eq (t1', t2')  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1295  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1296  | 
                  error ("Unsupported condition: " ^ quote (Syntax.string_of_term lthy t))
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1297  | 
end))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1298  | 
end  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1299  | 
| massage_equality explore params t = explore params t;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1300  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1301  | 
fun infer_types (TVar _) (TVar _) = []  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1302  | 
| infer_types (U as TVar _) T = [(U, T)]  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1303  | 
| infer_types (Type (s', Us)) (Type (s, Ts)) =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1304  | 
if s' = s then flat (map2 infer_types Us Ts) else []  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1305  | 
| infer_types _ _ = [];  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1306  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1307  | 
fun group_by_fst associations [] = associations  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1308  | 
| group_by_fst associations ((a, b) :: r) = group_by_fst (add_association a b associations) r  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1309  | 
and add_association a b [] = [(a, [b])]  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1310  | 
| add_association a b ((c, d) :: r) =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1311  | 
if a = c then (c, b :: d) :: r  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1312  | 
else (c, d) :: (add_association a b r);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1313  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1314  | 
fun new_TVar known_TVars =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1315  | 
Name.invent_list (map (fst o fst o dest_TVar) known_TVars) "x" 1  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1316  | 
|> (fn [s] => TVar ((s, 0), []));  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1317  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1318  | 
fun instantiate_type inferred_types =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1319  | 
Term.typ_subst_TVars (map (apfst (fst o dest_TVar)) inferred_types);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1320  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1321  | 
fun chose_unknown_TVar (T as TVar _) = SOME T  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1322  | 
| chose_unknown_TVar (Type (_, Ts)) =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1323  | 
fold (curry merge_options) (map chose_unknown_TVar Ts) NONE  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1324  | 
| chose_unknown_TVar _ = NONE;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1325  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1326  | 
(* The function under definition might not be defined yet when this is queried. *)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1327  | 
fun maybe_const_type ctxt (s, T) =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1328  | 
Sign.const_type (Proof_Context.theory_of ctxt) s |> the_default T;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1329  | 
|
| 
63188
 
38d6aabec460
more flexible parsing (towards type class support)
 
blanchet 
parents: 
63182 
diff
changeset
 | 
1330  | 
    fun massage_const polymorphic explore (params as {bound_Us, ...}) t =
 | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1331  | 
let val (fun_t, arg_ts) = strip_comb t in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1332  | 
(case fun_t of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1333  | 
Const (fun_x as (s, fun_T)) =>  | 
| 
63188
 
38d6aabec460
more flexible parsing (towards type class support)
 
blanchet 
parents: 
63182 
diff
changeset
 | 
1334  | 
let val general_T = if polymorphic then maybe_const_type lthy fun_x else fun_T in  | 
| 
 
38d6aabec460
more flexible parsing (towards type class support)
 
blanchet 
parents: 
63182 
diff
changeset
 | 
1335  | 
if fun_t aconv friend_tm orelse contains_res_T (body_type general_T) orelse  | 
| 
 
38d6aabec460
more flexible parsing (towards type class support)
 
blanchet 
parents: 
63182 
diff
changeset
 | 
1336  | 
is_constant t then  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1337  | 
explore params t  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1338  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1339  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1340  | 
val inferred_types = infer_types general_T fun_T;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1341  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1342  | 
fun prepare_skeleton [] _ = []  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1343  | 
| prepare_skeleton ((T, U) :: inferred_types) As =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1344  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1345  | 
fun schematize_res_T U As =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1346  | 
if U = res_T then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1347  | 
let val A = new_TVar As in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1348  | 
(A, A :: As)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1349  | 
end  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1350  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1351  | 
(case U of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1352  | 
Type (s, Us) => fold_map schematize_res_T Us As |>> curry Type s  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1353  | 
| _ => (U, As));  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1354  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1355  | 
val (U', As') = schematize_res_T U As;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1356  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1357  | 
(T, U') :: (prepare_skeleton inferred_types As')  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1358  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1359  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1360  | 
val inferred_types' = prepare_skeleton inferred_types (map fst inferred_types);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1361  | 
val skeleton_T = instantiate_type inferred_types' general_T;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1362  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1363  | 
fun explore_if_possible (exp_arg as (_, true)) _ = exp_arg  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1364  | 
| explore_if_possible (exp_arg as (arg, false)) arg_T =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1365  | 
if exists (exists_subtype is_TVar) (binder_types arg_T) then exp_arg  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1366  | 
else (typ_before (explore_fun (binder_types arg_T) explore) params arg, true);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1367  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1368  | 
fun collect_inferred_types [] _ = []  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1369  | 
| collect_inferred_types ((arg, explored) :: exp_arg_ts) (arg_T :: arg_Ts) =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1370  | 
(if explored then infer_types arg_T (fastype_of1 (bound_Us, arg)) else []) @  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1371  | 
collect_inferred_types exp_arg_ts arg_Ts;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1372  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1373  | 
fun propagate exp_arg_ts skeleton_T =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1374  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1375  | 
val arg_gen_Ts = binder_types skeleton_T;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1376  | 
val exp_arg_ts = map2 explore_if_possible exp_arg_ts arg_gen_Ts;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1377  | 
val inferred_types = collect_inferred_types exp_arg_ts arg_gen_Ts  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1378  | 
|> group_by_fst []  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1379  | 
|> map (apsnd (deduce_according_type ssig_T));  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1380  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1381  | 
(exp_arg_ts, instantiate_type inferred_types skeleton_T)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1382  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1383  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1384  | 
val remaining_to_be_explored = filter_out snd #> length;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1385  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1386  | 
fun try_exploring_args exp_arg_ts skeleton_T =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1387  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1388  | 
val n = remaining_to_be_explored exp_arg_ts;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1389  | 
val (exp_arg_ts', skeleton_T') = propagate exp_arg_ts skeleton_T;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1390  | 
val n' = remaining_to_be_explored exp_arg_ts';  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1391  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1392  | 
fun try_instantiating A T =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1393  | 
try (try_exploring_args exp_arg_ts') (instantiate_type [(A, T)] skeleton_T');  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1394  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1395  | 
if n' = 0 then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1396  | 
SOME (exp_arg_ts', skeleton_T')  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1397  | 
else if n = n' then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1398  | 
if exists_subtype is_TVar skeleton_T' then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1399  | 
let val SOME A = chose_unknown_TVar skeleton_T' in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1400  | 
(case try_instantiating A ssig_T of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1401  | 
SOME result => result  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1402  | 
| NONE => (case try_instantiating A YpreT of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1403  | 
SOME result => result  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1404  | 
| NONE => (case try_instantiating A res_T of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1405  | 
SOME result => result  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1406  | 
| NONE => NONE)))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1407  | 
end  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1408  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1409  | 
NONE  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1410  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1411  | 
try_exploring_args exp_arg_ts' skeleton_T'  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1412  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1413  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1414  | 
(case try_exploring_args (map (fn arg => (arg, false)) arg_ts) skeleton_T of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1415  | 
SOME (exp_arg_ts, fun_U) =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1416  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1417  | 
val arg_ts' = map fst exp_arg_ts;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1418  | 
val fun_t' = Const (s, fun_U);  | 
| 
63189
 
d5974697765b
made parsing of monomorphic/polymorphic constants more robust
 
blanchet 
parents: 
63188 
diff
changeset
 | 
1419  | 
|
| 
 
d5974697765b
made parsing of monomorphic/polymorphic constants more robust
 
blanchet 
parents: 
63188 
diff
changeset
 | 
1420  | 
fun finish_off () =  | 
| 
 
d5974697765b
made parsing of monomorphic/polymorphic constants more robust
 
blanchet 
parents: 
63188 
diff
changeset
 | 
1421  | 
let  | 
| 
 
d5974697765b
made parsing of monomorphic/polymorphic constants more robust
 
blanchet 
parents: 
63188 
diff
changeset
 | 
1422  | 
val t' =  | 
| 
 
d5974697765b
made parsing of monomorphic/polymorphic constants more robust
 
blanchet 
parents: 
63188 
diff
changeset
 | 
1423  | 
build_function_after_encapsulation fun_t fun_t' params arg_ts arg_ts';  | 
| 
 
d5974697765b
made parsing of monomorphic/polymorphic constants more robust
 
blanchet 
parents: 
63188 
diff
changeset
 | 
1424  | 
in  | 
| 
 
d5974697765b
made parsing of monomorphic/polymorphic constants more robust
 
blanchet 
parents: 
63188 
diff
changeset
 | 
1425  | 
if can type_of1 (bound_Us, t') then  | 
| 
 
d5974697765b
made parsing of monomorphic/polymorphic constants more robust
 
blanchet 
parents: 
63188 
diff
changeset
 | 
1426  | 
(if fun_T = fun_U orelse is_special_parametric_const (s, fun_T) then ()  | 
| 
 
d5974697765b
made parsing of monomorphic/polymorphic constants more robust
 
blanchet 
parents: 
63188 
diff
changeset
 | 
1427  | 
else add_parametric_const s general_T fun_T fun_U;  | 
| 
 
d5974697765b
made parsing of monomorphic/polymorphic constants more robust
 
blanchet 
parents: 
63188 
diff
changeset
 | 
1428  | 
t')  | 
| 
 
d5974697765b
made parsing of monomorphic/polymorphic constants more robust
 
blanchet 
parents: 
63188 
diff
changeset
 | 
1429  | 
else  | 
| 
 
d5974697765b
made parsing of monomorphic/polymorphic constants more robust
 
blanchet 
parents: 
63188 
diff
changeset
 | 
1430  | 
explore params t  | 
| 
 
d5974697765b
made parsing of monomorphic/polymorphic constants more robust
 
blanchet 
parents: 
63188 
diff
changeset
 | 
1431  | 
end;  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1432  | 
in  | 
| 
63189
 
d5974697765b
made parsing of monomorphic/polymorphic constants more robust
 
blanchet 
parents: 
63188 
diff
changeset
 | 
1433  | 
if polymorphic then  | 
| 
 
d5974697765b
made parsing of monomorphic/polymorphic constants more robust
 
blanchet 
parents: 
63188 
diff
changeset
 | 
1434  | 
finish_off ()  | 
| 
63188
 
38d6aabec460
more flexible parsing (towards type class support)
 
blanchet 
parents: 
63182 
diff
changeset
 | 
1435  | 
else  | 
| 
63189
 
d5974697765b
made parsing of monomorphic/polymorphic constants more robust
 
blanchet 
parents: 
63188 
diff
changeset
 | 
1436  | 
(case try finish_off () of  | 
| 
 
d5974697765b
made parsing of monomorphic/polymorphic constants more robust
 
blanchet 
parents: 
63188 
diff
changeset
 | 
1437  | 
SOME t' => t'  | 
| 
 
d5974697765b
made parsing of monomorphic/polymorphic constants more robust
 
blanchet 
parents: 
63188 
diff
changeset
 | 
1438  | 
| NONE => explore params t)  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1439  | 
end  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1440  | 
| NONE => explore params t)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1441  | 
end  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1442  | 
end  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1443  | 
| _ => explore params t)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1444  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1445  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1446  | 
fun massage_rho explore =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1447  | 
massage_star [massage_let, massage_if explore_cond, massage_case, massage_fun, massage_comp,  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1448  | 
massage_map, massage_ctr, massage_sel, massage_disc, massage_equality,  | 
| 
63188
 
38d6aabec460
more flexible parsing (towards type class support)
 
blanchet 
parents: 
63182 
diff
changeset
 | 
1449  | 
massage_const false, massage_const true]  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1450  | 
explore  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1451  | 
    and massage_case explore (params as {bound_Ts, bound_Us, ...}) t =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1452  | 
(case strip_comb t of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1453  | 
(casex as Const (case_x as (c, _)), args as _ :: _ :: _) =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1454  | 
(case try strip_fun_type (maybe_const_type lthy case_x) of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1455  | 
SOME (gen_branch_Ts, gen_body_fun_T) =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1456  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1457  | 
val gen_branch_ms = map num_binder_types gen_branch_Ts;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1458  | 
val n = length gen_branch_ms;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1459  | 
val (branches, obj_leftovers) = chop n args;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1460  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1461  | 
if n < length args then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1462  | 
(case gen_body_fun_T of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1463  | 
Type (_, [Type (T_name, _), _]) =>  | 
| 62728 | 1464  | 
if case_of lthy T_name = SOME (c, true) then  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1465  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1466  | 
val brancheTs = binder_fun_types (fastype_of1 (bound_Ts, casex));  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1467  | 
val obj_leftover_Ts = map (curry fastype_of1 bound_Ts) obj_leftovers;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1468  | 
val obj_leftovers' =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1469  | 
if is_constant (hd obj_leftovers) then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1470  | 
obj_leftovers  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1471  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1472  | 
(obj_leftover_Ts, obj_leftovers)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1473  | 
|>> map (build_params bound_Us bound_Ts)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1474  | 
|> op ~~  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1475  | 
|> map (uncurry explore_inner);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1476  | 
val obj_leftoverUs = obj_leftovers' |> map (curry fastype_of1 bound_Us);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1477  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1478  | 
val _ = is_valid_case_argumentT (hd obj_leftoverUs) orelse  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1479  | 
error (quote (Syntax.string_of_term lthy (hd obj_leftovers)) ^  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1480  | 
" is not a valid case argument");  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1481  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1482  | 
val Us = obj_leftoverUs |> hd |> dest_Type |> snd;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1483  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1484  | 
val branche_binderUss =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1485  | 
(if hd obj_leftoverUs = YpreT then mk_case HOLogic.boolT  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1486  | 
else update_case Us HOLogic.boolT casex)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1487  | 
|> fastype_of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1488  | 
|> binder_fun_types  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1489  | 
|> map binder_types;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1490  | 
val b_params = map (build_params bound_Us bound_Ts) brancheTs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1491  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1492  | 
val branches' = branches  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1493  | 
                      |> @{map 4} explore_fun branche_binderUss (replicate n explore) b_params;
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1494  | 
val brancheUs = map (curry fastype_of1 bound_Us) branches';  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1495  | 
val U = deduce_according_type (body_type (hd brancheTs))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1496  | 
(map body_type brancheUs);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1497  | 
val casex' =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1498  | 
if hd obj_leftoverUs = YpreT then mk_case U else update_case Us U casex;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1499  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1500  | 
build_function_after_encapsulation casex casex' params  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1501  | 
(branches @ obj_leftovers) (branches' @ obj_leftovers')  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1502  | 
end  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1503  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1504  | 
explore params t  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1505  | 
| _ => explore params t)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1506  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1507  | 
explore params t  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1508  | 
end  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1509  | 
| NONE => explore params t)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1510  | 
| _ => explore params t)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1511  | 
and explore_cond params t =  | 
| 
64705
 
7596b0736ab9
more uniform errors in '(prim)(co)rec(ursive)' variants
 
blanchet 
parents: 
64674 
diff
changeset
 | 
1512  | 
if has_self_call t then unexpected_rec_call_in lthy [] t else explore_inner params t  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1513  | 
and explore_inner params t =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1514  | 
massage_rho explore_inner_general params t  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1515  | 
    and explore_inner_general (params as {bound_Us, bound_Ts, T, ...}) t =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1516  | 
let val (fun_t, arg_ts) = strip_comb t in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1517  | 
if is_constant t then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1518  | 
t  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1519  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1520  | 
(case (as_member_of discs fun_t,  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1521  | 
length arg_ts = 1 andalso has_res_T bound_Ts (the_single arg_ts)) of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1522  | 
(SOME disc', true) =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1523  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1524  | 
val arg' = explore_inner params (the_single arg_ts);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1525  | 
val arg_U = fastype_of1 (bound_Us, arg');  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1526  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1527  | 
if arg_U = res_T then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1528  | 
fun_t $ arg'  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1529  | 
else if arg_U = YpreT then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1530  | 
disc' $ arg'  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1531  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1532  | 
                error ("Discriminator " ^ quote (Syntax.string_of_term lthy fun_t) ^
 | 
| 
64705
 
7596b0736ab9
more uniform errors in '(prim)(co)rec(ursive)' variants
 
blanchet 
parents: 
64674 
diff
changeset
 | 
1533  | 
" cannot be applied to non-variable " ^  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1534  | 
quote (Syntax.string_of_term lthy (hd arg_ts)))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1535  | 
end  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1536  | 
| _ =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1537  | 
(case as_member_of sels fun_t of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1538  | 
SOME sel' =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1539  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1540  | 
val arg_ts' = map (explore_inner params) arg_ts;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1541  | 
val arg_U = fastype_of1 (bound_Us, hd arg_ts');  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1542  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1543  | 
if arg_U = res_T then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1544  | 
build_function_after_encapsulation fun_t fun_t params arg_ts arg_ts'  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1545  | 
else if arg_U = YpreT then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1546  | 
build_function_after_encapsulation fun_t sel' params arg_ts arg_ts'  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1547  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1548  | 
                  error ("Selector " ^ quote (Syntax.string_of_term lthy fun_t) ^
 | 
| 
64705
 
7596b0736ab9
more uniform errors in '(prim)(co)rec(ursive)' variants
 
blanchet 
parents: 
64674 
diff
changeset
 | 
1549  | 
" cannot be applied to non-variable " ^  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1550  | 
quote (Syntax.string_of_term lthy (hd arg_ts)))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1551  | 
end  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1552  | 
| NONE =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1553  | 
(case as_member_of friends fun_t of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1554  | 
SOME (_, friend') =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1555  | 
rebuild_function_after_exploration fun_t friend' explore_inner params arg_ts  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1556  | 
|> curry (op $) Oper  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1557  | 
| NONE =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1558  | 
(case as_member_of ctr_guards fun_t of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1559  | 
SOME ctr_guard' =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1560  | 
rebuild_function_after_exploration fun_t ctr_guard' explore_inner params arg_ts  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1561  | 
|> curry (op $) ctr_wrapper  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1562  | 
|> curry (op $) Oper  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1563  | 
| NONE =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1564  | 
if is_Bound fun_t then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1565  | 
rebuild_function_after_exploration fun_t fun_t explore_inner params arg_ts  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1566  | 
else if is_Free fun_t then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1567  | 
let val fun_t' = map_types (fpT_to YpreT) fun_t in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1568  | 
rebuild_function_after_exploration fun_t fun_t' explore_inner params arg_ts  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1569  | 
end  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1570  | 
else if T = res_T then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1571  | 
error (quote (Syntax.string_of_term lthy fun_t) ^  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1572  | 
" not polymorphic enough to be applied like this and no friend")  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1573  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1574  | 
error (quote (Syntax.string_of_term lthy fun_t) ^  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1575  | 
" not polymorphic enough to be applied like this")))))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1576  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1577  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1578  | 
fun explore_ctr params t =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1579  | 
massage_rho explore_ctr_general params t  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1580  | 
and explore_ctr_general params t =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1581  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1582  | 
val (fun_t, arg_ts) = strip_comb t;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1583  | 
val ctr_opt = as_member_of ctr_guards fun_t;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1584  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1585  | 
if is_some ctr_opt then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1586  | 
rebuild_function_after_exploration fun_t (the ctr_opt) explore_inner params arg_ts  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1587  | 
else  | 
| 
64705
 
7596b0736ab9
more uniform errors in '(prim)(co)rec(ursive)' variants
 
blanchet 
parents: 
64674 
diff
changeset
 | 
1588  | 
not_constructor_in_rhs lthy [] fun_t  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1589  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1590  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1591  | 
val rho_rhs = rhs  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1592  | 
|> explore_ctr (build_params [] [] (fastype_of rhs))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1593  | 
|> abs_tuple_balanced (map (map_types (fpT_to YpreT)) lhs_args)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1594  | 
|> unfold_id_bnf_etc lthy;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1595  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1596  | 
lthy  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1597  | 
|> define_const false b version rhoN rho_rhs  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1598  | 
|>> pair (!parametric_consts, rho_rhs)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1599  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1600  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1601  | 
fun mk_rho_parametricity_goal ctxt Y Z preT ssig_T dead_pre_rel dead_k_rel dead_ssig_rel rho_rhs =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1602  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1603  | 
val YpreT = HOLogic.mk_prodT (Y, preT);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1604  | 
val ZpreT = Tsubst Y Z YpreT;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1605  | 
val ssigZ_T = Tsubst Y Z ssig_T;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1606  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1607  | 
val dead_pre_rel' = Term.subst_atomic_types [(Y, ssig_T), (Z, ssigZ_T)] dead_pre_rel;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1608  | 
val dead_k_rel' = Term.subst_atomic_types [(Y, YpreT), (Z, ZpreT)] dead_k_rel;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1609  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1610  | 
val (R, _) = ctxt  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1611  | 
|> yield_singleton (mk_Frees "R") (mk_pred2T Y Z);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1612  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1613  | 
val rho_rel = mk_rel_fun (dead_k_rel' $ mk_rel_prod R (dead_pre_rel $ R))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1614  | 
(dead_pre_rel' $ (dead_ssig_rel $ R));  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1615  | 
val rho_rhsZ = substT Y Z rho_rhs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1616  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1617  | 
HOLogic.mk_Trueprop (rho_rel $ rho_rhs $ rho_rhsZ)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1618  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1619  | 
|
| 
64705
 
7596b0736ab9
more uniform errors in '(prim)(co)rec(ursive)' variants
 
blanchet 
parents: 
64674 
diff
changeset
 | 
1620  | 
fun extract_rho_return_transfer_goals fun_b version dead_pre_bnf dead_k_bnf Y Z preT k_T ssig_T  | 
| 
 
7596b0736ab9
more uniform errors in '(prim)(co)rec(ursive)' variants
 
blanchet 
parents: 
64674 
diff
changeset
 | 
1621  | 
ssig_fp_sugar friend_parse_info fun_t parsed_eq lthy =  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1622  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1623  | 
fun mk_rel T bnf =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1624  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1625  | 
val ZT = Tsubst Y Z T;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1626  | 
val rel_T = mk_predT [mk_pred2T Y Z, T, ZT];  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1627  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1628  | 
enforce_type lthy I rel_T (rel_of_bnf bnf)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1629  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1630  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1631  | 
val ssig_bnf = #fp_bnf ssig_fp_sugar;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1632  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1633  | 
val (dead_ssig_bnf, lthy) = bnf_kill_all_but 1 ssig_bnf lthy;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1634  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1635  | 
val dead_pre_rel = mk_rel preT dead_pre_bnf;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1636  | 
val dead_k_rel = mk_rel k_T dead_k_bnf;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1637  | 
val dead_ssig_rel = mk_rel ssig_T dead_ssig_bnf;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1638  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1639  | 
val (((parametric_consts, rho_rhs), rho_data), lthy) =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1640  | 
extract_rho_from_equation friend_parse_info fun_b version Y preT ssig_T fun_t parsed_eq lthy;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1641  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1642  | 
val const_transfer_goals = map (mk_const_transfer_goal lthy) parametric_consts;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1643  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1644  | 
val rho_transfer_goal =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1645  | 
mk_rho_parametricity_goal lthy Y Z preT ssig_T dead_pre_rel dead_k_rel dead_ssig_rel rho_rhs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1646  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1647  | 
((rho_data, (const_transfer_goals, rho_transfer_goal)), lthy)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1648  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1649  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1650  | 
fun explore_corec_equation ctxt could_be_friend friend fun_name fun_free  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1651  | 
    {outer_buffer, ctr_guards, inner_buffer} res_T (args, rhs) =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1652  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1653  | 
val is_self_call = curry (op aconv) fun_free;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1654  | 
val has_self_call = Term.exists_subterm is_self_call;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1655  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1656  | 
val outer_ssig_T = body_type (fastype_of (#Oper outer_buffer));  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1657  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1658  | 
fun inner_fp_of (Free (s, _)) =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1659  | 
Free (s ^ inner_fp_suffix, mk_tupleT_balanced (map fastype_of args) --> outer_ssig_T);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1660  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1661  | 
fun build_params bound_Ts U T =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1662  | 
      {bound_Us = bound_Ts, bound_Ts = bound_Ts, U = U, T = T};
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1663  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1664  | 
    fun rebuild_function_after_exploration new_fn explore {bound_Ts, ...} arg_ts =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1665  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1666  | 
val binder_types_old_fn = map (curry fastype_of1 bound_Ts) arg_ts;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1667  | 
val binder_types_new_fn = new_fn  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1668  | 
|> binder_types o (curry fastype_of1 bound_Ts)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1669  | 
|> take (length binder_types_old_fn);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1670  | 
val paramss =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1671  | 
map2 (build_params bound_Ts) binder_types_new_fn binder_types_old_fn;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1672  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1673  | 
map2 explore paramss arg_ts  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1674  | 
|> curry list_comb new_fn  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1675  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1676  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1677  | 
    fun massage_map_corec explore {bound_Ts, U, T, ...} t =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1678  | 
let val explore' = explore ooo build_params in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1679  | 
massage_nested_corec_call ctxt has_self_call explore' explore' bound_Ts U T t  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1680  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1681  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1682  | 
fun massage_comp explore params t =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1683  | 
(case strip_comb t of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1684  | 
        (Const (@{const_name comp}, _), f1 :: f2 :: args) =>
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1685  | 
explore params (betapply (f1, (betapplys (f2, args))))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1686  | 
| _ => explore params t);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1687  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1688  | 
    fun massage_fun explore (params as {bound_Us, bound_Ts, U, T}) t =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1689  | 
if can dest_funT T then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1690  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1691  | 
val arg_T = domain_type T;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1692  | 
val arg_name = the_default Name.uu (try (fn (Abs (s, _, _)) => s) t);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1693  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1694  | 
add_boundvar t  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1695  | 
          |> explore {bound_Us = arg_T :: bound_Us, bound_Ts = arg_T :: bound_Ts,
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1696  | 
U = range_type U, T = range_type T}  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1697  | 
|> (fn t => Abs (arg_name, arg_T, t))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1698  | 
end  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1699  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1700  | 
explore params t  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1701  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1702  | 
    fun massage_let_if_case_corec explore {bound_Ts, U, T, ...} t =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1703  | 
massage_let_if_case ctxt has_self_call (fn bound_Ts => explore (build_params bound_Ts U T))  | 
| 
64705
 
7596b0736ab9
more uniform errors in '(prim)(co)rec(ursive)' variants
 
blanchet 
parents: 
64674 
diff
changeset
 | 
1704  | 
(K (unexpected_corec_call_in ctxt [t])) (K (unsupported_case_around_corec_call ctxt [t]))  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1705  | 
bound_Ts t;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1706  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1707  | 
val massage_map_let_if_case =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1708  | 
massage_star [massage_map_corec, massage_fun, massage_comp, massage_let_if_case_corec];  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1709  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1710  | 
fun explore_arg _ t =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1711  | 
if has_self_call t then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1712  | 
error (quote (Syntax.string_of_term ctxt t) ^ " contains a nested corecursive call" ^  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1713  | 
(if could_be_friend then " (try specifying \"(friend)\")" else ""))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1714  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1715  | 
t;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1716  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1717  | 
fun explore_inner params t =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1718  | 
massage_map_let_if_case explore_inner_general params t  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1719  | 
    and explore_inner_general (params as {bound_Ts, T, ...}) t =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1720  | 
if T = res_T then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1721  | 
let val (f_t, arg_ts) = strip_comb t in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1722  | 
if has_self_call t then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1723  | 
(case as_member_of (#friends inner_buffer) f_t of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1724  | 
SOME (_, friend') =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1725  | 
rebuild_function_after_exploration friend' explore_inner params arg_ts  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1726  | 
|> curry (op $) (#Oper inner_buffer)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1727  | 
| NONE =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1728  | 
(case as_member_of ctr_guards f_t of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1729  | 
SOME ctr_guard' =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1730  | 
rebuild_function_after_exploration ctr_guard' explore_inner params arg_ts  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1731  | 
|> curry (op $) (#ctr_wrapper inner_buffer)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1732  | 
|> curry (op $) (#Oper inner_buffer)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1733  | 
| NONE =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1734  | 
if is_self_call f_t then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1735  | 
if friend andalso exists has_self_call arg_ts then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1736  | 
(case Symtab.lookup (#friends inner_buffer) fun_name of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1737  | 
SOME (_, friend') =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1738  | 
rebuild_function_after_exploration friend' explore_inner params arg_ts  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1739  | 
|> curry (op $) (#Oper inner_buffer))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1740  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1741  | 
let val arg_Ts = binder_types (fastype_of1 (bound_Ts, f_t)) in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1742  | 
map2 explore_arg (map2 (update_UT params) arg_Ts arg_Ts) arg_ts  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1743  | 
|> mk_tuple1_balanced bound_Ts  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1744  | 
|> curry (op $) (#VLeaf inner_buffer)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1745  | 
end  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1746  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1747  | 
error (quote (Syntax.string_of_term ctxt f_t) ^ " not registered as friend")))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1748  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1749  | 
#CLeaf inner_buffer $ t  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1750  | 
end  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1751  | 
else if has_self_call t then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1752  | 
error (quote (Syntax.string_of_term ctxt t) ^ " contains a corecursive call but has type " ^  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1753  | 
quote (Syntax.string_of_typ ctxt T))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1754  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1755  | 
explore_nested ctxt explore_inner_general params t;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1756  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1757  | 
fun explore_outer params t =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1758  | 
massage_map_let_if_case explore_outer_general params t  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1759  | 
    and explore_outer_general (params as {bound_Ts, T, ...}) t =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1760  | 
if T = res_T then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1761  | 
let val (f_t, arg_ts) = strip_comb t in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1762  | 
(case as_member_of ctr_guards f_t of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1763  | 
SOME ctr_guard' =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1764  | 
rebuild_function_after_exploration ctr_guard' explore_inner params arg_ts  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1765  | 
|> curry (op $) (#VLeaf outer_buffer)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1766  | 
| NONE =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1767  | 
if not (has_self_call t) then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1768  | 
t  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1769  | 
|> expand_to_ctr_term ctxt T  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1770  | 
|> massage_let_if_case_corec explore_outer_general params  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1771  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1772  | 
(case as_member_of (#friends outer_buffer) f_t of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1773  | 
SOME (_, friend') =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1774  | 
rebuild_function_after_exploration friend' explore_outer params arg_ts  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1775  | 
|> curry (op $) (#Oper outer_buffer)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1776  | 
| NONE =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1777  | 
if is_self_call f_t then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1778  | 
let val arg_Ts = binder_types (fastype_of1 (bound_Ts, f_t)) in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1779  | 
map2 explore_arg (map2 (update_UT params) arg_Ts arg_Ts) arg_ts  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1780  | 
|> mk_tuple1_balanced bound_Ts  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1781  | 
|> curry (op $) (inner_fp_of f_t)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1782  | 
end  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1783  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1784  | 
error (quote (Syntax.string_of_term ctxt f_t) ^ " not registered as friend")))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1785  | 
end  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1786  | 
else if has_self_call t then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1787  | 
error (quote (Syntax.string_of_term ctxt t) ^ " contains a corecursive call but has type " ^  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1788  | 
quote (Syntax.string_of_typ ctxt T))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1789  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1790  | 
explore_nested ctxt explore_outer_general params t;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1791  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1792  | 
(args, rhs  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1793  | 
|> explore_outer (build_params [] outer_ssig_T res_T)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1794  | 
|> abs_tuple_balanced args)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1795  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1796  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1797  | 
fun mk_corec_fun_def_rhs ctxt arg_Ts corecUU0 corecUU_arg =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1798  | 
let val corecUU = enforce_type ctxt domain_type (fastype_of corecUU_arg) corecUU0 in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1799  | 
abs_curried_balanced arg_Ts (corecUU $ unfold_id_bnf_etc ctxt corecUU_arg)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1800  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1801  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1802  | 
fun get_options ctxt opts =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1803  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1804  | 
val plugins = get_first (fn Plugins_Option f => SOME (f ctxt) | _ => NONE) (rev opts)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1805  | 
|> the_default Plugin_Name.default_filter;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1806  | 
val friend = exists (can (fn Friend_Option => ())) opts;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1807  | 
val transfer = exists (can (fn Transfer_Option => ())) opts;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1808  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1809  | 
(plugins, friend, transfer)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1810  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1811  | 
|
| 63004 | 1812  | 
fun add_function binding parsed_eq lthy =  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1813  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1814  | 
fun pat_completeness_auto ctxt =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1815  | 
Pat_Completeness.pat_completeness_tac ctxt 1 THEN auto_tac ctxt;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1816  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1817  | 
    val ({defname, pelims = [[pelim]], pinducts = [pinduct], psimps = [psimp], ...}, lthy) =
 | 
| 63004 | 1818  | 
Function.add_function [(Binding.concealed binding, NONE, NoSyn)]  | 
| 63182 | 1819  | 
[(((Binding.concealed Binding.empty, []), parsed_eq), [], [])]  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1820  | 
Function_Common.default_config pat_completeness_auto lthy;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1821  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1822  | 
((defname, (pelim, pinduct, psimp)), lthy)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1823  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1824  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1825  | 
fun build_corecUU_arg_and_goals prove_termin (Free (fun_base_name, _)) (arg_ts, explored_rhs) lthy =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1826  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1827  | 
val inner_fp_name0 = fun_base_name ^ inner_fp_suffix;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1828  | 
val inner_fp_free = Free (inner_fp_name0, fastype_of explored_rhs);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1829  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1830  | 
if Term.exists_subterm (curry (op aconv) inner_fp_free) explored_rhs then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1831  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1832  | 
val arg = mk_tuple_balanced arg_ts;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1833  | 
val inner_fp_eq =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1834  | 
mk_Trueprop_eq (betapply (inner_fp_free, arg), betapply (explored_rhs, arg));  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1835  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1836  | 
val ((inner_fp_name, (pelim, pinduct, psimp)), lthy') =  | 
| 63004 | 1837  | 
add_function (Binding.name inner_fp_name0) inner_fp_eq lthy;  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1838  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1839  | 
fun mk_triple elim induct simp = ([elim], [induct], [simp]);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1840  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1841  | 
fun prepare_termin () =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1842  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1843  | 
            val {goal, ...} = Proof.goal (Function.termination NONE lthy');
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1844  | 
val termin_goal = goal |> Thm.concl_of |> Logic.unprotect |> Envir.beta_eta_contract;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1845  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1846  | 
(lthy', (mk_triple pelim pinduct psimp, [termin_goal]))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1847  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1848  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1849  | 
val (lthy'', (inner_fp_triple, termin_goals)) =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1850  | 
if prove_termin then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1851  | 
(case try (Function.prove_termination NONE  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1852  | 
(Function_Common.termination_prover_tac true lthy')) lthy' of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1853  | 
NONE => prepare_termin ()  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1854  | 
            | SOME ({elims = SOME [[elim]], inducts = SOME [induct], simps = SOME [simp], ...},
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1855  | 
lthy'') =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1856  | 
(lthy'', (mk_triple elim induct simp, [])))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1857  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1858  | 
prepare_termin ();  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1859  | 
|
| 63004 | 1860  | 
val inner_fp_const = (Binding.name_of inner_fp_name, fastype_of explored_rhs)  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1861  | 
          |>> Proof_Context.read_const {proper = true, strict = false} lthy'
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1862  | 
|> (fn (Const (s, _), T) => Const (s, T));  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1863  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1864  | 
(((inner_fp_triple, termin_goals), inner_fp_const), lthy'')  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1865  | 
end  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1866  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1867  | 
(((([], [], []), []), explored_rhs), lthy)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1868  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1869  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1870  | 
fun derive_eq_corecUU ctxt {sig_fp_sugars, ssig_fp_sugar, eval, corecUU, eval_simps,
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1871  | 
all_algLam_algs, corecUU_unique, ...}  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1872  | 
fun_t corecUU_arg fun_code =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1873  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1874  | 
val fun_T = fastype_of fun_t;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1875  | 
val (arg_Ts, Type (fpT_name, _)) = strip_type fun_T;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1876  | 
val num_args = length arg_Ts;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1877  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1878  | 
    val SOME {pre_bnf, fp_bnf, absT_info, fp_nesting_bnfs, live_nesting_bnfs, fp_ctr_sugar, ...} =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1879  | 
fp_sugar_of ctxt fpT_name;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1880  | 
    val SOME {case_trivial, ...} = codatatype_extra_of ctxt fpT_name;
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1881  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1882  | 
val ctr_sugar = #ctr_sugar fp_ctr_sugar;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1883  | 
val pre_map_def = map_def_of_bnf pre_bnf;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1884  | 
val abs_inverse = #abs_inverse absT_info;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1885  | 
val ctr_defs = #ctr_defs fp_ctr_sugar;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1886  | 
val case_eq_ifs = #case_eq_ifs ctr_sugar @ case_eq_if_thms_of_term ctxt (Thm.prop_of fun_code);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1887  | 
val all_sig_map_thms = maps (#map_thms o #fp_bnf_sugar) sig_fp_sugars;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1888  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1889  | 
val fp_map_ident = map_ident_of_bnf fp_bnf;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1890  | 
val fpsig_nesting_bnfs = fp_nesting_bnfs @ maps #live_nesting_bnfs sig_fp_sugars;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1891  | 
val fpsig_nesting_T_names = map (fst o dest_Type o T_of_bnf) fpsig_nesting_bnfs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1892  | 
val fpsig_nesting_fp_sugars = map_filter (fp_sugar_of ctxt) fpsig_nesting_T_names;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1893  | 
val fpsig_nesting_fp_bnf_sugars = map #fp_bnf_sugar fpsig_nesting_fp_sugars;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1894  | 
val ssig_fp_bnf_sugar = #fp_bnf_sugar ssig_fp_sugar;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1895  | 
val ssig_bnf = #fp_bnf ssig_fp_sugar;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1896  | 
val ssig_map = map_of_bnf ssig_bnf;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1897  | 
val fpsig_nesting_maps = map map_of_bnf fpsig_nesting_bnfs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1898  | 
val fpsig_nesting_map_ident0s = map map_ident0_of_bnf fpsig_nesting_bnfs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1899  | 
val fpsig_nesting_map_comps = map map_comp_of_bnf fpsig_nesting_bnfs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1900  | 
val fpsig_nesting_map_thms = maps #map_thms fpsig_nesting_fp_bnf_sugars;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1901  | 
val live_nesting_map_ident0s = map map_ident0_of_bnf live_nesting_bnfs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1902  | 
val ssig_map_thms = #map_thms ssig_fp_bnf_sugar;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1903  | 
val all_algLam_alg_pointfuls = map (mk_pointful ctxt) all_algLam_algs;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1904  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1905  | 
val def_rhs = mk_corec_fun_def_rhs ctxt arg_Ts corecUU corecUU_arg;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1906  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1907  | 
val goal = mk_Trueprop_eq (fun_t, def_rhs);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1908  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1909  | 
    Goal.prove_sorry ctxt [] [] goal (fn {context = ctxt, prems = _} =>
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1910  | 
mk_eq_corecUU_tac ctxt num_args fpsig_nesting_maps ssig_map eval pre_map_def abs_inverse  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1911  | 
fpsig_nesting_map_ident0s fpsig_nesting_map_comps fpsig_nesting_map_thms  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1912  | 
live_nesting_map_ident0s fp_map_ident case_trivial ctr_defs case_eq_ifs all_sig_map_thms  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1913  | 
ssig_map_thms all_algLam_alg_pointfuls (all_algrho_eqs_of ctxt) eval_simps corecUU_unique  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1914  | 
fun_code)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1915  | 
|> Thm.close_derivation  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1916  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1917  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1918  | 
fun derive_coinduct_cong_intros  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1919  | 
    ({fpT = fpT0 as Type (fpT_name, _), friend_names = friend_names0,
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1920  | 
      corecUU = Const (corecUU_name, _), dtor_coinduct_info as {dtor_coinduct, ...}, ...})
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1921  | 
lthy =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1922  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1923  | 
val thy = Proof_Context.theory_of lthy;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1924  | 
val phi = Proof_Context.export_morphism lthy (Local_Theory.target_of lthy);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1925  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1926  | 
val fpT = Morphism.typ phi fpT0;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1927  | 
val general_fpT = body_type (Sign.the_const_type thy corecUU_name);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1928  | 
val most_general = Sign.typ_instance thy (general_fpT, fpT);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1929  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1930  | 
(case (most_general, coinduct_extra_of lthy corecUU_name) of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1931  | 
(true, SOME extra) => ((false, extra), lthy)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1932  | 
| _ =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1933  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1934  | 
val ctr_names = ctr_names_of_fp_name lthy fpT_name;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1935  | 
val friend_names = friend_names0 |> map Long_Name.base_name |> rev;  | 
| 62743 | 1936  | 
val cong_intro_pairs = derive_cong_intros lthy ctr_names friend_names dtor_coinduct_info;  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1937  | 
val (coinduct, coinduct_attrs) = derive_coinduct lthy fpT0 dtor_coinduct;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1938  | 
val ((_, [coinduct]), lthy) = (* TODO check: only if most_general?*)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1939  | 
Local_Theory.note ((Binding.empty, coinduct_attrs), [coinduct]) lthy;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1940  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1941  | 
        val extra = {coinduct = coinduct, coinduct_attrs = coinduct_attrs,
 | 
| 62743 | 1942  | 
cong_intro_pairs = cong_intro_pairs};  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1943  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1944  | 
((most_general, extra), lthy |> most_general ? register_coinduct_extra corecUU_name extra)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1945  | 
end)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1946  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1947  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1948  | 
fun update_coinduct_cong_intross_dynamic fpT_name lthy =  | 
| 62699 | 1949  | 
let val all_corec_infos = corec_infos_of lthy fpT_name in  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1950  | 
lthy  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1951  | 
|> fold_map (apfst snd oo derive_coinduct_cong_intros) all_corec_infos  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1952  | 
|> snd  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1953  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1954  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1955  | 
fun derive_and_update_coinduct_cong_intross [] = pair (false, [])  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1956  | 
  | derive_and_update_coinduct_cong_intross (corec_infos as {fpT = Type (fpT_name, _), ...} :: _) =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1957  | 
fold_map derive_coinduct_cong_intros corec_infos  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1958  | 
#>> split_list  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1959  | 
#> (fn ((changeds, extras), lthy) =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1960  | 
if exists I changeds then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1961  | 
((true, extras), lthy |> update_coinduct_cong_intross_dynamic fpT_name)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1962  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1963  | 
((false, extras), lthy));  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1964  | 
|
| 
64674
 
ef0a5fd30f3b
print constants in 'primrec', 'primcorec(ursive)', 'corec(ursive)', like in 'definition' and 'fun(ction)'
 
blanchet 
parents: 
64637 
diff
changeset
 | 
1965  | 
fun prepare_corec_ursive_cmd int long_cmd opts (raw_fixes, raw_eq) lthy =  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1966  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1967  | 
val _ = can the_single raw_fixes orelse  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1968  | 
error "Mutually corecursive functions not supported";  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1969  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1970  | 
val (plugins, friend, transfer) = get_options lthy opts;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1971  | 
val ([((b, fun_T), mx)], [(_, eq)]) =  | 
| 63352 | 1972  | 
fst (Specification.read_multi_specs raw_fixes [((Binding.empty_atts, raw_eq), [], [])] lthy);  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1973  | 
|
| 
64705
 
7596b0736ab9
more uniform errors in '(prim)(co)rec(ursive)' variants
 
blanchet 
parents: 
64674 
diff
changeset
 | 
1974  | 
val _ = check_top_sort lthy b fun_T;  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1975  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1976  | 
val (arg_Ts, res_T) = strip_type fun_T;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1977  | 
val fpT_name = (case res_T of Type (s, _) => s | _ => not_codatatype lthy res_T);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1978  | 
val fun_free = Free (Binding.name_of b, fun_T);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1979  | 
val parsed_eq = parse_corec_equation lthy [fun_free] eq;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1980  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1981  | 
val fun_name = Local_Theory.full_name lthy b;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1982  | 
val fun_t = Const (fun_name, fun_T);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1983  | 
(* FIXME: does this work with locales that fix variables? *)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1984  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1985  | 
val no_base = has_no_corec_info lthy fpT_name;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1986  | 
val lthy = lthy |> no_base ? setup_base fpT_name;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1987  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1988  | 
fun extract_rho lthy =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1989  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1990  | 
val lthy = lthy |> Variable.declare_typ fun_T;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1991  | 
val (prepared as (_, _, version, Y, Z, preT, k_T, ssig_T, dead_pre_bnf, dead_k_bnf, _,  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1992  | 
ssig_fp_sugar, buffer), lthy) =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1993  | 
prepare_friend_corec fun_name fun_T lthy;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1994  | 
val friend_parse_info = friend_parse_info_of lthy arg_Ts res_T buffer;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1995  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1996  | 
val parsed_eq' = parsed_eq ||> subst_atomic [(fun_free, fun_t)];  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1997  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
1998  | 
lthy  | 
| 
64705
 
7596b0736ab9
more uniform errors in '(prim)(co)rec(ursive)' variants
 
blanchet 
parents: 
64674 
diff
changeset
 | 
1999  | 
|> extract_rho_return_transfer_goals b version dead_pre_bnf dead_k_bnf Y Z preT k_T ssig_T  | 
| 
 
7596b0736ab9
more uniform errors in '(prim)(co)rec(ursive)' variants
 
blanchet 
parents: 
64674 
diff
changeset
 | 
2000  | 
ssig_fp_sugar friend_parse_info fun_t parsed_eq'  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2001  | 
|>> pair prepared  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2002  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2003  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2004  | 
val ((prepareds, (rho_datas, transfer_goal_datas)), lthy) =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2005  | 
if friend then extract_rho lthy |>> (apfst single ##> (apfst single #> apsnd single))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2006  | 
else (([], ([], [])), lthy);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2007  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2008  | 
val ((buffer, corec_infos), lthy) =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2009  | 
if friend then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2010  | 
((#13 (the_single prepareds), []), lthy)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2011  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2012  | 
corec_info_of res_T lthy  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2013  | 
||> no_base ? update_coinduct_cong_intross_dynamic fpT_name  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2014  | 
        |>> (fn info as {buffer, ...} => (buffer, [info]));
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2015  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2016  | 
val corec_parse_info = corec_parse_info_of lthy arg_Ts res_T buffer;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2017  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2018  | 
val explored_eq =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2019  | 
explore_corec_equation lthy true friend fun_name fun_free corec_parse_info res_T parsed_eq;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2020  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2021  | 
val (((inner_fp_triple, termin_goals), corecUU_arg), lthy) =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2022  | 
build_corecUU_arg_and_goals (not long_cmd) fun_free explored_eq lthy;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2023  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2024  | 
fun def_fun (inner_fp_elims0, inner_fp_inducts0, inner_fp_simps0) const_transfers  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2025  | 
rho_transfers_foldeds lthy =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2026  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2027  | 
fun register_friend lthy =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2028  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2029  | 
val [(old_corec_info, fp_b, version, Y, Z, _, k_T, _, _, dead_k_bnf, sig_fp_sugar,  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2030  | 
ssig_fp_sugar, _)] = prepareds;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2031  | 
val [(rho, rho_def)] = rho_datas;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2032  | 
val [(_, rho_transfer_goal)] = transfer_goal_datas;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2033  | 
val Type (fpT_name, _) = res_T;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2034  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2035  | 
val rho_transfer_folded =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2036  | 
(case rho_transfers_foldeds of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2037  | 
[] =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2038  | 
derive_rho_transfer_folded lthy fpT_name const_transfers rho_def rho_transfer_goal  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2039  | 
| [thm] => thm);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2040  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2041  | 
lthy  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2042  | 
|> register_coinduct_dynamic_friend fpT_name fun_name  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2043  | 
|> register_friend_corec fun_name fp_b version Y Z k_T dead_k_bnf sig_fp_sugar  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2044  | 
ssig_fp_sugar fun_t rho rho_transfer_folded old_corec_info  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2045  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2046  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2047  | 
val (friend_infos, lthy) = lthy |> (if friend then register_friend #>> single else pair []);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2048  | 
        val (corec_info as {corecUU = corecUU0, ...}, lthy) =
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2049  | 
(case corec_infos of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2050  | 
[] => corec_info_of res_T lthy  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2051  | 
| [info] => (info, lthy));  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2052  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2053  | 
val def_rhs = mk_corec_fun_def_rhs lthy arg_Ts corecUU0 corecUU_arg;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2054  | 
val def = ((b, mx), ((Binding.concealed (Thm.def_binding b), []), def_rhs));  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2055  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2056  | 
val ((fun_t0, (_, fun_def0)), (lthy, lthy_old)) = lthy  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2057  | 
|> Local_Theory.open_target |> snd  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2058  | 
|> Local_Theory.define def  | 
| 
64674
 
ef0a5fd30f3b
print constants in 'primrec', 'primcorec(ursive)', 'corec(ursive)', like in 'definition' and 'fun(ction)'
 
blanchet 
parents: 
64637 
diff
changeset
 | 
2059  | 
|> tap (fn (def, lthy) => print_def_consts int [def] lthy)  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2060  | 
||> `Local_Theory.close_target;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2061  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2062  | 
val parsed_eq = parse_corec_equation lthy [fun_free] eq;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2063  | 
val views0 = generate_views lthy eq fun_free parsed_eq;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2064  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2065  | 
val lthy' = lthy |> fold Variable.declare_typ (res_T :: arg_Ts);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2066  | 
val phi = Proof_Context.export_morphism lthy_old lthy';  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2067  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2068  | 
val fun_t = Morphism.term phi fun_t0; (* FIXME: shadows "fun_t" -- identical? *)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2069  | 
val fun_def = Morphism.thm phi fun_def0;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2070  | 
val inner_fp_elims = map (Morphism.thm phi) inner_fp_elims0;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2071  | 
val inner_fp_inducts = map (Morphism.thm phi) inner_fp_inducts0;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2072  | 
val inner_fp_simps = map (Morphism.thm phi) inner_fp_simps0;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2073  | 
val (code_goal, _, _, _, _) = morph_views phi views0;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2074  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2075  | 
fun derive_and_note_friend_extra_theorems lthy =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2076  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2077  | 
val k_T = #7 (the_single prepareds);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2078  | 
val rho_def = snd (the_single rho_datas);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2079  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2080  | 
val (eq_algrho, algrho_eq) = derive_eq_algrho lthy corec_info (the_single friend_infos)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2081  | 
fun_t k_T code_goal const_transfers rho_def fun_def;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2082  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2083  | 
val notes =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2084  | 
(if Config.get lthy bnf_internals then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2085  | 
[(eq_algrhoN, [eq_algrho])]  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2086  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2087  | 
[])  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2088  | 
|> map (fn (thmN, thms) =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2089  | 
((Binding.qualify true (Binding.name_of b)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2090  | 
(Binding.qualify false friendN (Binding.name thmN)), []),  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2091  | 
[(thms, [])]));  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2092  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2093  | 
lthy  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2094  | 
|> register_friend_extra fun_name eq_algrho algrho_eq  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2095  | 
|> Local_Theory.notes notes |> snd  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2096  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2097  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2098  | 
val lthy = lthy |> friend ? derive_and_note_friend_extra_theorems;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2099  | 
|
| 62746 | 2100  | 
val code_thm = derive_code lthy inner_fp_simps code_goal corec_info fun_t fun_def;  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2101  | 
(* TODO:  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2102  | 
val ctr_thmss = map mk_thm (#2 views);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2103  | 
val disc_thmss = map mk_thm (#3 views);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2104  | 
val disc_iff_thmss = map mk_thm (#4 views);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2105  | 
val sel_thmss = map mk_thm (#5 views);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2106  | 
*)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2107  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2108  | 
val uniques =  | 
| 62746 | 2109  | 
if null inner_fp_simps then  | 
2110  | 
[derive_unique lthy phi (#1 views0) corec_info fpT_name fun_def]  | 
|
2111  | 
else  | 
|
2112  | 
[];  | 
|
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2113  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2114  | 
(* TODO:  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2115  | 
val disc_iff_or_disc_thmss =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2116  | 
map2 (fn [] => I | disc_iffs => K disc_iffs) disc_iff_thmss disc_thmss;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2117  | 
val simp_thmss = map2 append disc_iff_or_disc_thmss sel_thmss;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2118  | 
*)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2119  | 
|
| 62743 | 2120  | 
        val ((_, [{cong_intro_pairs, coinduct, coinduct_attrs}]), lthy) = lthy
 | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2121  | 
|> derive_and_update_coinduct_cong_intross [corec_info];  | 
| 62743 | 2122  | 
val cong_intros_pairs = AList.group (op =) cong_intro_pairs;  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2123  | 
|
| 
63239
 
d562c9948dee
explicit tagging of code equations de-baroquifies interface
 
haftmann 
parents: 
63189 
diff
changeset
 | 
2124  | 
val code_attrs = if plugins code_plugin then [Code.add_default_eqn_attrib Code.Equation] else [];  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2125  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2126  | 
val anonymous_notes = [];  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2127  | 
(* TODO:  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2128  | 
[(flat disc_iff_or_disc_thmss, simp_attrs)]  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2129  | 
|> map (fn (thms, attrs) => ((Binding.empty, attrs), [(thms, [])]));  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2130  | 
*)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2131  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2132  | 
val notes =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2133  | 
[(cong_introsN, maps snd cong_intros_pairs, []),  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2134  | 
(codeN, [code_thm], code_attrs @ nitpicksimp_attrs),  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2135  | 
(coinductN, [coinduct], coinduct_attrs),  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2136  | 
(inner_inductN, inner_fp_inducts, []),  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2137  | 
(uniqueN, uniques, [])] @  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2138  | 
map (fn (thmN, thms) => (thmN, thms, [])) cong_intros_pairs @  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2139  | 
(if Config.get lthy bnf_internals then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2140  | 
[(inner_elimN, inner_fp_elims, []),  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2141  | 
(inner_simpN, inner_fp_simps, [])]  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2142  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2143  | 
[])  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2144  | 
(* TODO:  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2145  | 
(ctrN, ctr_thms, []),  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2146  | 
(discN, disc_thms, []),  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2147  | 
(disc_iffN, disc_iff_thms, []),  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2148  | 
(selN, sel_thms, simp_attrs),  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2149  | 
(simpsN, simp_thms, []),  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2150  | 
*)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2151  | 
|> map (fn (thmN, thms, attrs) =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2152  | 
((Binding.qualify true (Binding.name_of b)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2153  | 
(Binding.qualify false corecN (Binding.name thmN)), attrs),  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2154  | 
[(thms, [])]))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2155  | 
|> filter_out (null o fst o hd o snd);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2156  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2157  | 
lthy  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2158  | 
(* TODO:  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2159  | 
|> Spec_Rules.add Spec_Rules.Equational ([fun_t0], flat sel_thmss)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2160  | 
|> Spec_Rules.add Spec_Rules.Equational ([fun_t0], flat ctr_thmss)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2161  | 
*)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2162  | 
|> Spec_Rules.add Spec_Rules.Equational ([fun_t0], [code_thm])  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2163  | 
|> Local_Theory.notes (anonymous_notes @ notes)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2164  | 
|> snd  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2165  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2166  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2167  | 
fun prove_transfer_goal ctxt goal =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2168  | 
Variable.add_free_names ctxt goal []  | 
| 62729 | 2169  | 
      |> (fn vars => Goal.prove (*no sorry*) ctxt vars [] goal (fn {context = ctxt, prems = _} =>
 | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2170  | 
HEADGOAL (Transfer.transfer_prover_tac ctxt)))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2171  | 
|> Thm.close_derivation;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2172  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2173  | 
fun maybe_prove_transfer_goal ctxt goal =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2174  | 
(case try (prove_transfer_goal ctxt) goal of  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2175  | 
SOME thm => apfst (cons thm)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2176  | 
| NONE => apsnd (cons goal));  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2177  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2178  | 
val const_transfer_goals = fold (union (op aconv) o fst) transfer_goal_datas [];  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2179  | 
val (const_transfers, const_transfer_goals') =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2180  | 
if long_cmd then ([], const_transfer_goals)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2181  | 
else fold (maybe_prove_transfer_goal lthy) const_transfer_goals ([], []);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2182  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2183  | 
((def_fun, (([res_T], prepareds, rho_datas, map snd transfer_goal_datas),  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2184  | 
(inner_fp_triple, termin_goals), (const_transfers, const_transfer_goals'))), lthy)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2185  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2186  | 
|
| 
64674
 
ef0a5fd30f3b
print constants in 'primrec', 'primcorec(ursive)', 'corec(ursive)', like in 'definition' and 'fun(ction)'
 
blanchet 
parents: 
64637 
diff
changeset
 | 
2187  | 
fun corec_cmd int opts (raw_fixes, raw_eq) lthy =  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2188  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2189  | 
val ((def_fun, (_, (inner_fp_triple, termin_goals), (const_transfers, const_transfer_goals))),  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2190  | 
lthy) =  | 
| 
64674
 
ef0a5fd30f3b
print constants in 'primrec', 'primcorec(ursive)', 'corec(ursive)', like in 'definition' and 'fun(ction)'
 
blanchet 
parents: 
64637 
diff
changeset
 | 
2191  | 
prepare_corec_ursive_cmd int false opts (raw_fixes, raw_eq) lthy;  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2192  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2193  | 
if not (null termin_goals) then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2194  | 
      error ("Termination prover failed (try " ^ quote (#1 @{command_keyword corecursive}) ^
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2195  | 
        " instead of " ^ quote (#1 @{command_keyword corec}) ^ ")")
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2196  | 
else if not (null const_transfer_goals) then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2197  | 
      error ("Transfer prover failed (try " ^ quote (#1 @{command_keyword corecursive}) ^
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2198  | 
        " instead of " ^ quote (#1 @{command_keyword corec}) ^ ")")
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2199  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2200  | 
def_fun inner_fp_triple const_transfers [] lthy  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2201  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2202  | 
|
| 
64674
 
ef0a5fd30f3b
print constants in 'primrec', 'primcorec(ursive)', 'corec(ursive)', like in 'definition' and 'fun(ction)'
 
blanchet 
parents: 
64637 
diff
changeset
 | 
2203  | 
fun corecursive_cmd int opts (raw_fixes, raw_eq) lthy =  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2204  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2205  | 
val ((def_fun, (([Type (fpT_name, _)], prepareds, rho_datas, rho_transfer_goals),  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2206  | 
(inner_fp_triple, termin_goals), (const_transfers, const_transfer_goals))), lthy) =  | 
| 
64674
 
ef0a5fd30f3b
print constants in 'primrec', 'primcorec(ursive)', 'corec(ursive)', like in 'definition' and 'fun(ction)'
 
blanchet 
parents: 
64637 
diff
changeset
 | 
2207  | 
prepare_corec_ursive_cmd int true opts (raw_fixes, raw_eq) lthy;  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2208  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2209  | 
val (rho_transfer_goals', unprime_rho_transfer_and_folds) =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2210  | 
      @{map 3} (fn (_, _, _, _, _, _, _, _, _, _, _, _, _) => fn (_, rho_def) =>
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2211  | 
prime_rho_transfer_goal lthy fpT_name rho_def)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2212  | 
prepareds rho_datas rho_transfer_goals  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2213  | 
|> split_list;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2214  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2215  | 
Proof.theorem NONE (fn [termin_thms, const_transfers', rho_transfers'] =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2216  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2217  | 
val remove_domain_condition =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2218  | 
full_simplify (put_simpset HOL_basic_ss lthy  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2219  | 
            addsimps (@{thm True_implies_equals} :: termin_thms));
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2220  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2221  | 
        def_fun (@{apply 3} (map remove_domain_condition) inner_fp_triple)
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2222  | 
(const_transfers @ const_transfers')  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2223  | 
(map2 (fn f => f) unprime_rho_transfer_and_folds rho_transfers')  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2224  | 
end)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2225  | 
(map (map (rpair [])) [termin_goals, const_transfer_goals, rho_transfer_goals']) lthy  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2226  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2227  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2228  | 
fun friend_of_corec_cmd ((raw_fun_name, raw_fun_T_opt), raw_eq) lthy =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2229  | 
let  | 
| 
63188
 
38d6aabec460
more flexible parsing (towards type class support)
 
blanchet 
parents: 
63182 
diff
changeset
 | 
2230  | 
val Const (fun_name, _) =  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2231  | 
      Proof_Context.read_const {proper = true, strict = false} lthy raw_fun_name;
 | 
| 
63188
 
38d6aabec460
more flexible parsing (towards type class support)
 
blanchet 
parents: 
63182 
diff
changeset
 | 
2232  | 
|
| 
 
38d6aabec460
more flexible parsing (towards type class support)
 
blanchet 
parents: 
63182 
diff
changeset
 | 
2233  | 
val fake_lthy = lthy  | 
| 
 
38d6aabec460
more flexible parsing (towards type class support)
 
blanchet 
parents: 
63182 
diff
changeset
 | 
2234  | 
|> (case raw_fun_T_opt of  | 
| 
 
38d6aabec460
more flexible parsing (towards type class support)
 
blanchet 
parents: 
63182 
diff
changeset
 | 
2235  | 
SOME raw_T =>  | 
| 
 
38d6aabec460
more flexible parsing (towards type class support)
 
blanchet 
parents: 
63182 
diff
changeset
 | 
2236  | 
Proof_Context.add_const_constraint (fun_name, SOME (Syntax.read_typ lthy raw_T))  | 
| 64381 | 2237  | 
| NONE => I)  | 
2238  | 
handle TYPE (s, _, _) => error s;  | 
|
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2239  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2240  | 
val fun_b = Binding.name (Long_Name.base_name fun_name);  | 
| 
63188
 
38d6aabec460
more flexible parsing (towards type class support)
 
blanchet 
parents: 
63182 
diff
changeset
 | 
2241  | 
val code_goal = Syntax.read_prop fake_lthy raw_eq;  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2242  | 
|
| 
63188
 
38d6aabec460
more flexible parsing (towards type class support)
 
blanchet 
parents: 
63182 
diff
changeset
 | 
2243  | 
val fun_T =  | 
| 
 
38d6aabec460
more flexible parsing (towards type class support)
 
blanchet 
parents: 
63182 
diff
changeset
 | 
2244  | 
(case code_goal of  | 
| 
 
38d6aabec460
more flexible parsing (towards type class support)
 
blanchet 
parents: 
63182 
diff
changeset
 | 
2245  | 
        @{const Trueprop} $ (Const (@{const_name HOL.eq}, _) $ t $ _) => fastype_of (head_of t)
 | 
| 
64705
 
7596b0736ab9
more uniform errors in '(prim)(co)rec(ursive)' variants
 
blanchet 
parents: 
64674 
diff
changeset
 | 
2246  | 
| _ => ill_formed_equation_lhs_rhs lthy [code_goal]);  | 
| 
63188
 
38d6aabec460
more flexible parsing (towards type class support)
 
blanchet 
parents: 
63182 
diff
changeset
 | 
2247  | 
val fun_t = Const (fun_name, fun_T);  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2248  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2249  | 
val (arg_Ts, res_T as Type (fpT_name, _)) = strip_type fun_T;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2250  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2251  | 
val no_base = has_no_corec_info lthy fpT_name;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2252  | 
val lthy = lthy |> no_base ? setup_base fpT_name;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2253  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2254  | 
val lthy = lthy |> Variable.declare_typ fun_T;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2255  | 
val ((old_corec_info, fp_b, version, Y, Z, preT, k_T, ssig_T, dead_pre_bnf, dead_k_bnf,  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2256  | 
sig_fp_sugar, ssig_fp_sugar, buffer), lthy) =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2257  | 
prepare_friend_corec fun_name fun_T lthy;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2258  | 
val friend_parse_info = friend_parse_info_of lthy arg_Ts res_T buffer;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2259  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2260  | 
val parsed_eq = parse_corec_equation lthy [] code_goal;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2261  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2262  | 
val (((rho, rho_def), (const_transfer_goals, rho_transfer_goal)), lthy) =  | 
| 
64705
 
7596b0736ab9
more uniform errors in '(prim)(co)rec(ursive)' variants
 
blanchet 
parents: 
64674 
diff
changeset
 | 
2263  | 
extract_rho_return_transfer_goals fun_b version dead_pre_bnf dead_k_bnf Y Z preT k_T ssig_T  | 
| 
 
7596b0736ab9
more uniform errors in '(prim)(co)rec(ursive)' variants
 
blanchet 
parents: 
64674 
diff
changeset
 | 
2264  | 
ssig_fp_sugar friend_parse_info fun_t parsed_eq lthy;  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2265  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2266  | 
fun register_friend_extra_and_note_thms code_goal code_thm const_transfers k_T friend_info  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2267  | 
lthy =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2268  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2269  | 
val (corec_info, lthy) = corec_info_of res_T lthy;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2270  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2271  | 
val fun_free = Free (Binding.name_of fun_b, fun_T);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2272  | 
|
| 
63188
 
38d6aabec460
more flexible parsing (towards type class support)
 
blanchet 
parents: 
63182 
diff
changeset
 | 
2273  | 
fun freeze_fun (t as Const (s, T)) = if s = fun_name andalso T = fun_T then fun_free else t  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2274  | 
| freeze_fun t = t;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2275  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2276  | 
val eq = Term.map_aterms freeze_fun code_goal;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2277  | 
val parsed_eq = parse_corec_equation lthy [fun_free] eq;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2278  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2279  | 
val corec_parse_info = corec_parse_info_of lthy arg_Ts res_T buffer;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2280  | 
val explored_eq = explore_corec_equation lthy false false fun_name fun_free corec_parse_info  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2281  | 
res_T parsed_eq;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2282  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2283  | 
val ((_, corecUU_arg), _) = build_corecUU_arg_and_goals false fun_free explored_eq lthy;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2284  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2285  | 
val eq_corecUU = derive_eq_corecUU lthy corec_info fun_t corecUU_arg code_thm;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2286  | 
val (eq_algrho, algrho_eq) = derive_eq_algrho lthy corec_info friend_info fun_t k_T  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2287  | 
code_goal const_transfers rho_def eq_corecUU;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2288  | 
|
| 62743 | 2289  | 
        val ((_, [{cong_intro_pairs, coinduct, coinduct_attrs}]), lthy) = lthy
 | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2290  | 
|> register_friend_extra fun_name eq_algrho algrho_eq  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2291  | 
|> register_coinduct_dynamic_friend fpT_name fun_name  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2292  | 
|> derive_and_update_coinduct_cong_intross [corec_info];  | 
| 62743 | 2293  | 
val cong_intros_pairs = AList.group (op =) cong_intro_pairs;  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2294  | 
|
| 62746 | 2295  | 
val unique = derive_unique lthy Morphism.identity code_goal corec_info fpT_name eq_corecUU;  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2296  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2297  | 
val notes =  | 
| 62741 | 2298  | 
[(codeN, [code_thm], []),  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2299  | 
(coinductN, [coinduct], coinduct_attrs),  | 
| 62741 | 2300  | 
(cong_introsN, maps snd cong_intros_pairs, []),  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2301  | 
(uniqueN, [unique], [])] @  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2302  | 
map (fn (thmN, thms) => (thmN, thms, [])) cong_intros_pairs @  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2303  | 
(if Config.get lthy bnf_internals then  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2304  | 
[(eq_algrhoN, [eq_algrho], []),  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2305  | 
(eq_corecUUN, [eq_corecUU], [])]  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2306  | 
else  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2307  | 
[])  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2308  | 
|> map (fn (thmN, thms, attrs) =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2309  | 
((Binding.qualify true (Binding.name_of fun_b)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2310  | 
(Binding.qualify false friendN (Binding.name thmN)), attrs),  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2311  | 
[(thms, [])]));  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2312  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2313  | 
lthy  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2314  | 
|> Local_Theory.notes notes |> snd  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2315  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2316  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2317  | 
val (rho_transfer_goal', unprime_rho_transfer_and_fold) =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2318  | 
prime_rho_transfer_goal lthy fpT_name rho_def rho_transfer_goal;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2319  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2320  | 
lthy  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2321  | 
|> Proof.theorem NONE (fn [[code_thm], const_transfers, [rho_transfer']] =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2322  | 
register_friend_corec fun_name fp_b version Y Z k_T dead_k_bnf sig_fp_sugar ssig_fp_sugar  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2323  | 
fun_t rho (unprime_rho_transfer_and_fold rho_transfer') old_corec_info  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2324  | 
#-> register_friend_extra_and_note_thms code_goal code_thm const_transfers k_T)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2325  | 
(map (map (rpair [])) [[code_goal], const_transfer_goals, [rho_transfer_goal']])  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2326  | 
|> Proof.refine_singleton (Method.primitive_text (K I))  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2327  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2328  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2329  | 
fun coinduction_upto_cmd (base_name, raw_fpT) lthy =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2330  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2331  | 
val fpT as Type (fpT_name, _) = Syntax.read_typ lthy raw_fpT;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2332  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2333  | 
val no_base = has_no_corec_info lthy fpT_name;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2334  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2335  | 
    val (corec_info as {version, ...}, lthy) = lthy
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2336  | 
|> corec_info_of fpT;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2337  | 
val lthy = lthy |> no_base ? setup_base fpT_name;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2338  | 
|
| 62743 | 2339  | 
    val ((changed, [{cong_intro_pairs, coinduct, coinduct_attrs}]), lthy) = lthy
 | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2340  | 
|> derive_and_update_coinduct_cong_intross [corec_info];  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2341  | 
val lthy = lthy |> (changed orelse no_base) ? update_coinduct_cong_intross_dynamic fpT_name;  | 
| 62743 | 2342  | 
val cong_intros_pairs = AList.group (op =) cong_intro_pairs;  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2343  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2344  | 
val notes =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2345  | 
[(cong_introsN, maps snd cong_intros_pairs, []),  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2346  | 
(coinduct_uptoN, [coinduct], coinduct_attrs)] @  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2347  | 
map (fn (thmN, thms) => (thmN, thms, [])) cong_intros_pairs  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2348  | 
|> map (fn (thmN, thms, attrs) =>  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2349  | 
(((Binding.qualify true base_name  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2350  | 
            (Binding.qualify false ("v" ^ string_of_int version) (Binding.name thmN))), attrs),
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2351  | 
[(thms, [])]));  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2352  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2353  | 
lthy |> Local_Theory.notes notes |> snd  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2354  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2355  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2356  | 
fun consolidate lthy =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2357  | 
let  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2358  | 
val corec_infoss = map (corec_infos_of lthy o fst) (all_codatatype_extras_of lthy);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2359  | 
val (changeds, lthy) = lthy  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2360  | 
|> fold_map (apfst fst oo derive_and_update_coinduct_cong_intross) corec_infoss;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2361  | 
in  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2362  | 
if exists I changeds then lthy else raise Same.SAME  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2363  | 
end;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2364  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2365  | 
fun consolidate_global thy =  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2366  | 
SOME (Named_Target.theory_map consolidate thy)  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2367  | 
handle Same.SAME => NONE;  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2368  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2369  | 
val _ = Outer_Syntax.local_theory @{command_keyword corec}
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2370  | 
"define nonprimitive corecursive functions"  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2371  | 
  ((Scan.optional (@{keyword "("} |-- Parse.!!! (Parse.list1 corec_option_parser)
 | 
| 63285 | 2372  | 
      --| @{keyword ")"}) []) -- (Parse.vars --| Parse.where_ -- Parse.prop)
 | 
| 
64674
 
ef0a5fd30f3b
print constants in 'primrec', 'primcorec(ursive)', 'corec(ursive)', like in 'definition' and 'fun(ction)'
 
blanchet 
parents: 
64637 
diff
changeset
 | 
2373  | 
>> uncurry (corec_cmd true));  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2374  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2375  | 
val _ = Outer_Syntax.local_theory_to_proof @{command_keyword corecursive}
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2376  | 
"define nonprimitive corecursive functions"  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2377  | 
  ((Scan.optional (@{keyword "("} |-- Parse.!!! (Parse.list1 corec_option_parser)
 | 
| 63285 | 2378  | 
      --| @{keyword ")"}) []) -- (Parse.vars --| Parse.where_ -- Parse.prop)
 | 
| 
64674
 
ef0a5fd30f3b
print constants in 'primrec', 'primcorec(ursive)', 'corec(ursive)', like in 'definition' and 'fun(ction)'
 
blanchet 
parents: 
64637 
diff
changeset
 | 
2379  | 
>> uncurry (corecursive_cmd true));  | 
| 
62692
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2380  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2381  | 
val _ = Outer_Syntax.local_theory_to_proof @{command_keyword friend_of_corec}
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2382  | 
"register a function as a legal context for nonprimitive corecursion"  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2383  | 
(Parse.const -- Scan.option (Parse.$$$ "::" |-- Parse.typ) --| Parse.where_ -- Parse.prop  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2384  | 
>> friend_of_corec_cmd);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2385  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2386  | 
val _ = Outer_Syntax.local_theory @{command_keyword coinduction_upto}
 | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2387  | 
"derive a coinduction up-to principle and a corresponding congruence closure"  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2388  | 
(Parse.name --| Parse.$$$ ":" -- Parse.typ >> coinduction_upto_cmd);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2389  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2390  | 
val _ = Theory.setup (Theory.at_begin consolidate_global);  | 
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2391  | 
|
| 
 
0701f25fac39
moved 'corec' from ssh://hg@bitbucket.org/jasmin_blanchette/nonprim-corec to Isabelle
 
blanchet 
parents:  
diff
changeset
 | 
2392  | 
end;  |