| author | Christian Urban <urbanc@in.tum.de> | 
| Tue, 04 Jan 2011 13:47:38 +0000 | |
| changeset 2637 | 3890483c674f | 
| parent 2635 | 64b4cb2c2bf8 | 
| child 2647 | 5e95387bef45 | 
| permissions | -rw-r--r-- | 
| 
1833
 
2050b5723c04
added a library for basic nominal functions; separated nominal_eqvt file
 
Christian Urban <urbanc@in.tum.de> 
parents:  
diff
changeset
 | 
1  | 
(* Title: nominal_library.ML  | 
| 
 
2050b5723c04
added a library for basic nominal functions; separated nominal_eqvt file
 
Christian Urban <urbanc@in.tum.de> 
parents:  
diff
changeset
 | 
2  | 
Author: Christian Urban  | 
| 
 
2050b5723c04
added a library for basic nominal functions; separated nominal_eqvt file
 
Christian Urban <urbanc@in.tum.de> 
parents:  
diff
changeset
 | 
3  | 
|
| 
1979
 
760257a66604
added basic functions for constructing supp-terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1963 
diff
changeset
 | 
4  | 
Basic functions for nominal.  | 
| 
1833
 
2050b5723c04
added a library for basic nominal functions; separated nominal_eqvt file
 
Christian Urban <urbanc@in.tum.de> 
parents:  
diff
changeset
 | 
5  | 
*)  | 
| 
 
2050b5723c04
added a library for basic nominal functions; separated nominal_eqvt file
 
Christian Urban <urbanc@in.tum.de> 
parents:  
diff
changeset
 | 
6  | 
|
| 
 
2050b5723c04
added a library for basic nominal functions; separated nominal_eqvt file
 
Christian Urban <urbanc@in.tum.de> 
parents:  
diff
changeset
 | 
7  | 
signature NOMINAL_LIBRARY =  | 
| 
 
2050b5723c04
added a library for basic nominal functions; separated nominal_eqvt file
 
Christian Urban <urbanc@in.tum.de> 
parents:  
diff
changeset
 | 
8  | 
sig  | 
| 
2593
 
25dcb2b1329e
ordered raw_bn_info to agree with the order of the raw_bn_functions; started alpha_bn proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2571 
diff
changeset
 | 
9  | 
val last2: 'a list -> 'a * 'a  | 
| 
2635
 
64b4cb2c2bf8
simple cases for string rule inductions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2630 
diff
changeset
 | 
10  | 
val split_last2: 'a list -> 'a list * 'a * 'a  | 
| 
2593
 
25dcb2b1329e
ordered raw_bn_info to agree with the order of the raw_bn_functions; started alpha_bn proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2571 
diff
changeset
 | 
11  | 
  val order: ('a * 'a -> bool) -> 'a list -> ('a * 'b) list -> 'b list
 | 
| 
2635
 
64b4cb2c2bf8
simple cases for string rule inductions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2630 
diff
changeset
 | 
12  | 
  val order_default: ('a * 'a -> bool) -> 'b -> 'a list -> ('a * 'b) list -> 'b list
 | 
| 
2608
 
86e3b39c2a60
created strong_exhausts terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2607 
diff
changeset
 | 
13  | 
  val remove_dups: ('a * 'a -> bool) -> 'a list -> 'a list
 | 
| 2619 | 14  | 
  val map4: ('a -> 'b -> 'c -> 'd -> 'e) -> 'a list -> 'b list -> 'c list -> 'd list -> 'e list
 | 
| 
2616
 
dd7490fdd998
all examples for strong exhausts work; recursive binders need to be treated differently; still unclean version with lots of diagnostic code
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2613 
diff
changeset
 | 
15  | 
  val split_filter: ('a -> bool) -> 'a list -> 'a list * 'a list
 | 
| 
2625
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
16  | 
  val fold_left: ('a * 'a -> 'a) -> 'a list -> 'a -> 'a
 | 
| 2619 | 17  | 
|
| 
2593
 
25dcb2b1329e
ordered raw_bn_info to agree with the order of the raw_bn_functions; started alpha_bn proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2571 
diff
changeset
 | 
18  | 
val is_true: term -> bool  | 
| 
 
25dcb2b1329e
ordered raw_bn_info to agree with the order of the raw_bn_functions; started alpha_bn proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2571 
diff
changeset
 | 
19  | 
|
| 
 
25dcb2b1329e
ordered raw_bn_info to agree with the order of the raw_bn_functions; started alpha_bn proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2571 
diff
changeset
 | 
20  | 
val dest_listT: typ -> typ  | 
| 
2607
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
21  | 
val dest_fsetT: typ -> typ  | 
| 
2313
 
25d2cdf7d7e4
transitivity proofs done
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2311 
diff
changeset
 | 
22  | 
|
| 
2593
 
25dcb2b1329e
ordered raw_bn_info to agree with the order of the raw_bn_functions; started alpha_bn proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2571 
diff
changeset
 | 
23  | 
val mk_id: term -> term  | 
| 
2609
 
666ffc8a92a9
freshness theorem in strong exhausts; (temporarily includes a cheat_tac to make all tests go through)
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2608 
diff
changeset
 | 
24  | 
val mk_all: (string * typ) -> term -> term  | 
| 
2635
 
64b4cb2c2bf8
simple cases for string rule inductions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2630 
diff
changeset
 | 
25  | 
val mk_All: (string * typ) -> term -> term  | 
| 
2637
 
3890483c674f
final version of the ESOP paper; used set+ instead of res as requested by one reviewer
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2635 
diff
changeset
 | 
26  | 
val mk_exists: (string * typ) -> term -> term  | 
| 
2288
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
27  | 
|
| 
2410
 
2bbdb9c427b5
improved runtime slightly, by constructing an explicit size measure for the function definitions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2408 
diff
changeset
 | 
28  | 
val sum_case_const: typ -> typ -> typ -> term  | 
| 
 
2bbdb9c427b5
improved runtime slightly, by constructing an explicit size measure for the function definitions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2408 
diff
changeset
 | 
29  | 
val mk_sum_case: term -> term -> term  | 
| 
 
2bbdb9c427b5
improved runtime slightly, by constructing an explicit size measure for the function definitions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2408 
diff
changeset
 | 
30  | 
|
| 
1833
 
2050b5723c04
added a library for basic nominal functions; separated nominal_eqvt file
 
Christian Urban <urbanc@in.tum.de> 
parents:  
diff
changeset
 | 
31  | 
val mk_minus: term -> term  | 
| 
1896
 
996d4411e95e
tuned; fleshed out some library functions about permutations; closed Datatype_Aux structure (increases readability)
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1871 
diff
changeset
 | 
32  | 
val mk_plus: term -> term -> term  | 
| 
 
996d4411e95e
tuned; fleshed out some library functions about permutations; closed Datatype_Aux structure (increases readability)
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1871 
diff
changeset
 | 
33  | 
|
| 
1899
 
8e0bfb14f6bf
optimised the code of define_raw_perm
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1896 
diff
changeset
 | 
34  | 
val perm_ty: typ -> typ  | 
| 
2635
 
64b4cb2c2bf8
simple cases for string rule inductions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2630 
diff
changeset
 | 
35  | 
val perm_const: typ -> term  | 
| 
1871
 
c704d129862b
moved some general function into nominal_library.ML
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1834 
diff
changeset
 | 
36  | 
val mk_perm_ty: typ -> term -> term -> term  | 
| 
1833
 
2050b5723c04
added a library for basic nominal functions; separated nominal_eqvt file
 
Christian Urban <urbanc@in.tum.de> 
parents:  
diff
changeset
 | 
37  | 
val mk_perm: term -> term -> term  | 
| 
1834
 
9909cc3566c5
moved a couple of more functions to the library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1833 
diff
changeset
 | 
38  | 
val dest_perm: term -> term * term  | 
| 
 
9909cc3566c5
moved a couple of more functions to the library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1833 
diff
changeset
 | 
39  | 
|
| 
1962
 
84a13d1e2511
moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1899 
diff
changeset
 | 
40  | 
val mk_sort_of: term -> term  | 
| 
1979
 
760257a66604
added basic functions for constructing supp-terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1963 
diff
changeset
 | 
41  | 
val atom_ty: typ -> typ  | 
| 
2569
 
94750b31a97d
fixed bug in fv function where a shallow binder binds lists of names
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2568 
diff
changeset
 | 
42  | 
val atom_const: typ -> term  | 
| 
1962
 
84a13d1e2511
moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1899 
diff
changeset
 | 
43  | 
val mk_atom_ty: typ -> term -> term  | 
| 
 
84a13d1e2511
moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1899 
diff
changeset
 | 
44  | 
val mk_atom: term -> term  | 
| 
 
84a13d1e2511
moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1899 
diff
changeset
 | 
45  | 
|
| 
2607
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
46  | 
val mk_atom_set_ty: typ -> term -> term  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
47  | 
val mk_atom_set: term -> term  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
48  | 
val mk_atom_fset_ty: typ -> term -> term  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
49  | 
val mk_atom_fset: term -> term  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
50  | 
val mk_atom_list_ty: typ -> term -> term  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
51  | 
val mk_atom_list: term -> term  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
52  | 
|
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
53  | 
val is_atom: Proof.context -> typ -> bool  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
54  | 
val is_atom_set: Proof.context -> typ -> bool  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
55  | 
val is_atom_fset: Proof.context -> typ -> bool  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
56  | 
val is_atom_list: Proof.context -> typ -> bool  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
57  | 
|
| 
2608
 
86e3b39c2a60
created strong_exhausts terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2607 
diff
changeset
 | 
58  | 
val to_set_ty: typ -> term -> term  | 
| 
 
86e3b39c2a60
created strong_exhausts terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2607 
diff
changeset
 | 
59  | 
val to_set: term -> term  | 
| 
 
86e3b39c2a60
created strong_exhausts terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2607 
diff
changeset
 | 
60  | 
|
| 
2611
 
3d101f2f817c
simple cases for strong inducts done; infrastructure for the difficult ones is there
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2609 
diff
changeset
 | 
61  | 
val atomify_ty: Proof.context -> typ -> term -> term  | 
| 
 
3d101f2f817c
simple cases for strong inducts done; infrastructure for the difficult ones is there
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2609 
diff
changeset
 | 
62  | 
val atomify: Proof.context -> term -> term  | 
| 
2607
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
63  | 
val setify_ty: Proof.context -> typ -> term -> term  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
64  | 
val setify: Proof.context -> term -> term  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
65  | 
val listify_ty: Proof.context -> typ -> term -> term  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
66  | 
val listify: Proof.context -> term -> term  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
67  | 
|
| 
2608
 
86e3b39c2a60
created strong_exhausts terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2607 
diff
changeset
 | 
68  | 
val fresh_star_ty: typ -> typ  | 
| 
 
86e3b39c2a60
created strong_exhausts terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2607 
diff
changeset
 | 
69  | 
val fresh_star_const: typ -> term  | 
| 
 
86e3b39c2a60
created strong_exhausts terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2607 
diff
changeset
 | 
70  | 
val mk_fresh_star_ty: typ -> term -> term -> term  | 
| 
2607
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
71  | 
val mk_fresh_star: term -> term -> term  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
72  | 
|
| 
1979
 
760257a66604
added basic functions for constructing supp-terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1963 
diff
changeset
 | 
73  | 
val supp_ty: typ -> typ  | 
| 2296 | 74  | 
val supp_const: typ -> term  | 
| 
1979
 
760257a66604
added basic functions for constructing supp-terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1963 
diff
changeset
 | 
75  | 
val mk_supp_ty: typ -> term -> term  | 
| 
 
760257a66604
added basic functions for constructing supp-terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1963 
diff
changeset
 | 
76  | 
val mk_supp: term -> term  | 
| 
 
760257a66604
added basic functions for constructing supp-terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1963 
diff
changeset
 | 
77  | 
|
| 
2475
 
486d4647bb37
supp-proofs work except for CoreHaskell and Modules (induct is probably not finding the correct instance)
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2464 
diff
changeset
 | 
78  | 
val supp_rel_ty: typ -> typ  | 
| 
 
486d4647bb37
supp-proofs work except for CoreHaskell and Modules (induct is probably not finding the correct instance)
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2464 
diff
changeset
 | 
79  | 
val supp_rel_const: typ -> term  | 
| 
 
486d4647bb37
supp-proofs work except for CoreHaskell and Modules (induct is probably not finding the correct instance)
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2464 
diff
changeset
 | 
80  | 
val mk_supp_rel_ty: typ -> term -> term -> term  | 
| 
 
486d4647bb37
supp-proofs work except for CoreHaskell and Modules (induct is probably not finding the correct instance)
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2464 
diff
changeset
 | 
81  | 
val mk_supp_rel: term -> term -> term  | 
| 
 
486d4647bb37
supp-proofs work except for CoreHaskell and Modules (induct is probably not finding the correct instance)
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2464 
diff
changeset
 | 
82  | 
|
| 2448 | 83  | 
val supports_const: typ -> term  | 
84  | 
val mk_supports_ty: typ -> term -> term -> term  | 
|
85  | 
val mk_supports: term -> term -> term  | 
|
86  | 
||
| 
2450
 
217ef3e4282e
added proofs for fsupp properties
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2448 
diff
changeset
 | 
87  | 
val finite_const: typ -> term  | 
| 
 
217ef3e4282e
added proofs for fsupp properties
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2448 
diff
changeset
 | 
88  | 
val mk_finite_ty: typ -> term -> term  | 
| 
 
217ef3e4282e
added proofs for fsupp properties
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2448 
diff
changeset
 | 
89  | 
val mk_finite: term -> term  | 
| 
 
217ef3e4282e
added proofs for fsupp properties
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2448 
diff
changeset
 | 
90  | 
|
| 
1834
 
9909cc3566c5
moved a couple of more functions to the library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1833 
diff
changeset
 | 
91  | 
val mk_equiv: thm -> thm  | 
| 
 
9909cc3566c5
moved a couple of more functions to the library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1833 
diff
changeset
 | 
92  | 
val safe_mk_equiv: thm -> thm  | 
| 
2288
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
93  | 
|
| 
2289
 
bf748be70109
moved some mk_union and mk_diff into the library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2288 
diff
changeset
 | 
94  | 
val mk_diff: term * term -> term  | 
| 2296 | 95  | 
val mk_append: term * term -> term  | 
| 
2289
 
bf748be70109
moved some mk_union and mk_diff into the library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2288 
diff
changeset
 | 
96  | 
val mk_union: term * term -> term  | 
| 
 
bf748be70109
moved some mk_union and mk_diff into the library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2288 
diff
changeset
 | 
97  | 
val fold_union: term list -> term  | 
| 
2464
 
f4eba60cbd69
made the fv-definition aggree more with alpha (needed in the support proofs)
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2450 
diff
changeset
 | 
98  | 
val fold_append: term list -> term  | 
| 
2389
 
0f24c961b5f6
introduced a general alpha_prove method
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2384 
diff
changeset
 | 
99  | 
val mk_conj: term * term -> term  | 
| 
 
0f24c961b5f6
introduced a general alpha_prove method
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2384 
diff
changeset
 | 
100  | 
val fold_conj: term list -> term  | 
| 
2289
 
bf748be70109
moved some mk_union and mk_diff into the library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2288 
diff
changeset
 | 
101  | 
|
| 
2625
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
102  | 
(* functions for de-Bruijn open terms *)  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
103  | 
val mk_binop_env: typ list -> string -> term * term -> term  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
104  | 
val mk_union_env: typ list -> term * term -> term  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
105  | 
val fold_union_env: typ list -> term list -> term  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
106  | 
|
| 2448 | 107  | 
(* fresh arguments for a term *)  | 
108  | 
val fresh_args: Proof.context -> term -> term list  | 
|
109  | 
||
| 
2625
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
110  | 
(* some logic operations *)  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
111  | 
val strip_full_horn: term -> (string * typ) list * term list * term  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
112  | 
val mk_full_horn: (string * typ) list -> term list -> term -> term  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
113  | 
|
| 
2288
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
114  | 
(* datatype operations *)  | 
| 2407 | 115  | 
type cns_info = (term * typ * typ list * bool list) list  | 
116  | 
||
| 2296 | 117  | 
val all_dtyps: Datatype_Aux.descr -> (string * sort) list -> typ list  | 
| 
2288
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
118  | 
val nth_dtyp: Datatype_Aux.descr -> (string * sort) list -> int -> typ  | 
| 2407 | 119  | 
val all_dtyp_constrs_types: Datatype_Aux.descr -> (string * sort) list -> cns_info list  | 
120  | 
val nth_dtyp_constrs_types: Datatype_Aux.descr -> (string * sort) list -> int -> cns_info  | 
|
| 
2288
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
121  | 
val prefix_dt_names: Datatype_Aux.descr -> (string * sort) list -> string -> string list  | 
| 
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
122  | 
|
| 
2304
 
8a98171ba1fc
all raw definitions are defined using function
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2296 
diff
changeset
 | 
123  | 
(* tactics for function package *)  | 
| 
2630
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
124  | 
val size_simpset: simpset  | 
| 
2304
 
8a98171ba1fc
all raw definitions are defined using function
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2296 
diff
changeset
 | 
125  | 
val pat_completeness_simp: thm list -> Proof.context -> tactic  | 
| 
2630
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
126  | 
val prove_termination_ind: Proof.context -> int -> tactic  | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
127  | 
val prove_termination_fun: thm list -> Proof.context -> Function.info * local_theory  | 
| 
2304
 
8a98171ba1fc
all raw definitions are defined using function
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2296 
diff
changeset
 | 
128  | 
|
| 
2311
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
129  | 
(* transformations of premises in inductions *)  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
130  | 
val transform_prem1: Proof.context -> string list -> thm -> thm  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
131  | 
val transform_prem2: Proof.context -> string list -> thm -> thm  | 
| 
2397
 
c670a849af65
more experiments with lifting
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2389 
diff
changeset
 | 
132  | 
|
| 
 
c670a849af65
more experiments with lifting
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2389 
diff
changeset
 | 
133  | 
(* transformation into the object logic *)  | 
| 
 
c670a849af65
more experiments with lifting
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2389 
diff
changeset
 | 
134  | 
val atomize: thm -> thm  | 
| 2398 | 135  | 
|
| 
2625
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
136  | 
(* applies a tactic to a formula composed of conjunctions *)  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
137  | 
val conj_tac: (int -> tactic) -> int -> tactic  | 
| 
1833
 
2050b5723c04
added a library for basic nominal functions; separated nominal_eqvt file
 
Christian Urban <urbanc@in.tum.de> 
parents:  
diff
changeset
 | 
138  | 
end  | 
| 
 
2050b5723c04
added a library for basic nominal functions; separated nominal_eqvt file
 
Christian Urban <urbanc@in.tum.de> 
parents:  
diff
changeset
 | 
139  | 
|
| 
 
2050b5723c04
added a library for basic nominal functions; separated nominal_eqvt file
 
Christian Urban <urbanc@in.tum.de> 
parents:  
diff
changeset
 | 
140  | 
|
| 
 
2050b5723c04
added a library for basic nominal functions; separated nominal_eqvt file
 
Christian Urban <urbanc@in.tum.de> 
parents:  
diff
changeset
 | 
141  | 
structure Nominal_Library: NOMINAL_LIBRARY =  | 
| 
 
2050b5723c04
added a library for basic nominal functions; separated nominal_eqvt file
 
Christian Urban <urbanc@in.tum.de> 
parents:  
diff
changeset
 | 
142  | 
struct  | 
| 
 
2050b5723c04
added a library for basic nominal functions; separated nominal_eqvt file
 
Christian Urban <urbanc@in.tum.de> 
parents:  
diff
changeset
 | 
143  | 
|
| 
2635
 
64b4cb2c2bf8
simple cases for string rule inductions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2630 
diff
changeset
 | 
144  | 
(* orders an AList according to keys - every key needs to be there *)  | 
| 
2593
 
25dcb2b1329e
ordered raw_bn_info to agree with the order of the raw_bn_functions; started alpha_bn proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2571 
diff
changeset
 | 
145  | 
fun order eq keys list =  | 
| 
 
25dcb2b1329e
ordered raw_bn_info to agree with the order of the raw_bn_functions; started alpha_bn proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2571 
diff
changeset
 | 
146  | 
map (the o AList.lookup eq list) keys  | 
| 
2480
 
ac7dff1194e8
introduced a general procedure for structural inductions; simplified reflexivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2477 
diff
changeset
 | 
147  | 
|
| 
2635
 
64b4cb2c2bf8
simple cases for string rule inductions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2630 
diff
changeset
 | 
148  | 
(* orders an AList according to keys - returns default for non-existing keys *)  | 
| 
 
64b4cb2c2bf8
simple cases for string rule inductions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2630 
diff
changeset
 | 
149  | 
fun order_default eq default keys list =  | 
| 
 
64b4cb2c2bf8
simple cases for string rule inductions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2630 
diff
changeset
 | 
150  | 
map (the_default default o AList.lookup eq list) keys  | 
| 
 
64b4cb2c2bf8
simple cases for string rule inductions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2630 
diff
changeset
 | 
151  | 
|
| 
2611
 
3d101f2f817c
simple cases for strong inducts done; infrastructure for the difficult ones is there
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2609 
diff
changeset
 | 
152  | 
(* remove duplicates *)  | 
| 
2608
 
86e3b39c2a60
created strong_exhausts terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2607 
diff
changeset
 | 
153  | 
fun remove_dups eq [] = []  | 
| 
2611
 
3d101f2f817c
simple cases for strong inducts done; infrastructure for the difficult ones is there
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2609 
diff
changeset
 | 
154  | 
| remove_dups eq (x :: xs) =  | 
| 
 
3d101f2f817c
simple cases for strong inducts done; infrastructure for the difficult ones is there
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2609 
diff
changeset
 | 
155  | 
if member eq xs x  | 
| 
2608
 
86e3b39c2a60
created strong_exhausts terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2607 
diff
changeset
 | 
156  | 
then remove_dups eq xs  | 
| 
2611
 
3d101f2f817c
simple cases for strong inducts done; infrastructure for the difficult ones is there
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2609 
diff
changeset
 | 
157  | 
else x :: remove_dups eq xs  | 
| 
2608
 
86e3b39c2a60
created strong_exhausts terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2607 
diff
changeset
 | 
158  | 
|
| 
2313
 
25d2cdf7d7e4
transitivity proofs done
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2311 
diff
changeset
 | 
159  | 
fun last2 [] = raise Empty  | 
| 
 
25d2cdf7d7e4
transitivity proofs done
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2311 
diff
changeset
 | 
160  | 
| last2 [_] = raise Empty  | 
| 2375 | 161  | 
| last2 [x, y] = (x, y)  | 
| 
2313
 
25d2cdf7d7e4
transitivity proofs done
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2311 
diff
changeset
 | 
162  | 
| last2 (_ :: xs) = last2 xs  | 
| 
 
25d2cdf7d7e4
transitivity proofs done
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2311 
diff
changeset
 | 
163  | 
|
| 
2635
 
64b4cb2c2bf8
simple cases for string rule inductions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2630 
diff
changeset
 | 
164  | 
fun split_last2 xs =  | 
| 
 
64b4cb2c2bf8
simple cases for string rule inductions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2630 
diff
changeset
 | 
165  | 
let  | 
| 
 
64b4cb2c2bf8
simple cases for string rule inductions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2630 
diff
changeset
 | 
166  | 
val (xs', x) = split_last xs  | 
| 
 
64b4cb2c2bf8
simple cases for string rule inductions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2630 
diff
changeset
 | 
167  | 
val (xs'', y) = split_last xs'  | 
| 
 
64b4cb2c2bf8
simple cases for string rule inductions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2630 
diff
changeset
 | 
168  | 
in  | 
| 
 
64b4cb2c2bf8
simple cases for string rule inductions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2630 
diff
changeset
 | 
169  | 
(xs'', y, x)  | 
| 
 
64b4cb2c2bf8
simple cases for string rule inductions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2630 
diff
changeset
 | 
170  | 
end  | 
| 
 
64b4cb2c2bf8
simple cases for string rule inductions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2630 
diff
changeset
 | 
171  | 
|
| 2619 | 172  | 
fun map4 _ [] [] [] [] = []  | 
173  | 
| map4 f (x :: xs) (y :: ys) (z :: zs) (u :: us) = f x y z u :: map4 f xs ys zs us  | 
|
| 2613 | 174  | 
|
| 
2616
 
dd7490fdd998
all examples for strong exhausts work; recursive binders need to be treated differently; still unclean version with lots of diagnostic code
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2613 
diff
changeset
 | 
175  | 
fun split_filter f [] = ([], [])  | 
| 
 
dd7490fdd998
all examples for strong exhausts work; recursive binders need to be treated differently; still unclean version with lots of diagnostic code
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2613 
diff
changeset
 | 
176  | 
| split_filter f (x :: xs) =  | 
| 
 
dd7490fdd998
all examples for strong exhausts work; recursive binders need to be treated differently; still unclean version with lots of diagnostic code
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2613 
diff
changeset
 | 
177  | 
let  | 
| 
 
dd7490fdd998
all examples for strong exhausts work; recursive binders need to be treated differently; still unclean version with lots of diagnostic code
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2613 
diff
changeset
 | 
178  | 
val (r, l) = split_filter f xs  | 
| 
 
dd7490fdd998
all examples for strong exhausts work; recursive binders need to be treated differently; still unclean version with lots of diagnostic code
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2613 
diff
changeset
 | 
179  | 
in  | 
| 
 
dd7490fdd998
all examples for strong exhausts work; recursive binders need to be treated differently; still unclean version with lots of diagnostic code
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2613 
diff
changeset
 | 
180  | 
if f x  | 
| 
 
dd7490fdd998
all examples for strong exhausts work; recursive binders need to be treated differently; still unclean version with lots of diagnostic code
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2613 
diff
changeset
 | 
181  | 
then (x :: r, l)  | 
| 
 
dd7490fdd998
all examples for strong exhausts work; recursive binders need to be treated differently; still unclean version with lots of diagnostic code
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2613 
diff
changeset
 | 
182  | 
else (r, x :: l)  | 
| 
 
dd7490fdd998
all examples for strong exhausts work; recursive binders need to be treated differently; still unclean version with lots of diagnostic code
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2613 
diff
changeset
 | 
183  | 
end  | 
| 2613 | 184  | 
|
| 
2625
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
185  | 
(* to be used with left-infix binop-operations *)  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
186  | 
fun fold_left f [] z = z  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
187  | 
| fold_left f [x] z = x  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
188  | 
| fold_left f (x :: y :: xs) z = fold_left f (f (x, y) :: xs) z  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
189  | 
|
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
190  | 
|
| 2613 | 191  | 
|
| 
2593
 
25dcb2b1329e
ordered raw_bn_info to agree with the order of the raw_bn_functions; started alpha_bn proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2571 
diff
changeset
 | 
192  | 
fun is_true @{term "Trueprop True"} = true
 | 
| 
 
25dcb2b1329e
ordered raw_bn_info to agree with the order of the raw_bn_functions; started alpha_bn proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2571 
diff
changeset
 | 
193  | 
| is_true _ = false  | 
| 
 
25dcb2b1329e
ordered raw_bn_info to agree with the order of the raw_bn_functions; started alpha_bn proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2571 
diff
changeset
 | 
194  | 
|
| 
2288
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
195  | 
fun dest_listT (Type (@{type_name list}, [T])) = T
 | 
| 
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
196  | 
  | dest_listT T = raise TYPE ("dest_listT: list type expected", [T], [])
 | 
| 
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
197  | 
|
| 
2607
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
198  | 
fun dest_fsetT (Type (@{type_name fset}, [T])) = T
 | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
199  | 
  | dest_fsetT T = raise TYPE ("dest_fsetT: fset type expected", [T], []);
 | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
200  | 
|
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
201  | 
|
| 
2620
 
81921f8ad245
updated to Isabelle 22 December
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2619 
diff
changeset
 | 
202  | 
fun mk_id trm = HOLogic.id_const (fastype_of trm) $ trm  | 
| 
2593
 
25dcb2b1329e
ordered raw_bn_info to agree with the order of the raw_bn_functions; started alpha_bn proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2571 
diff
changeset
 | 
203  | 
|
| 
2609
 
666ffc8a92a9
freshness theorem in strong exhausts; (temporarily includes a cheat_tac to make all tests go through)
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2608 
diff
changeset
 | 
204  | 
fun mk_all (a, T) t = Term.all T $ Abs (a, T, t)  | 
| 
 
666ffc8a92a9
freshness theorem in strong exhausts; (temporarily includes a cheat_tac to make all tests go through)
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2608 
diff
changeset
 | 
205  | 
|
| 
2635
 
64b4cb2c2bf8
simple cases for string rule inductions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2630 
diff
changeset
 | 
206  | 
fun mk_All (a, T) t = HOLogic.all_const T $ Abs (a, T, t)  | 
| 
 
64b4cb2c2bf8
simple cases for string rule inductions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2630 
diff
changeset
 | 
207  | 
|
| 
2637
 
3890483c674f
final version of the ESOP paper; used set+ instead of res as requested by one reviewer
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2635 
diff
changeset
 | 
208  | 
fun mk_exists (a, T) t = HOLogic.exists_const T $ Abs (a, T, t)  | 
| 
 
3890483c674f
final version of the ESOP paper; used set+ instead of res as requested by one reviewer
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2635 
diff
changeset
 | 
209  | 
|
| 
2410
 
2bbdb9c427b5
improved runtime slightly, by constructing an explicit size measure for the function definitions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2408 
diff
changeset
 | 
210  | 
fun sum_case_const ty1 ty2 ty3 =  | 
| 
 
2bbdb9c427b5
improved runtime slightly, by constructing an explicit size measure for the function definitions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2408 
diff
changeset
 | 
211  | 
  Const (@{const_name sum_case}, [ty1 --> ty3, ty2 --> ty3, Type (@{type_name sum}, [ty1, ty2])] ---> ty3)
 | 
| 
2611
 
3d101f2f817c
simple cases for strong inducts done; infrastructure for the difficult ones is there
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2609 
diff
changeset
 | 
212  | 
|
| 
2410
 
2bbdb9c427b5
improved runtime slightly, by constructing an explicit size measure for the function definitions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2408 
diff
changeset
 | 
213  | 
fun mk_sum_case trm1 trm2 =  | 
| 2477 | 214  | 
let  | 
215  | 
val ([ty1], ty3) = strip_type (fastype_of trm1)  | 
|
216  | 
val ty2 = domain_type (fastype_of trm2)  | 
|
217  | 
in  | 
|
218  | 
sum_case_const ty1 ty2 ty3 $ trm1 $ trm2  | 
|
219  | 
end  | 
|
| 
2410
 
2bbdb9c427b5
improved runtime slightly, by constructing an explicit size measure for the function definitions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2408 
diff
changeset
 | 
220  | 
|
| 
 
2bbdb9c427b5
improved runtime slightly, by constructing an explicit size measure for the function definitions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2408 
diff
changeset
 | 
221  | 
|
| 
 
2bbdb9c427b5
improved runtime slightly, by constructing an explicit size measure for the function definitions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2408 
diff
changeset
 | 
222  | 
|
| 2399 | 223  | 
fun mk_minus p = @{term "uminus::perm => perm"} $ p
 | 
| 
1896
 
996d4411e95e
tuned; fleshed out some library functions about permutations; closed Datatype_Aux structure (increases readability)
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1871 
diff
changeset
 | 
224  | 
|
| 2399 | 225  | 
fun mk_plus p q = @{term "plus::perm => perm => perm"} $ p $ q
 | 
226  | 
||
227  | 
fun perm_ty ty = @{typ "perm"} --> ty --> ty
 | 
|
| 
2635
 
64b4cb2c2bf8
simple cases for string rule inductions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2630 
diff
changeset
 | 
228  | 
fun perm_const ty  = Const (@{const_name "permute"}, perm_ty ty)
 | 
| 
 
64b4cb2c2bf8
simple cases for string rule inductions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2630 
diff
changeset
 | 
229  | 
fun mk_perm_ty ty p trm = perm_const ty $ p $ trm  | 
| 2399 | 230  | 
fun mk_perm p trm = mk_perm_ty (fastype_of trm) p trm  | 
| 
1833
 
2050b5723c04
added a library for basic nominal functions; separated nominal_eqvt file
 
Christian Urban <urbanc@in.tum.de> 
parents:  
diff
changeset
 | 
231  | 
|
| 
1834
 
9909cc3566c5
moved a couple of more functions to the library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1833 
diff
changeset
 | 
232  | 
fun dest_perm (Const (@{const_name "permute"}, _) $ p $ t) = (p, t)
 | 
| 
1979
 
760257a66604
added basic functions for constructing supp-terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1963 
diff
changeset
 | 
233  | 
  | dest_perm t = raise TERM ("dest_perm", [t]);
 | 
| 
1833
 
2050b5723c04
added a library for basic nominal functions; separated nominal_eqvt file
 
Christian Urban <urbanc@in.tum.de> 
parents:  
diff
changeset
 | 
234  | 
|
| 
1962
 
84a13d1e2511
moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1899 
diff
changeset
 | 
235  | 
fun mk_sort_of t = @{term "sort_of"} $ t;
 | 
| 
 
84a13d1e2511
moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1899 
diff
changeset
 | 
236  | 
|
| 
1979
 
760257a66604
added basic functions for constructing supp-terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1963 
diff
changeset
 | 
237  | 
fun atom_ty ty = ty --> @{typ "atom"};
 | 
| 
2569
 
94750b31a97d
fixed bug in fv function where a shallow binder binds lists of names
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2568 
diff
changeset
 | 
238  | 
fun atom_const ty = Const (@{const_name "atom"}, atom_ty ty)
 | 
| 
 
94750b31a97d
fixed bug in fv function where a shallow binder binds lists of names
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2568 
diff
changeset
 | 
239  | 
fun mk_atom_ty ty t = atom_const ty $ t;  | 
| 
1962
 
84a13d1e2511
moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1899 
diff
changeset
 | 
240  | 
fun mk_atom t = mk_atom_ty (fastype_of t) t;  | 
| 
 
84a13d1e2511
moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1899 
diff
changeset
 | 
241  | 
|
| 
2607
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
242  | 
fun mk_atom_set_ty ty t =  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
243  | 
let  | 
| 
2611
 
3d101f2f817c
simple cases for strong inducts done; infrastructure for the difficult ones is there
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2609 
diff
changeset
 | 
244  | 
val atom_ty = HOLogic.dest_setT ty  | 
| 
 
3d101f2f817c
simple cases for strong inducts done; infrastructure for the difficult ones is there
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2609 
diff
changeset
 | 
245  | 
    val img_ty = (atom_ty --> @{typ atom}) --> ty --> @{typ "atom set"};
 | 
| 
2607
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
246  | 
in  | 
| 
2611
 
3d101f2f817c
simple cases for strong inducts done; infrastructure for the difficult ones is there
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2609 
diff
changeset
 | 
247  | 
    Const (@{const_name image}, img_ty) $ atom_const atom_ty $ t
 | 
| 
2607
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
248  | 
end  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
249  | 
|
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
250  | 
fun mk_atom_fset_ty ty t =  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
251  | 
let  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
252  | 
val atom_ty = dest_fsetT ty  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
253  | 
    val fmap_ty = (atom_ty --> @{typ atom}) --> ty --> @{typ "atom fset"};
 | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
254  | 
in  | 
| 
2611
 
3d101f2f817c
simple cases for strong inducts done; infrastructure for the difficult ones is there
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2609 
diff
changeset
 | 
255  | 
    Const (@{const_name map_fset}, fmap_ty) $ atom_const atom_ty $ t
 | 
| 
2607
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
256  | 
end  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
257  | 
|
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
258  | 
fun mk_atom_list_ty ty t =  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
259  | 
let  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
260  | 
val atom_ty = dest_listT ty  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
261  | 
    val map_ty = (atom_ty --> @{typ atom}) --> ty --> @{typ "atom list"}
 | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
262  | 
in  | 
| 
2611
 
3d101f2f817c
simple cases for strong inducts done; infrastructure for the difficult ones is there
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2609 
diff
changeset
 | 
263  | 
    Const (@{const_name map}, map_ty) $ atom_const atom_ty $ t
 | 
| 
2607
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
264  | 
end  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
265  | 
|
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
266  | 
fun mk_atom_set t = mk_atom_set_ty (fastype_of t) t  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
267  | 
fun mk_atom_fset t = mk_atom_fset_ty (fastype_of t) t  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
268  | 
fun mk_atom_list t = mk_atom_list_ty (fastype_of t) t  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
269  | 
|
| 
2608
 
86e3b39c2a60
created strong_exhausts terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2607 
diff
changeset
 | 
270  | 
(* coerces a list into a set *)  | 
| 
 
86e3b39c2a60
created strong_exhausts terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2607 
diff
changeset
 | 
271  | 
|
| 
 
86e3b39c2a60
created strong_exhausts terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2607 
diff
changeset
 | 
272  | 
fun to_set_ty ty t =  | 
| 
2611
 
3d101f2f817c
simple cases for strong inducts done; infrastructure for the difficult ones is there
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2609 
diff
changeset
 | 
273  | 
case ty of  | 
| 
 
3d101f2f817c
simple cases for strong inducts done; infrastructure for the difficult ones is there
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2609 
diff
changeset
 | 
274  | 
    @{typ "atom list"} => @{term "set :: atom list => atom set"} $ t
 | 
| 
 
3d101f2f817c
simple cases for strong inducts done; infrastructure for the difficult ones is there
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2609 
diff
changeset
 | 
275  | 
  | @{typ "atom fset"} => @{term "fset :: atom fset => atom set"} $ t
 | 
| 
 
3d101f2f817c
simple cases for strong inducts done; infrastructure for the difficult ones is there
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2609 
diff
changeset
 | 
276  | 
| _ => t  | 
| 
2608
 
86e3b39c2a60
created strong_exhausts terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2607 
diff
changeset
 | 
277  | 
|
| 
 
86e3b39c2a60
created strong_exhausts terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2607 
diff
changeset
 | 
278  | 
fun to_set t = to_set_ty (fastype_of t) t  | 
| 
2607
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
279  | 
|
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
280  | 
|
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
281  | 
(* testing for concrete atom types *)  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
282  | 
fun is_atom ctxt ty =  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
283  | 
  Sign.of_sort (ProofContext.theory_of ctxt) (ty, @{sort at_base})
 | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
284  | 
|
| 
2608
 
86e3b39c2a60
created strong_exhausts terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2607 
diff
changeset
 | 
285  | 
fun is_atom_set ctxt (Type ("fun", [ty, @{typ bool}])) = is_atom ctxt ty
 | 
| 
2607
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
286  | 
| is_atom_set _ _ = false;  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
287  | 
|
| 
2608
 
86e3b39c2a60
created strong_exhausts terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2607 
diff
changeset
 | 
288  | 
fun is_atom_fset ctxt (Type (@{type_name "fset"}, [ty])) = is_atom ctxt ty
 | 
| 
2607
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
289  | 
| is_atom_fset _ _ = false;  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
290  | 
|
| 
2608
 
86e3b39c2a60
created strong_exhausts terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2607 
diff
changeset
 | 
291  | 
fun is_atom_list ctxt (Type (@{type_name "list"}, [ty])) = is_atom ctxt ty
 | 
| 
2607
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
292  | 
| is_atom_list _ _ = false  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
293  | 
|
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
294  | 
|
| 
2611
 
3d101f2f817c
simple cases for strong inducts done; infrastructure for the difficult ones is there
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2609 
diff
changeset
 | 
295  | 
(* functions that coerce singletons, sets, fsets and lists of concrete  | 
| 
 
3d101f2f817c
simple cases for strong inducts done; infrastructure for the difficult ones is there
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2609 
diff
changeset
 | 
296  | 
atoms into general atoms sets / lists *)  | 
| 
 
3d101f2f817c
simple cases for strong inducts done; infrastructure for the difficult ones is there
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2609 
diff
changeset
 | 
297  | 
fun atomify_ty ctxt ty t =  | 
| 
 
3d101f2f817c
simple cases for strong inducts done; infrastructure for the difficult ones is there
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2609 
diff
changeset
 | 
298  | 
if is_atom ctxt ty  | 
| 
 
3d101f2f817c
simple cases for strong inducts done; infrastructure for the difficult ones is there
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2609 
diff
changeset
 | 
299  | 
then mk_atom_ty ty t  | 
| 
 
3d101f2f817c
simple cases for strong inducts done; infrastructure for the difficult ones is there
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2609 
diff
changeset
 | 
300  | 
else if is_atom_set ctxt ty  | 
| 
 
3d101f2f817c
simple cases for strong inducts done; infrastructure for the difficult ones is there
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2609 
diff
changeset
 | 
301  | 
then mk_atom_set_ty ty t  | 
| 
 
3d101f2f817c
simple cases for strong inducts done; infrastructure for the difficult ones is there
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2609 
diff
changeset
 | 
302  | 
else if is_atom_fset ctxt ty  | 
| 
 
3d101f2f817c
simple cases for strong inducts done; infrastructure for the difficult ones is there
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2609 
diff
changeset
 | 
303  | 
then mk_atom_fset_ty ty t  | 
| 
 
3d101f2f817c
simple cases for strong inducts done; infrastructure for the difficult ones is there
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2609 
diff
changeset
 | 
304  | 
else if is_atom_list ctxt ty  | 
| 
 
3d101f2f817c
simple cases for strong inducts done; infrastructure for the difficult ones is there
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2609 
diff
changeset
 | 
305  | 
then mk_atom_list_ty ty t  | 
| 
 
3d101f2f817c
simple cases for strong inducts done; infrastructure for the difficult ones is there
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2609 
diff
changeset
 | 
306  | 
  else raise TERM ("atomify", [t])
 | 
| 
 
3d101f2f817c
simple cases for strong inducts done; infrastructure for the difficult ones is there
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2609 
diff
changeset
 | 
307  | 
|
| 
2607
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
308  | 
fun setify_ty ctxt ty t =  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
309  | 
if is_atom ctxt ty  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
310  | 
    then  HOLogic.mk_set @{typ atom} [mk_atom_ty ty t]
 | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
311  | 
else if is_atom_set ctxt ty  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
312  | 
then mk_atom_set_ty ty t  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
313  | 
else if is_atom_fset ctxt ty  | 
| 
2611
 
3d101f2f817c
simple cases for strong inducts done; infrastructure for the difficult ones is there
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2609 
diff
changeset
 | 
314  | 
    then @{term "fset :: atom fset => atom set"} $ mk_atom_fset_ty ty t
 | 
| 
2608
 
86e3b39c2a60
created strong_exhausts terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2607 
diff
changeset
 | 
315  | 
else if is_atom_list ctxt ty  | 
| 
2611
 
3d101f2f817c
simple cases for strong inducts done; infrastructure for the difficult ones is there
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2609 
diff
changeset
 | 
316  | 
    then @{term "set :: atom list => atom set"} $ mk_atom_list_ty ty t
 | 
| 
2607
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
317  | 
  else raise TERM ("setify", [t])
 | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
318  | 
|
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
319  | 
fun listify_ty ctxt ty t =  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
320  | 
if is_atom ctxt ty  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
321  | 
    then HOLogic.mk_list @{typ atom} [mk_atom_ty ty t]
 | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
322  | 
else if is_atom_list ctxt ty  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
323  | 
then mk_atom_list_ty ty t  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
324  | 
  else raise TERM ("listify", [t])
 | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
325  | 
|
| 
2611
 
3d101f2f817c
simple cases for strong inducts done; infrastructure for the difficult ones is there
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2609 
diff
changeset
 | 
326  | 
fun atomify ctxt t = atomify_ty ctxt (fastype_of t) t  | 
| 
 
3d101f2f817c
simple cases for strong inducts done; infrastructure for the difficult ones is there
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2609 
diff
changeset
 | 
327  | 
fun setify ctxt t = setify_ty ctxt (fastype_of t) t  | 
| 
2607
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
328  | 
fun listify ctxt t = listify_ty ctxt (fastype_of t) t  | 
| 
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
329  | 
|
| 
2608
 
86e3b39c2a60
created strong_exhausts terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2607 
diff
changeset
 | 
330  | 
fun fresh_star_ty ty = [@{typ "atom set"}, ty] ---> @{typ bool}
 | 
| 
 
86e3b39c2a60
created strong_exhausts terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2607 
diff
changeset
 | 
331  | 
fun fresh_star_const ty = Const (@{const_name fresh_star}, fresh_star_ty ty)
 | 
| 
 
86e3b39c2a60
created strong_exhausts terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2607 
diff
changeset
 | 
332  | 
fun mk_fresh_star_ty ty t1 t2 = fresh_star_const ty $ t1 $ t2  | 
| 
 
86e3b39c2a60
created strong_exhausts terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2607 
diff
changeset
 | 
333  | 
fun mk_fresh_star t1 t2 = mk_fresh_star_ty (fastype_of t2) t1 t2  | 
| 
2607
 
7430e07a5d61
moved setify and listify functions into the library; introduced versions that have a type argument
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2603 
diff
changeset
 | 
334  | 
|
| 
1979
 
760257a66604
added basic functions for constructing supp-terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1963 
diff
changeset
 | 
335  | 
fun supp_ty ty = ty --> @{typ "atom set"};
 | 
| 
2450
 
217ef3e4282e
added proofs for fsupp properties
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2448 
diff
changeset
 | 
336  | 
fun supp_const ty = Const (@{const_name supp}, supp_ty ty)
 | 
| 
2475
 
486d4647bb37
supp-proofs work except for CoreHaskell and Modules (induct is probably not finding the correct instance)
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2464 
diff
changeset
 | 
337  | 
fun mk_supp_ty ty t = supp_const ty $ t  | 
| 
 
486d4647bb37
supp-proofs work except for CoreHaskell and Modules (induct is probably not finding the correct instance)
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2464 
diff
changeset
 | 
338  | 
fun mk_supp t = mk_supp_ty (fastype_of t) t  | 
| 
 
486d4647bb37
supp-proofs work except for CoreHaskell and Modules (induct is probably not finding the correct instance)
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2464 
diff
changeset
 | 
339  | 
|
| 
 
486d4647bb37
supp-proofs work except for CoreHaskell and Modules (induct is probably not finding the correct instance)
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2464 
diff
changeset
 | 
340  | 
fun supp_rel_ty ty = ([ty, ty] ---> @{typ bool}) --> ty --> @{typ "atom set"};
 | 
| 
 
486d4647bb37
supp-proofs work except for CoreHaskell and Modules (induct is probably not finding the correct instance)
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2464 
diff
changeset
 | 
341  | 
fun supp_rel_const ty = Const (@{const_name supp_rel}, supp_rel_ty ty)
 | 
| 
 
486d4647bb37
supp-proofs work except for CoreHaskell and Modules (induct is probably not finding the correct instance)
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2464 
diff
changeset
 | 
342  | 
fun mk_supp_rel_ty ty r t = supp_rel_const ty $ r $ t  | 
| 
 
486d4647bb37
supp-proofs work except for CoreHaskell and Modules (induct is probably not finding the correct instance)
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2464 
diff
changeset
 | 
343  | 
fun mk_supp_rel r t = mk_supp_rel_ty (fastype_of t) r t  | 
| 
1979
 
760257a66604
added basic functions for constructing supp-terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1963 
diff
changeset
 | 
344  | 
|
| 
2450
 
217ef3e4282e
added proofs for fsupp properties
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2448 
diff
changeset
 | 
345  | 
fun supports_const ty = Const (@{const_name supports}, [@{typ "atom set"}, ty] ---> @{typ bool});
 | 
| 2448 | 346  | 
fun mk_supports_ty ty t1 t2 = supports_const ty $ t1 $ t2;  | 
347  | 
fun mk_supports t1 t2 = mk_supports_ty (fastype_of t2) t1 t2;  | 
|
| 
1979
 
760257a66604
added basic functions for constructing supp-terms
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1963 
diff
changeset
 | 
348  | 
|
| 
2450
 
217ef3e4282e
added proofs for fsupp properties
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2448 
diff
changeset
 | 
349  | 
fun finite_const ty = Const (@{const_name finite}, ty --> @{typ bool})
 | 
| 
 
217ef3e4282e
added proofs for fsupp properties
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2448 
diff
changeset
 | 
350  | 
fun mk_finite_ty ty t = finite_const ty $ t  | 
| 
 
217ef3e4282e
added proofs for fsupp properties
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2448 
diff
changeset
 | 
351  | 
fun mk_finite t = mk_finite_ty (fastype_of t) t  | 
| 
 
217ef3e4282e
added proofs for fsupp properties
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2448 
diff
changeset
 | 
352  | 
|
| 
 
217ef3e4282e
added proofs for fsupp properties
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2448 
diff
changeset
 | 
353  | 
|
| 
1834
 
9909cc3566c5
moved a couple of more functions to the library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1833 
diff
changeset
 | 
354  | 
fun mk_equiv r = r RS @{thm eq_reflection};
 | 
| 
 
9909cc3566c5
moved a couple of more functions to the library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1833 
diff
changeset
 | 
355  | 
fun safe_mk_equiv r = mk_equiv r handle Thm.THM _ => r;  | 
| 
1833
 
2050b5723c04
added a library for basic nominal functions; separated nominal_eqvt file
 
Christian Urban <urbanc@in.tum.de> 
parents:  
diff
changeset
 | 
356  | 
|
| 
1962
 
84a13d1e2511
moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1899 
diff
changeset
 | 
357  | 
|
| 2296 | 358  | 
(* functions that construct differences, appends and unions  | 
359  | 
but avoid producing empty atom sets or empty atom lists *)  | 
|
| 
2289
 
bf748be70109
moved some mk_union and mk_diff into the library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2288 
diff
changeset
 | 
360  | 
|
| 
 
bf748be70109
moved some mk_union and mk_diff into the library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2288 
diff
changeset
 | 
361  | 
fun mk_diff (@{term "{}::atom set"}, _) = @{term "{}::atom set"}
 | 
| 
 
bf748be70109
moved some mk_union and mk_diff into the library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2288 
diff
changeset
 | 
362  | 
  | mk_diff (t1, @{term "{}::atom set"}) = t1
 | 
| 
2464
 
f4eba60cbd69
made the fv-definition aggree more with alpha (needed in the support proofs)
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2450 
diff
changeset
 | 
363  | 
  | mk_diff (@{term "set ([]::atom list)"}, _) = @{term "set ([]::atom list)"}
 | 
| 
 
f4eba60cbd69
made the fv-definition aggree more with alpha (needed in the support proofs)
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2450 
diff
changeset
 | 
364  | 
  | mk_diff (t1, @{term "set ([]::atom list)"}) = t1
 | 
| 
2289
 
bf748be70109
moved some mk_union and mk_diff into the library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2288 
diff
changeset
 | 
365  | 
  | mk_diff (t1, t2) = HOLogic.mk_binop @{const_name minus} (t1, t2)
 | 
| 
 
bf748be70109
moved some mk_union and mk_diff into the library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2288 
diff
changeset
 | 
366  | 
|
| 
2389
 
0f24c961b5f6
introduced a general alpha_prove method
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2384 
diff
changeset
 | 
367  | 
fun mk_append (t1, @{term "[]::atom list"}) = t1
 | 
| 2296 | 368  | 
  | mk_append (@{term "[]::atom list"}, t2) = t2
 | 
369  | 
  | mk_append (t1, t2) = HOLogic.mk_binop @{const_name "append"} (t1, t2) 
 | 
|
370  | 
||
| 
2389
 
0f24c961b5f6
introduced a general alpha_prove method
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2384 
diff
changeset
 | 
371  | 
fun mk_union (t1, @{term "{}::atom set"}) = t1
 | 
| 
2289
 
bf748be70109
moved some mk_union and mk_diff into the library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2288 
diff
changeset
 | 
372  | 
  | mk_union (@{term "{}::atom set"}, t2) = t2
 | 
| 
2464
 
f4eba60cbd69
made the fv-definition aggree more with alpha (needed in the support proofs)
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2450 
diff
changeset
 | 
373  | 
  | mk_union (t1, @{term "set ([]::atom list)"}) = t1
 | 
| 
 
f4eba60cbd69
made the fv-definition aggree more with alpha (needed in the support proofs)
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2450 
diff
changeset
 | 
374  | 
  | mk_union (@{term "set ([]::atom list)"}, t2) = t2
 | 
| 2296 | 375  | 
  | mk_union (t1, t2) = HOLogic.mk_binop @{const_name "sup"} (t1, t2)  
 | 
| 
2289
 
bf748be70109
moved some mk_union and mk_diff into the library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2288 
diff
changeset
 | 
376  | 
|
| 
2384
 
841b7e34e70a
fixed order of fold_union to make alpha and fv agree
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2375 
diff
changeset
 | 
377  | 
fun fold_union trms = fold_rev (curry mk_union) trms @{term "{}::atom set"}
 | 
| 
2464
 
f4eba60cbd69
made the fv-definition aggree more with alpha (needed in the support proofs)
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2450 
diff
changeset
 | 
378  | 
fun fold_append trms = fold_rev (curry mk_append) trms @{term "[]::atom list"}
 | 
| 
2289
 
bf748be70109
moved some mk_union and mk_diff into the library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2288 
diff
changeset
 | 
379  | 
|
| 
2389
 
0f24c961b5f6
introduced a general alpha_prove method
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2384 
diff
changeset
 | 
380  | 
fun mk_conj (t1, @{term "True"}) = t1
 | 
| 
 
0f24c961b5f6
introduced a general alpha_prove method
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2384 
diff
changeset
 | 
381  | 
  | mk_conj (@{term "True"}, t2) = t2
 | 
| 
 
0f24c961b5f6
introduced a general alpha_prove method
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2384 
diff
changeset
 | 
382  | 
| mk_conj (t1, t2) = HOLogic.mk_conj (t1, t2)  | 
| 
2289
 
bf748be70109
moved some mk_union and mk_diff into the library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2288 
diff
changeset
 | 
383  | 
|
| 
2389
 
0f24c961b5f6
introduced a general alpha_prove method
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2384 
diff
changeset
 | 
384  | 
fun fold_conj trms = fold_rev (curry mk_conj) trms @{term "True"}
 | 
| 2296 | 385  | 
|
| 2448 | 386  | 
|
| 
2625
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
387  | 
(* functions for de-Bruijn open terms *)  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
388  | 
|
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
389  | 
fun mk_binop_env tys c (t, u) =  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
390  | 
let  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
391  | 
val ty = fastype_of1 (tys, t)  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
392  | 
in  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
393  | 
Const (c, [ty, ty] ---> ty) $ t $ u  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
394  | 
end  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
395  | 
|
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
396  | 
fun mk_union_env tys (t1, @{term "{}::atom set"}) = t1
 | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
397  | 
  | mk_union_env tys (@{term "{}::atom set"}, t2) = t2
 | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
398  | 
  | mk_union_env tys (t1, @{term "set ([]::atom list)"}) = t1
 | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
399  | 
  | mk_union_env tys (@{term "set ([]::atom list)"}, t2) = t2
 | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
400  | 
  | mk_union_env tys (t1, t2) = mk_binop_env tys @{const_name "sup"} (t1, t2)  
 | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
401  | 
|
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
402  | 
fun fold_union_env tys trms = fold_left (mk_union_env tys) trms @{term "{}::atom set"} 
 | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
403  | 
|
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
404  | 
|
| 2448 | 405  | 
(* produces fresh arguments for a term *)  | 
406  | 
||
407  | 
fun fresh_args ctxt f =  | 
|
408  | 
f |> fastype_of  | 
|
409  | 
|> binder_types  | 
|
410  | 
|> map (pair "z")  | 
|
411  | 
|> Variable.variant_frees ctxt [f]  | 
|
412  | 
|> map Free  | 
|
413  | 
||
414  | 
||
| 
2625
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
415  | 
(** some logic operations **)  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
416  | 
|
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
417  | 
(* decompses a formula into params, premises and a conclusion *)  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
418  | 
fun strip_full_horn trm =  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
419  | 
let  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
420  | 
    fun strip_outer_params (Const ("all", _) $ Abs (a, T, t)) = strip_outer_params t |>> cons (a, T)
 | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
421  | 
| strip_outer_params B = ([], B)  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
422  | 
|
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
423  | 
val (params, body) = strip_outer_params trm  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
424  | 
val (prems, concl) = Logic.strip_horn body  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
425  | 
in  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
426  | 
(params, prems, concl)  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
427  | 
end  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
428  | 
|
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
429  | 
(* composes a formula out of params, premises and a conclusion *)  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
430  | 
fun mk_full_horn params prems concl =  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
431  | 
Logic.list_implies (prems, concl)  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
432  | 
|> fold_rev mk_all params  | 
| 2448 | 433  | 
|
| 
2288
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
434  | 
(** datatypes **)  | 
| 
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
435  | 
|
| 2407 | 436  | 
(* constructor infos *)  | 
437  | 
type cns_info = (term * typ * typ list * bool list) list  | 
|
| 
2288
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
438  | 
|
| 
2602
 
bcf558c445a4
moved some code into the nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2593 
diff
changeset
 | 
439  | 
(* - term for constructor constant  | 
| 
 
bcf558c445a4
moved some code into the nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2593 
diff
changeset
 | 
440  | 
- type of the constructor  | 
| 
 
bcf558c445a4
moved some code into the nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2593 
diff
changeset
 | 
441  | 
- types of the arguments  | 
| 
 
bcf558c445a4
moved some code into the nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2593 
diff
changeset
 | 
442  | 
- flags indicating whether the argument is recursive  | 
| 
 
bcf558c445a4
moved some code into the nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2593 
diff
changeset
 | 
443  | 
*)  | 
| 
 
bcf558c445a4
moved some code into the nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2593 
diff
changeset
 | 
444  | 
|
| 
2288
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
445  | 
(* returns the type of the nth datatype *)  | 
| 2296 | 446  | 
fun all_dtyps descr sorts =  | 
447  | 
map (fn n => Datatype_Aux.typ_of_dtyp descr sorts (Datatype_Aux.DtRec n)) (0 upto (length descr - 1))  | 
|
448  | 
||
| 
2288
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
449  | 
fun nth_dtyp descr sorts n =  | 
| 
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
450  | 
Datatype_Aux.typ_of_dtyp descr sorts (Datatype_Aux.DtRec n);  | 
| 
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
451  | 
|
| 
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
452  | 
(* returns info about constructors in a datatype *)  | 
| 
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
453  | 
fun all_dtyp_constrs_info descr =  | 
| 
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
454  | 
map (fn (_, (ty, vs, constrs)) => map (pair (ty, vs)) constrs) descr  | 
| 
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
455  | 
|
| 
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
456  | 
(* returns the constants of the constructors plus the  | 
| 
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
457  | 
corresponding type and types of arguments *)  | 
| 
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
458  | 
fun all_dtyp_constrs_types descr sorts =  | 
| 
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
459  | 
let  | 
| 2477 | 460  | 
fun aux ((ty_name, vs), (cname, args)) =  | 
461  | 
let  | 
|
462  | 
val vs_tys = map (Datatype_Aux.typ_of_dtyp descr sorts) vs  | 
|
463  | 
val ty = Type (ty_name, vs_tys)  | 
|
464  | 
val arg_tys = map (Datatype_Aux.typ_of_dtyp descr sorts) args  | 
|
465  | 
val is_rec = map Datatype_Aux.is_rec_type args  | 
|
466  | 
in  | 
|
467  | 
(Const (cname, arg_tys ---> ty), ty, arg_tys, is_rec)  | 
|
468  | 
end  | 
|
| 
2288
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
469  | 
in  | 
| 2477 | 470  | 
map (map aux) (all_dtyp_constrs_info descr)  | 
| 
2288
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
471  | 
end  | 
| 
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
472  | 
|
| 
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
473  | 
fun nth_dtyp_constrs_types descr sorts n =  | 
| 
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
474  | 
nth (all_dtyp_constrs_types descr sorts) n  | 
| 
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
475  | 
|
| 
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
476  | 
|
| 
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
477  | 
(* generates for every datatype a name str ^ dt_name  | 
| 
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
478  | 
plus and index for multiple occurences of a string *)  | 
| 
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
479  | 
fun prefix_dt_names descr sorts str =  | 
| 2477 | 480  | 
let  | 
481  | 
fun get_nth_name (i, _) =  | 
|
482  | 
Datatype_Aux.name_of_typ (nth_dtyp descr sorts i)  | 
|
483  | 
in  | 
|
484  | 
Datatype_Prop.indexify_names  | 
|
485  | 
(map (prefix str o get_nth_name) descr)  | 
|
486  | 
end  | 
|
| 
2288
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
487  | 
|
| 
 
3b83960f9544
new fv/fv_bn function (supp breaks now); exported raw perms and raw funs into separate ML-files
 
Christian Urban <urbanc@in.tum.de> 
parents: 
1979 
diff
changeset
 | 
488  | 
|
| 
2311
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
489  | 
|
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
490  | 
(** function package tactics **)  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
491  | 
|
| 
2304
 
8a98171ba1fc
all raw definitions are defined using function
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2296 
diff
changeset
 | 
492  | 
fun pat_completeness_simp simps lthy =  | 
| 2477 | 493  | 
let  | 
494  | 
    val simp_set = HOL_basic_ss addsimps (@{thms sum.inject sum.distinct} @ simps)
 | 
|
495  | 
in  | 
|
496  | 
Pat_Completeness.pat_completeness_tac lthy 1  | 
|
497  | 
THEN ALLGOALS (asm_full_simp_tac simp_set)  | 
|
498  | 
end  | 
|
| 
2304
 
8a98171ba1fc
all raw definitions are defined using function
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2296 
diff
changeset
 | 
499  | 
|
| 
2630
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
500  | 
(* simpset for size goals *)  | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
501  | 
val size_simpset = HOL_ss  | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
502  | 
addsimprocs Nat_Numeral_Simprocs.cancel_numerals  | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
503  | 
   addsimps @{thms in_measure wf_measure sum.cases add_Suc_right add.right_neutral 
 | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
504  | 
zero_less_Suc prod.size(1) mult_Suc_right}  | 
| 
2557
 
781fbc8c0591
fixed locally the problem with the function package; all tests work again
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2480 
diff
changeset
 | 
505  | 
|
| 
2630
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
506  | 
val natT = @{typ nat}
 | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
507  | 
|
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
508  | 
fun prod_size_const T1 T2 =  | 
| 2477 | 509  | 
let  | 
| 
2630
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
510  | 
val T1_fun = T1 --> natT  | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
511  | 
val T2_fun = T2 --> natT  | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
512  | 
val prodT = HOLogic.mk_prodT (T1, T2)  | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
513  | 
in  | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
514  | 
    Const (@{const_name prod_size}, [T1_fun, T2_fun, prodT] ---> natT)
 | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
515  | 
end  | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
516  | 
|
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
517  | 
fun snd_const T1 T2 =  | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
518  | 
  Const ("Product_Type.snd", HOLogic.mk_prodT (T1, T2) --> T2) 
 | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
519  | 
|
| 
2560
 
82e37a4595c7
automated permute_bn functions (raw ones first)
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2559 
diff
changeset
 | 
520  | 
|
| 
2630
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
521  | 
fun mk_measure_trm f ctxt T =  | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
522  | 
HOLogic.dest_setT T  | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
523  | 
|> fst o HOLogic.dest_prodT  | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
524  | 
|> f  | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
525  | 
  |> curry (op $) (Const (@{const_name "measure"}, dummyT))
 | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
526  | 
|> Syntax.check_term ctxt  | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
527  | 
|
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
528  | 
(* wf-goal arising in induction_schema *)  | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
529  | 
fun prove_termination_ind ctxt =  | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
530  | 
let  | 
| 
2560
 
82e37a4595c7
automated permute_bn functions (raw ones first)
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2559 
diff
changeset
 | 
531  | 
fun mk_size_measure T =  | 
| 
 
82e37a4595c7
automated permute_bn functions (raw ones first)
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2559 
diff
changeset
 | 
532  | 
case T of  | 
| 
2630
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
533  | 
        (Type (@{type_name Sum_Type.sum}, [T1, T2])) =>
 | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
534  | 
SumTree.mk_sumcase T1 T2 natT (mk_size_measure T1) (mk_size_measure T2)  | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
535  | 
      | (Type (@{type_name Product_Type.prod}, [T1, T2])) =>
 | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
536  | 
HOLogic.mk_comp (mk_size_measure T2, snd_const T1 T2)  | 
| 
2611
 
3d101f2f817c
simple cases for strong inducts done; infrastructure for the difficult ones is there
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2609 
diff
changeset
 | 
537  | 
| _ => HOLogic.size_const T  | 
| 
2304
 
8a98171ba1fc
all raw definitions are defined using function
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2296 
diff
changeset
 | 
538  | 
|
| 
2630
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
539  | 
val measure_trm = mk_measure_trm (mk_size_measure) ctxt  | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
540  | 
in  | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
541  | 
Function_Relation.relation_tac ctxt measure_trm  | 
| 2477 | 542  | 
end  | 
| 
2410
 
2bbdb9c427b5
improved runtime slightly, by constructing an explicit size measure for the function definitions
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2408 
diff
changeset
 | 
543  | 
|
| 
2630
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
544  | 
(* wf-goal arising in function definitions *)  | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
545  | 
fun prove_termination_fun size_simps ctxt =  | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
546  | 
let  | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
547  | 
fun mk_size_measure T =  | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
548  | 
case T of  | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
549  | 
      (Type (@{type_name Sum_Type.sum}, [T1, T2])) =>
 | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
550  | 
SumTree.mk_sumcase T1 T2 natT (mk_size_measure T1) (mk_size_measure T2)  | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
551  | 
    | (Type (@{type_name Product_Type.prod}, [T1, T2])) =>
 | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
552  | 
prod_size_const T1 T2 $ (mk_size_measure T1) $ (mk_size_measure T2)  | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
553  | 
| _ => HOLogic.size_const T  | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
554  | 
|
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
555  | 
val measure_trm = mk_measure_trm (mk_size_measure) ctxt  | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
556  | 
|
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
557  | 
val tac =  | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
558  | 
Function_Relation.relation_tac ctxt measure_trm  | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
559  | 
THEN_ALL_NEW simp_tac (size_simpset addsimps size_simps)  | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
560  | 
in  | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
561  | 
Function.prove_termination NONE (HEADGOAL tac) ctxt  | 
| 
 
8268b277d240
automated all strong induction lemmas
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2625 
diff
changeset
 | 
562  | 
end  | 
| 
2311
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
563  | 
|
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
564  | 
(** transformations of premises (in inductive proofs) **)  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
565  | 
|
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
566  | 
(*  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
567  | 
given the theorem F[t]; proves the theorem F[f t]  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
568  | 
|
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
569  | 
- F needs to be monotone  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
570  | 
- f returns either SOME for a term it fires on  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
571  | 
and NONE elsewhere  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
572  | 
*)  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
573  | 
fun map_term f t =  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
574  | 
(case f t of  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
575  | 
NONE => map_term' f t  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
576  | 
| x => x)  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
577  | 
and map_term' f (t $ u) =  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
578  | 
(case (map_term f t, map_term f u) of  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
579  | 
(NONE, NONE) => NONE  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
580  | 
| (SOME t'', NONE) => SOME (t'' $ u)  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
581  | 
| (NONE, SOME u'') => SOME (t $ u'')  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
582  | 
| (SOME t'', SOME u'') => SOME (t'' $ u''))  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
583  | 
| map_term' f (Abs (s, T, t)) =  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
584  | 
(case map_term f t of  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
585  | 
NONE => NONE  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
586  | 
| SOME t'' => SOME (Abs (s, T, t'')))  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
587  | 
| map_term' _ _ = NONE;  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
588  | 
|
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
589  | 
fun map_thm_tac ctxt tac thm =  | 
| 2477 | 590  | 
let  | 
591  | 
val monos = Inductive.get_monos ctxt  | 
|
592  | 
    val simps = HOL_basic_ss addsimps @{thms split_def}
 | 
|
593  | 
in  | 
|
594  | 
EVERY [cut_facts_tac [thm] 1, etac rev_mp 1,  | 
|
595  | 
REPEAT_DETERM (FIRSTGOAL (simp_tac simps THEN' resolve_tac monos)),  | 
|
596  | 
REPEAT_DETERM (rtac impI 1 THEN (atac 1 ORELSE tac))]  | 
|
597  | 
end  | 
|
| 
2311
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
598  | 
|
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
599  | 
fun map_thm ctxt f tac thm =  | 
| 2477 | 600  | 
let  | 
601  | 
val opt_goal_trm = map_term f (prop_of thm)  | 
|
602  | 
in  | 
|
603  | 
case opt_goal_trm of  | 
|
604  | 
NONE => thm  | 
|
605  | 
| SOME goal =>  | 
|
606  | 
Goal.prove ctxt [] [] goal (fn _ => map_thm_tac ctxt tac thm)  | 
|
607  | 
end  | 
|
| 
2311
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
608  | 
|
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
609  | 
(*  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
610  | 
inductive premises can be of the form  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
611  | 
R ... /\ P ...; split_conj_i picks out  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
612  | 
the part R or P part  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
613  | 
*)  | 
| 
2480
 
ac7dff1194e8
introduced a general procedure for structural inductions; simplified reflexivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2477 
diff
changeset
 | 
614  | 
fun split_conj1 names (Const (@{const_name "conj"}, _) $ f1 $ _) = 
 | 
| 
2311
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
615  | 
(case head_of f1 of  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
616  | 
Const (name, _) => if member (op =) names name then SOME f1 else NONE  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
617  | 
| _ => NONE)  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
618  | 
| split_conj1 _ _ = NONE;  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
619  | 
|
| 
2446
 
63c936b09764
updated to new Isabelle
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2420 
diff
changeset
 | 
620  | 
fun split_conj2 names (Const (@{const_name "conj"}, _) $ f1 $ f2) = 
 | 
| 
2311
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
621  | 
(case head_of f1 of  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
622  | 
Const (name, _) => if member (op =) names name then SOME f2 else NONE  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
623  | 
| _ => NONE)  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
624  | 
| split_conj2 _ _ = NONE;  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
625  | 
|
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
626  | 
fun transform_prem1 ctxt names thm =  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
627  | 
map_thm ctxt (split_conj1 names) (etac conjunct1 1) thm  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
628  | 
|
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
629  | 
fun transform_prem2 ctxt names thm =  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
630  | 
map_thm ctxt (split_conj2 names) (etac conjunct2 1) thm  | 
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
631  | 
|
| 
 
4da5c5c29009
work on transitivity proof
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2304 
diff
changeset
 | 
632  | 
|
| 
2397
 
c670a849af65
more experiments with lifting
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2389 
diff
changeset
 | 
633  | 
(* transformes a theorem into one of the object logic *)  | 
| 
 
c670a849af65
more experiments with lifting
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2389 
diff
changeset
 | 
634  | 
val atomize = Conv.fconv_rule Object_Logic.atomize o forall_intr_vars  | 
| 
 
c670a849af65
more experiments with lifting
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2389 
diff
changeset
 | 
635  | 
|
| 
2625
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
636  | 
(* applies a tactic to a formula composed of conjunctions *)  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
637  | 
fun conj_tac tac i =  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
638  | 
let  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
639  | 
fun select (trm, i) =  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
640  | 
case trm of  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
641  | 
         @{term "Trueprop"} $ t' => select (t', i)
 | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
642  | 
       | @{term "op &"} $ _ $ _ => EVERY' [rtac @{thm conjI}, RANGE [conj_tac tac, conj_tac tac]] i
 | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
643  | 
| _ => tac i  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
644  | 
in  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
645  | 
SUBGOAL select i  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
646  | 
end  | 
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
647  | 
|
| 
 
478c5648e73f
moved generic functions into nominal_library
 
Christian Urban <urbanc@in.tum.de> 
parents: 
2620 
diff
changeset
 | 
648  | 
|
| 
1833
 
2050b5723c04
added a library for basic nominal functions; separated nominal_eqvt file
 
Christian Urban <urbanc@in.tum.de> 
parents:  
diff
changeset
 | 
649  | 
end (* structure *)  | 
| 
 
2050b5723c04
added a library for basic nominal functions; separated nominal_eqvt file
 
Christian Urban <urbanc@in.tum.de> 
parents:  
diff
changeset
 | 
650  | 
|
| 
 
2050b5723c04
added a library for basic nominal functions; separated nominal_eqvt file
 
Christian Urban <urbanc@in.tum.de> 
parents:  
diff
changeset
 | 
651  | 
open Nominal_Library;  |