| author | Cezary Kaliszyk <kaliszyk@in.tum.de> | 
| Fri, 19 Mar 2010 12:22:10 +0100 | |
| changeset 1542 | 63e327e95abd | 
| parent 1534 | 984ea1299cd7 | 
| child 1547 | 57f7af5d7564 | 
| permissions | -rw-r--r-- | 
| 
1168
 
5c1e16806901
Code for generating the fv function, no bindings yet.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
1  | 
theory Fv  | 
| 
1534
 
984ea1299cd7
The nominal infrastructure for fset. 'fs' missing, but not needed so far.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1516 
diff
changeset
 | 
2  | 
imports "Nominal2_Atoms" "Abs" "Perm" "Rsp" "Nominal2_FSet"  | 
| 
1168
 
5c1e16806901
Code for generating the fv function, no bindings yet.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
3  | 
begin  | 
| 
 
5c1e16806901
Code for generating the fv function, no bindings yet.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
4  | 
|
| 
1505
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
5  | 
(* The bindings data structure:  | 
| 
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
6  | 
|
| 
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
7  | 
Bindings are a list of lists of lists of triples.  | 
| 
1172
 
9a609fefcf24
Simplified format of bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1169 
diff
changeset
 | 
8  | 
|
| 1358 | 9  | 
The first list represents the datatypes defined.  | 
10  | 
The second list represents the constructors.  | 
|
11  | 
The internal list is a list of all the bndings that  | 
|
12  | 
concern the constructor.  | 
|
| 
1172
 
9a609fefcf24
Simplified format of bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1169 
diff
changeset
 | 
13  | 
|
| 1358 | 14  | 
Every triple consists of a function, the binding and  | 
15  | 
the body.  | 
|
| 
1169
 
b9d02e0800e9
Description of intended bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1168 
diff
changeset
 | 
16  | 
|
| 
 
b9d02e0800e9
Description of intended bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1168 
diff
changeset
 | 
17  | 
Eg:  | 
| 
 
b9d02e0800e9
Description of intended bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1168 
diff
changeset
 | 
18  | 
nominal_datatype  | 
| 
 
b9d02e0800e9
Description of intended bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1168 
diff
changeset
 | 
19  | 
|
| 
 
b9d02e0800e9
Description of intended bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1168 
diff
changeset
 | 
20  | 
C1  | 
| 
 
b9d02e0800e9
Description of intended bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1168 
diff
changeset
 | 
21  | 
| C2 x y z bind x in z  | 
| 
1172
 
9a609fefcf24
Simplified format of bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1169 
diff
changeset
 | 
22  | 
| C3 x y z bind f x in z bind g y in z  | 
| 
1169
 
b9d02e0800e9
Description of intended bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1168 
diff
changeset
 | 
23  | 
|
| 
 
b9d02e0800e9
Description of intended bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1168 
diff
changeset
 | 
24  | 
yields:  | 
| 
1172
 
9a609fefcf24
Simplified format of bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1169 
diff
changeset
 | 
25  | 
[  | 
| 
 
9a609fefcf24
Simplified format of bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1169 
diff
changeset
 | 
26  | 
[],  | 
| 1358 | 27  | 
[(NONE, 0, 2)],  | 
28  | 
[(SOME (Const f), 0, 2), (Some (Const g), 1, 2)]]  | 
|
| 
1185
 
7566b899ca6a
Code for handling atom sets.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1180 
diff
changeset
 | 
29  | 
|
| 1358 | 30  | 
A SOME binding has to have a function which takes an appropriate  | 
31  | 
argument and returns an atom set. A NONE binding has to be on an  | 
|
32  | 
argument that is an atom or an atom set.  | 
|
| 
1505
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
33  | 
*)  | 
| 
1185
 
7566b899ca6a
Code for handling atom sets.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1180 
diff
changeset
 | 
34  | 
|
| 
1505
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
35  | 
(*  | 
| 
1510
 
be911e869fde
Added fv,bn,distinct,perm to the simplifier.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1508 
diff
changeset
 | 
36  | 
An overview of the generation of free variables:  | 
| 
1505
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
37  | 
|
| 
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
38  | 
1) fv_bn functions are generated only for the non-recursive binds.  | 
| 
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
39  | 
|
| 
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
40  | 
An fv_bn for a constructor is a union of values for the arguments:  | 
| 
1191
 
15362b433d64
Description of the fv procedure.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1185 
diff
changeset
 | 
41  | 
|
| 
1505
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
42  | 
For an argument x that is in the bn function  | 
| 
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
43  | 
- if it is a recursive argument bn' we return: fv_bn' x  | 
| 
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
44  | 
- otherwise empty  | 
| 
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
45  | 
|
| 
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
46  | 
For an argument x that is not in the bn function  | 
| 
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
47  | 
   - for atom we return: {atom x}
 | 
| 
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
48  | 
- for atom set we return: atom ` x  | 
| 
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
49  | 
- for a recursive call to type ty' we return: fv_ty' x  | 
| 
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
50  | 
with fv of the appropriate type  | 
| 
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
51  | 
- otherwise empty  | 
| 
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
52  | 
|
| 
1514
 
b52b72676e20
First part of the description of alpha_ty.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1513 
diff
changeset
 | 
53  | 
2) fv_ty functions generated for all types being defined:  | 
| 
1191
 
15362b433d64
Description of the fv procedure.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1185 
diff
changeset
 | 
54  | 
|
| 
1514
 
b52b72676e20
First part of the description of alpha_ty.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1513 
diff
changeset
 | 
55  | 
fv_ty for a constructor is a union of values for the arguments.  | 
| 
1505
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
56  | 
|
| 
1508
 
883b38196dba
Simplified the description.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1505 
diff
changeset
 | 
57  | 
For an argument that is bound in a shallow binding we return empty.  | 
| 
 
883b38196dba
Simplified the description.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1505 
diff
changeset
 | 
58  | 
|
| 
 
883b38196dba
Simplified the description.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1505 
diff
changeset
 | 
59  | 
For an argument x that bound in a non-recursive deep binding  | 
| 
1505
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
60  | 
we return: fv_bn x.  | 
| 
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
61  | 
|
| 
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
62  | 
Otherwise we return the free variables of the argument minus the  | 
| 
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
63  | 
bound variables of the argument.  | 
| 1358 | 64  | 
|
| 
1505
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
65  | 
The free variables for an argument x are:  | 
| 
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
66  | 
   - for an atom: {atom x}
 | 
| 
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
67  | 
- for atom set: atom ` x  | 
| 
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
68  | 
- for recursive call to type ty' return: fv_ty' x  | 
| 
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
69  | 
- for nominal datatype ty' return: fv_ty' x  | 
| 
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
70  | 
|
| 
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
71  | 
The bound variables are a union of results of all bindings that  | 
| 
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
72  | 
involve the given argument. For a paricular binding:  | 
| 
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
73  | 
|
| 
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
74  | 
- for a binding function bn: bn x  | 
| 
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
75  | 
- for a recursive argument of type ty': fv_fy' x  | 
| 
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
76  | 
- for nominal datatype ty' return: fv_ty' x  | 
| 
1169
 
b9d02e0800e9
Description of intended bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1168 
diff
changeset
 | 
77  | 
*)  | 
| 
 
b9d02e0800e9
Description of intended bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1168 
diff
changeset
 | 
78  | 
|
| 
1510
 
be911e869fde
Added fv,bn,distinct,perm to the simplifier.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1508 
diff
changeset
 | 
79  | 
(*  | 
| 
 
be911e869fde
Added fv,bn,distinct,perm to the simplifier.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1508 
diff
changeset
 | 
80  | 
An overview of the generation of alpha-equivalence:  | 
| 
1513
 
44840614ea0c
Description of generation of alpha_bn.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1510 
diff
changeset
 | 
81  | 
|
| 
 
44840614ea0c
Description of generation of alpha_bn.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1510 
diff
changeset
 | 
82  | 
1) alpha_bn relations are generated for binding functions.  | 
| 
 
44840614ea0c
Description of generation of alpha_bn.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1510 
diff
changeset
 | 
83  | 
|
| 
 
44840614ea0c
Description of generation of alpha_bn.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1510 
diff
changeset
 | 
84  | 
An alpha_bn for a constructor is true if a conjunction of  | 
| 
 
44840614ea0c
Description of generation of alpha_bn.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1510 
diff
changeset
 | 
85  | 
propositions for each argument holds.  | 
| 
 
44840614ea0c
Description of generation of alpha_bn.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1510 
diff
changeset
 | 
86  | 
|
| 
 
44840614ea0c
Description of generation of alpha_bn.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1510 
diff
changeset
 | 
87  | 
For an argument a proposition is build as follows from  | 
| 
 
44840614ea0c
Description of generation of alpha_bn.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1510 
diff
changeset
 | 
88  | 
th:  | 
| 
 
44840614ea0c
Description of generation of alpha_bn.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1510 
diff
changeset
 | 
89  | 
|
| 
 
44840614ea0c
Description of generation of alpha_bn.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1510 
diff
changeset
 | 
90  | 
- for a recursive argument in the bn function, we return: alpha_bn argl argr  | 
| 
 
44840614ea0c
Description of generation of alpha_bn.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1510 
diff
changeset
 | 
91  | 
- for a recursive argument for type ty not in bn, we return: alpha_ty argl argr  | 
| 
 
44840614ea0c
Description of generation of alpha_bn.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1510 
diff
changeset
 | 
92  | 
- for other arguments in the bn function we return: True  | 
| 
 
44840614ea0c
Description of generation of alpha_bn.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1510 
diff
changeset
 | 
93  | 
- for other arguments not in the bn function we return: argl = argr  | 
| 
 
44840614ea0c
Description of generation of alpha_bn.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1510 
diff
changeset
 | 
94  | 
|
| 
1514
 
b52b72676e20
First part of the description of alpha_ty.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1513 
diff
changeset
 | 
95  | 
2) alpha_ty relations are generated for all the types being defined:  | 
| 
 
b52b72676e20
First part of the description of alpha_ty.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1513 
diff
changeset
 | 
96  | 
|
| 
1516
 
e3a82a3529ce
Continued description of alpha.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1514 
diff
changeset
 | 
97  | 
For each constructor we gather all the arguments that are bound,  | 
| 
 
e3a82a3529ce
Continued description of alpha.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1514 
diff
changeset
 | 
98  | 
and for each of those we add a permutation. We associate those  | 
| 
 
e3a82a3529ce
Continued description of alpha.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1514 
diff
changeset
 | 
99  | 
permutations with the bindings. Note that two bindings can have  | 
| 
 
e3a82a3529ce
Continued description of alpha.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1514 
diff
changeset
 | 
100  | 
the same permutation if the arguments being bound are the same.  | 
| 
1514
 
b52b72676e20
First part of the description of alpha_ty.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1513 
diff
changeset
 | 
101  | 
|
| 
1516
 
e3a82a3529ce
Continued description of alpha.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1514 
diff
changeset
 | 
102  | 
An alpha_ty for a constructor is true if there exist permutations  | 
| 
 
e3a82a3529ce
Continued description of alpha.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1514 
diff
changeset
 | 
103  | 
as above such that a conjunction of propositions for all arguments holds.  | 
| 
1514
 
b52b72676e20
First part of the description of alpha_ty.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1513 
diff
changeset
 | 
104  | 
|
| 
 
b52b72676e20
First part of the description of alpha_ty.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1513 
diff
changeset
 | 
105  | 
For an argument we allow bindings where only one of the following  | 
| 
 
b52b72676e20
First part of the description of alpha_ty.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1513 
diff
changeset
 | 
106  | 
holds:  | 
| 
 
b52b72676e20
First part of the description of alpha_ty.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1513 
diff
changeset
 | 
107  | 
|
| 
 
b52b72676e20
First part of the description of alpha_ty.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1513 
diff
changeset
 | 
108  | 
- Argument is bound in some shallow bindings: We return true  | 
| 
1516
 
e3a82a3529ce
Continued description of alpha.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1514 
diff
changeset
 | 
109  | 
- Argument of type ty is bound recursively in some other  | 
| 
 
e3a82a3529ce
Continued description of alpha.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1514 
diff
changeset
 | 
110  | 
arguments [i1, .. in] with one binding function bn.  | 
| 
 
e3a82a3529ce
Continued description of alpha.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1514 
diff
changeset
 | 
111  | 
We return:  | 
| 
 
e3a82a3529ce
Continued description of alpha.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1514 
diff
changeset
 | 
112  | 
|
| 
 
e3a82a3529ce
Continued description of alpha.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1514 
diff
changeset
 | 
113  | 
(bn argl, (argl, argl_i1, ..., argl_in)) \<approx>gen  | 
| 
 
e3a82a3529ce
Continued description of alpha.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1514 
diff
changeset
 | 
114  | 
\<lambda>(argl,argl1,..,argln) (argr,argr1,..,argrn).  | 
| 
 
e3a82a3529ce
Continued description of alpha.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1514 
diff
changeset
 | 
115  | 
(alpha_ty argl argr) \<and> (alpha_i1 argl1 argr1) \<and> .. \<and> (alpha_in argln argrn)  | 
| 
 
e3a82a3529ce
Continued description of alpha.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1514 
diff
changeset
 | 
116  | 
\<lambda>(arg,arg1,..,argn). (fv_ty arg) \<union> (fv_i1 arg1) \<union> .. \<union> (fv_in argn)  | 
| 
 
e3a82a3529ce
Continued description of alpha.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1514 
diff
changeset
 | 
117  | 
pi  | 
| 
 
e3a82a3529ce
Continued description of alpha.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1514 
diff
changeset
 | 
118  | 
(bn argr, (argr, argr_i1, ..., argr_in))  | 
| 
 
e3a82a3529ce
Continued description of alpha.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1514 
diff
changeset
 | 
119  | 
|
| 
1514
 
b52b72676e20
First part of the description of alpha_ty.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1513 
diff
changeset
 | 
120  | 
- Argument is bound in some deep non-recursive bindings.  | 
| 
 
b52b72676e20
First part of the description of alpha_ty.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1513 
diff
changeset
 | 
121  | 
We return: alpha_bn argl argr  | 
| 
1516
 
e3a82a3529ce
Continued description of alpha.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1514 
diff
changeset
 | 
122  | 
- Argument of type ty has some shallow bindings [b1..bn] and/or  | 
| 
 
e3a82a3529ce
Continued description of alpha.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1514 
diff
changeset
 | 
123  | 
non-recursive bindings [f1 a1, .., fm am], where the bindings  | 
| 
 
e3a82a3529ce
Continued description of alpha.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1514 
diff
changeset
 | 
124  | 
have the permutations p1..pl. We return:  | 
| 
 
e3a82a3529ce
Continued description of alpha.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1514 
diff
changeset
 | 
125  | 
|
| 
 
e3a82a3529ce
Continued description of alpha.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1514 
diff
changeset
 | 
126  | 
(b1l \<union>..\<union> bnl \<union> f1 a1l \<union>..\<union> fn anl, argl) \<approx>gen  | 
| 
 
e3a82a3529ce
Continued description of alpha.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1514 
diff
changeset
 | 
127  | 
alpha_ty fv_ty (p1 +..+ pl)  | 
| 
 
e3a82a3529ce
Continued description of alpha.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1514 
diff
changeset
 | 
128  | 
(b1r \<union>..\<union> bnr \<union> f1 a1r \<union>..\<union> fn anr, argr)  | 
| 
 
e3a82a3529ce
Continued description of alpha.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1514 
diff
changeset
 | 
129  | 
|
| 
1514
 
b52b72676e20
First part of the description of alpha_ty.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1513 
diff
changeset
 | 
130  | 
- Argument has some recursive bindings. The bindings were  | 
| 
 
b52b72676e20
First part of the description of alpha_ty.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1513 
diff
changeset
 | 
131  | 
already treated in 2nd case so we return: True  | 
| 
 
b52b72676e20
First part of the description of alpha_ty.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1513 
diff
changeset
 | 
132  | 
- Argument has no bindings and is not bound.  | 
| 
 
b52b72676e20
First part of the description of alpha_ty.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1513 
diff
changeset
 | 
133  | 
If it is recursive for type ty, we return: alpha_ty argl argr  | 
| 
 
b52b72676e20
First part of the description of alpha_ty.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1513 
diff
changeset
 | 
134  | 
Otherwise we return: argl = argr  | 
| 
 
b52b72676e20
First part of the description of alpha_ty.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1513 
diff
changeset
 | 
135  | 
|
| 
1510
 
be911e869fde
Added fv,bn,distinct,perm to the simplifier.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1508 
diff
changeset
 | 
136  | 
*)  | 
| 
 
be911e869fde
Added fv,bn,distinct,perm to the simplifier.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1508 
diff
changeset
 | 
137  | 
|
| 
1362
 
e72d9d9eada3
Term5 written as nominal_datatype is the recursive let.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1359 
diff
changeset
 | 
138  | 
ML {*
 | 
| 
 
e72d9d9eada3
Term5 written as nominal_datatype is the recursive let.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1359 
diff
changeset
 | 
139  | 
fun is_atom thy typ =  | 
| 
 
e72d9d9eada3
Term5 written as nominal_datatype is the recursive let.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1359 
diff
changeset
 | 
140  | 
  Sign.of_sort thy (typ, @{sort at})
 | 
| 
1366
 
2bf82fa871e7
Proper recognition of atoms and atom sets.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1362 
diff
changeset
 | 
141  | 
|
| 
 
2bf82fa871e7
Proper recognition of atoms and atom sets.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1362 
diff
changeset
 | 
142  | 
fun is_atom_set thy (Type ("fun", [t, @{typ bool}])) = is_atom thy t
 | 
| 
 
2bf82fa871e7
Proper recognition of atoms and atom sets.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1362 
diff
changeset
 | 
143  | 
| is_atom_set thy _ = false;  | 
| 
1534
 
984ea1299cd7
The nominal infrastructure for fset. 'fs' missing, but not needed so far.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1516 
diff
changeset
 | 
144  | 
|
| 
 
984ea1299cd7
The nominal infrastructure for fset. 'fs' missing, but not needed so far.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1516 
diff
changeset
 | 
145  | 
fun is_atom_fset thy (Type ("FSet.fset", [t])) = is_atom thy t
 | 
| 
 
984ea1299cd7
The nominal infrastructure for fset. 'fs' missing, but not needed so far.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1516 
diff
changeset
 | 
146  | 
| is_atom_fset thy _ = false;  | 
| 
 
984ea1299cd7
The nominal infrastructure for fset. 'fs' missing, but not needed so far.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1516 
diff
changeset
 | 
147  | 
|
| 
 
984ea1299cd7
The nominal infrastructure for fset. 'fs' missing, but not needed so far.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1516 
diff
changeset
 | 
148  | 
val fset_to_set = @{term "fset_to_set :: atom fset \<Rightarrow> atom set"}
 | 
| 
1362
 
e72d9d9eada3
Term5 written as nominal_datatype is the recursive let.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1359 
diff
changeset
 | 
149  | 
*}  | 
| 
 
e72d9d9eada3
Term5 written as nominal_datatype is the recursive let.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1359 
diff
changeset
 | 
150  | 
|
| 
 
e72d9d9eada3
Term5 written as nominal_datatype is the recursive let.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1359 
diff
changeset
 | 
151  | 
|
| 
1366
 
2bf82fa871e7
Proper recognition of atoms and atom sets.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1362 
diff
changeset
 | 
152  | 
|
| 
1534
 
984ea1299cd7
The nominal infrastructure for fset. 'fs' missing, but not needed so far.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1516 
diff
changeset
 | 
153  | 
|
| 1358 | 154  | 
(* Like map2, only if the second list is empty passes empty lists insted of error *)  | 
| 
1302
 
d3101a5b9c4d
Length fix for nested recursions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1301 
diff
changeset
 | 
155  | 
ML {*
 | 
| 
 
d3101a5b9c4d
Length fix for nested recursions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1301 
diff
changeset
 | 
156  | 
fun map2i _ [] [] = []  | 
| 
 
d3101a5b9c4d
Length fix for nested recursions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1301 
diff
changeset
 | 
157  | 
| map2i f (x :: xs) (y :: ys) = f x y :: map2i f xs ys  | 
| 
 
d3101a5b9c4d
Length fix for nested recursions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1301 
diff
changeset
 | 
158  | 
| map2i f (x :: xs) [] = f x [] :: map2i f xs []  | 
| 
 
d3101a5b9c4d
Length fix for nested recursions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1301 
diff
changeset
 | 
159  | 
| map2i _ _ _ = raise UnequalLengths;  | 
| 
 
d3101a5b9c4d
Length fix for nested recursions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1301 
diff
changeset
 | 
160  | 
*}  | 
| 
 
d3101a5b9c4d
Length fix for nested recursions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1301 
diff
changeset
 | 
161  | 
|
| 1358 | 162  | 
(* Finds bindings with the same function and binding, and gathers all  | 
| 
1375
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
163  | 
bodys for such pairs  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
164  | 
*)  | 
| 
1168
 
5c1e16806901
Code for generating the fv function, no bindings yet.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
165  | 
ML {*
 | 
| 
1357
 
42b7abf779ec
Gather bindings with same binder, and generate only one permutation for them.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1339 
diff
changeset
 | 
166  | 
fun gather_binds binds =  | 
| 
 
42b7abf779ec
Gather bindings with same binder, and generate only one permutation for them.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1339 
diff
changeset
 | 
167  | 
let  | 
| 
 
42b7abf779ec
Gather bindings with same binder, and generate only one permutation for them.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1339 
diff
changeset
 | 
168  | 
fun gather_binds_cons binds =  | 
| 
 
42b7abf779ec
Gather bindings with same binder, and generate only one permutation for them.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1339 
diff
changeset
 | 
169  | 
let  | 
| 
 
42b7abf779ec
Gather bindings with same binder, and generate only one permutation for them.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1339 
diff
changeset
 | 
170  | 
val common = map (fn (f, bi, _) => (f, bi)) binds  | 
| 
 
42b7abf779ec
Gather bindings with same binder, and generate only one permutation for them.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1339 
diff
changeset
 | 
171  | 
val nodups = distinct (op =) common  | 
| 
 
42b7abf779ec
Gather bindings with same binder, and generate only one permutation for them.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1339 
diff
changeset
 | 
172  | 
fun find_bodys (sf, sbi) =  | 
| 
 
42b7abf779ec
Gather bindings with same binder, and generate only one permutation for them.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1339 
diff
changeset
 | 
173  | 
filter (fn (f, bi, _) => f = sf andalso bi = sbi) binds  | 
| 
 
42b7abf779ec
Gather bindings with same binder, and generate only one permutation for them.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1339 
diff
changeset
 | 
174  | 
val bodys = map ((map (fn (_, _, bo) => bo)) o find_bodys) nodups  | 
| 
 
42b7abf779ec
Gather bindings with same binder, and generate only one permutation for them.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1339 
diff
changeset
 | 
175  | 
in  | 
| 
 
42b7abf779ec
Gather bindings with same binder, and generate only one permutation for them.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1339 
diff
changeset
 | 
176  | 
nodups ~~ bodys  | 
| 
 
42b7abf779ec
Gather bindings with same binder, and generate only one permutation for them.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1339 
diff
changeset
 | 
177  | 
end  | 
| 
 
42b7abf779ec
Gather bindings with same binder, and generate only one permutation for them.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1339 
diff
changeset
 | 
178  | 
in  | 
| 
 
42b7abf779ec
Gather bindings with same binder, and generate only one permutation for them.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1339 
diff
changeset
 | 
179  | 
map (map gather_binds_cons) binds  | 
| 
 
42b7abf779ec
Gather bindings with same binder, and generate only one permutation for them.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1339 
diff
changeset
 | 
180  | 
end  | 
| 
 
42b7abf779ec
Gather bindings with same binder, and generate only one permutation for them.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1339 
diff
changeset
 | 
181  | 
*}  | 
| 
 
42b7abf779ec
Gather bindings with same binder, and generate only one permutation for them.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1339 
diff
changeset
 | 
182  | 
|
| 
 
42b7abf779ec
Gather bindings with same binder, and generate only one permutation for them.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1339 
diff
changeset
 | 
183  | 
ML {*
 | 
| 
 
42b7abf779ec
Gather bindings with same binder, and generate only one permutation for them.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1339 
diff
changeset
 | 
184  | 
fun un_gather_binds_cons binds =  | 
| 
 
42b7abf779ec
Gather bindings with same binder, and generate only one permutation for them.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1339 
diff
changeset
 | 
185  | 
flat (map (fn (((f, bi), bos), pi) => map (fn bo => ((f, bi, bo), pi)) bos) binds)  | 
| 
 
42b7abf779ec
Gather bindings with same binder, and generate only one permutation for them.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1339 
diff
changeset
 | 
186  | 
*}  | 
| 
 
42b7abf779ec
Gather bindings with same binder, and generate only one permutation for them.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1339 
diff
changeset
 | 
187  | 
|
| 
 
42b7abf779ec
Gather bindings with same binder, and generate only one permutation for them.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1339 
diff
changeset
 | 
188  | 
ML {*
 | 
| 1175 | 189  | 
open Datatype_Aux; (* typ_of_dtyp, DtRec, ... *);  | 
| 1178 | 190  | 
(* TODO: It is the same as one in 'nominal_atoms' *)  | 
| 1175 | 191  | 
  fun mk_atom ty = Const (@{const_name atom}, ty --> @{typ atom});
 | 
192  | 
  val noatoms = @{term "{} :: atom set"};
 | 
|
193  | 
  fun mk_single_atom x = HOLogic.mk_set @{typ atom} [mk_atom (type_of x) $ x];
 | 
|
194  | 
fun mk_union sets =  | 
|
195  | 
fold (fn a => fn b =>  | 
|
196  | 
if a = noatoms then b else  | 
|
197  | 
if b = noatoms then a else  | 
|
| 
1323
 
acf262971303
Fixes for the fv problem and alpha problem.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1308 
diff
changeset
 | 
198  | 
if a = b then a else  | 
| 
1325
 
0be098c61d00
Add the supp intersection conditions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1323 
diff
changeset
 | 
199  | 
      HOLogic.mk_binop @{const_name sup} (a, b)) (rev sets) noatoms;
 | 
| 
 
0be098c61d00
Add the supp intersection conditions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1323 
diff
changeset
 | 
200  | 
  val mk_inter = foldr1 (HOLogic.mk_binop @{const_name inf})
 | 
| 
1288
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
201  | 
fun mk_conjl props =  | 
| 
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
202  | 
fold (fn a => fn b =>  | 
| 
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
203  | 
      if a = @{term True} then b else
 | 
| 
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
204  | 
      if b = @{term True} then a else
 | 
| 
1428
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
205  | 
      HOLogic.mk_conj (a, b)) (rev props) @{term True};
 | 
| 1175 | 206  | 
fun mk_diff a b =  | 
207  | 
if b = noatoms then a else  | 
|
208  | 
if b = a then noatoms else  | 
|
209  | 
    HOLogic.mk_binop @{const_name minus} (a, b);
 | 
|
| 
1534
 
984ea1299cd7
The nominal infrastructure for fset. 'fs' missing, but not needed so far.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1516 
diff
changeset
 | 
210  | 
fun mk_atom_set t =  | 
| 
1185
 
7566b899ca6a
Code for handling atom sets.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1180 
diff
changeset
 | 
211  | 
let  | 
| 
 
7566b899ca6a
Code for handling atom sets.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1180 
diff
changeset
 | 
212  | 
val ty = fastype_of t;  | 
| 
 
7566b899ca6a
Code for handling atom sets.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1180 
diff
changeset
 | 
213  | 
      val atom_ty = HOLogic.dest_setT ty --> @{typ atom};
 | 
| 
 
7566b899ca6a
Code for handling atom sets.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1180 
diff
changeset
 | 
214  | 
      val img_ty = atom_ty --> ty --> @{typ "atom set"};
 | 
| 
 
7566b899ca6a
Code for handling atom sets.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1180 
diff
changeset
 | 
215  | 
in  | 
| 
 
7566b899ca6a
Code for handling atom sets.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1180 
diff
changeset
 | 
216  | 
      (Const (@{const_name image}, img_ty) $ Const (@{const_name atom}, atom_ty) $ t)
 | 
| 
 
7566b899ca6a
Code for handling atom sets.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1180 
diff
changeset
 | 
217  | 
end;  | 
| 
1534
 
984ea1299cd7
The nominal infrastructure for fset. 'fs' missing, but not needed so far.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1516 
diff
changeset
 | 
218  | 
fun mk_atom_fset t =  | 
| 
 
984ea1299cd7
The nominal infrastructure for fset. 'fs' missing, but not needed so far.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1516 
diff
changeset
 | 
219  | 
let  | 
| 
 
984ea1299cd7
The nominal infrastructure for fset. 'fs' missing, but not needed so far.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1516 
diff
changeset
 | 
220  | 
val ty = fastype_of t;  | 
| 
 
984ea1299cd7
The nominal infrastructure for fset. 'fs' missing, but not needed so far.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1516 
diff
changeset
 | 
221  | 
      val atom_ty = dest_fsetT ty --> @{typ atom};
 | 
| 
 
984ea1299cd7
The nominal infrastructure for fset. 'fs' missing, but not needed so far.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1516 
diff
changeset
 | 
222  | 
      val fmap_ty = atom_ty --> ty --> @{typ "atom fset"};
 | 
| 
 
984ea1299cd7
The nominal infrastructure for fset. 'fs' missing, but not needed so far.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1516 
diff
changeset
 | 
223  | 
in  | 
| 
 
984ea1299cd7
The nominal infrastructure for fset. 'fs' missing, but not needed so far.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1516 
diff
changeset
 | 
224  | 
      fset_to_set $ ((Const (@{const_name fmap}, fmap_ty) $ Const (@{const_name atom}, atom_ty) $ t))
 | 
| 
 
984ea1299cd7
The nominal infrastructure for fset. 'fs' missing, but not needed so far.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1516 
diff
changeset
 | 
225  | 
end;  | 
| 
1193
 
a228acf2907e
Full alpha equivalence + testing in terms. Some differ but it seems the generated version is more correct.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1192 
diff
changeset
 | 
226  | 
(* Similar to one in USyntax *)  | 
| 
 
a228acf2907e
Full alpha equivalence + testing in terms. Some differ but it seems the generated version is more correct.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1192 
diff
changeset
 | 
227  | 
fun mk_pair (fst, snd) =  | 
| 
 
a228acf2907e
Full alpha equivalence + testing in terms. Some differ but it seems the generated version is more correct.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1192 
diff
changeset
 | 
228  | 
let val ty1 = fastype_of fst  | 
| 
 
a228acf2907e
Full alpha equivalence + testing in terms. Some differ but it seems the generated version is more correct.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1192 
diff
changeset
 | 
229  | 
val ty2 = fastype_of snd  | 
| 
 
a228acf2907e
Full alpha equivalence + testing in terms. Some differ but it seems the generated version is more correct.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1192 
diff
changeset
 | 
230  | 
val c = HOLogic.pair_const ty1 ty2  | 
| 
 
a228acf2907e
Full alpha equivalence + testing in terms. Some differ but it seems the generated version is more correct.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1192 
diff
changeset
 | 
231  | 
in c $ fst $ snd  | 
| 
 
a228acf2907e
Full alpha equivalence + testing in terms. Some differ but it seems the generated version is more correct.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1192 
diff
changeset
 | 
232  | 
end;  | 
| 
1468
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
233  | 
*}  | 
| 
1193
 
a228acf2907e
Full alpha equivalence + testing in terms. Some differ but it seems the generated version is more correct.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1192 
diff
changeset
 | 
234  | 
|
| 
1468
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
235  | 
(* Given [fv1, fv2, fv3] creates %(x, y, z). fv1 x u fv2 y u fv3 z *)  | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
236  | 
ML {*
 | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
237  | 
fun mk_compound_fv fvs =  | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
238  | 
let  | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
239  | 
val nos = (length fvs - 1) downto 0;  | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
240  | 
val fvs_applied = map (fn (fv, no) => fv $ Bound no) (fvs ~~ nos);  | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
241  | 
val fvs_union = mk_union fvs_applied;  | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
242  | 
val (tyh :: tys) = rev (map (domain_type o fastype_of) fvs);  | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
243  | 
  fun fold_fun ty t = HOLogic.mk_split (Abs ("", ty, t))
 | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
244  | 
in  | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
245  | 
  fold fold_fun tys (Abs ("", tyh, fvs_union))
 | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
246  | 
end;  | 
| 1175 | 247  | 
*}  | 
248  | 
||
| 
1468
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
249  | 
ML {* @{term "\<lambda>(x, y, z). \<lambda>(x', y', z'). R x x' \<and> R2 y y' \<and> R3 z z'"} *}
 | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
250  | 
|
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
251  | 
(* Given [R1, R2, R3] creates %(x,x'). %(y,y'). %(z,z'). R x x' \<and> R y y' \<and> R z z' *)  | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
252  | 
ML {*
 | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
253  | 
fun mk_compound_alpha Rs =  | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
254  | 
let  | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
255  | 
val nos = (length Rs - 1) downto 0;  | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
256  | 
val nos2 = (2 * length Rs - 1) downto length Rs;  | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
257  | 
val Rs_applied = map (fn (R, (no2, no)) => R $ Bound no2 $ Bound no) (Rs ~~ (nos2 ~~ nos));  | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
258  | 
val Rs_conj = mk_conjl Rs_applied;  | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
259  | 
val (tyh :: tys) = rev (map (domain_type o fastype_of) Rs);  | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
260  | 
  fun fold_fun ty t = HOLogic.mk_split (Abs ("", ty, t))
 | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
261  | 
  val abs_rhs = fold fold_fun tys (Abs ("", tyh, Rs_conj))
 | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
262  | 
in  | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
263  | 
  fold fold_fun tys (Abs ("", tyh, abs_rhs))
 | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
264  | 
end;  | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
265  | 
*}  | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
266  | 
|
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
267  | 
ML {* cterm_of @{theory} (mk_compound_alpha [@{term "R :: 'a \<Rightarrow> 'a \<Rightarrow> bool"}, @{term "R2 :: 'b \<Rightarrow> 'b \<Rightarrow> bool"}, @{term "R3 :: 'b \<Rightarrow> 'b \<Rightarrow> bool"}]) *}
 | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
268  | 
|
| 
1288
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
269  | 
ML {* fun add_perm (p1, p2) = Const(@{const_name plus}, @{typ "perm \<Rightarrow> perm \<Rightarrow> perm"}) $ p1 $ p2 *}
 | 
| 
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
270  | 
|
| 
1375
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
271  | 
ML {*
 | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
272  | 
fun non_rec_binds l =  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
273  | 
let  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
274  | 
fun is_non_rec (SOME (f, false), _, _) = SOME f  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
275  | 
| is_non_rec _ = NONE  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
276  | 
in  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
277  | 
distinct (op =) (map_filter is_non_rec (flat (flat l)))  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
278  | 
end  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
279  | 
*}  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
280  | 
|
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
281  | 
(* We assume no bindings in the type on which bn is defined *)  | 
| 
1505
 
e12ebfa745f6
Update the description of the generation of fv function.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1498 
diff
changeset
 | 
282  | 
(* TODO: currently works only with current fv_bn function *)  | 
| 
1375
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
283  | 
ML {*
 | 
| 
1379
 
5bb0149329ee
Separate lists for separate constructors, to match bn_eqs.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1377 
diff
changeset
 | 
284  | 
fun fv_bn thy (dt_info : Datatype_Aux.info) fv_frees (bn, ith_dtyp, args_in_bns) =  | 
| 
1375
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
285  | 
let  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
286  | 
  val {descr, sorts, ...} = dt_info;
 | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
287  | 
fun nth_dtyp i = typ_of_dtyp descr sorts (DtRec i);  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
288  | 
val fvbn_name = "fv_" ^ (Long_Name.base_name (fst (dest_Const bn)));  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
289  | 
val fvbn = Free (fvbn_name, fastype_of (nth fv_frees ith_dtyp));  | 
| 
1379
 
5bb0149329ee
Separate lists for separate constructors, to match bn_eqs.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1377 
diff
changeset
 | 
290  | 
fun fv_bn_constr (cname, dts) args_in_bn =  | 
| 
1375
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
291  | 
let  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
292  | 
val Ts = map (typ_of_dtyp descr sorts) dts;  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
293  | 
val names = Datatype_Prop.make_tnames Ts;  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
294  | 
val args = map Free (names ~~ Ts);  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
295  | 
val c = Const (cname, Ts ---> (nth_dtyp ith_dtyp));  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
296  | 
fun fv_arg ((dt, x), arg_no) =  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
297  | 
let  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
298  | 
val ty = fastype_of x  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
299  | 
in  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
300  | 
if arg_no mem args_in_bn then  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
301  | 
(if is_rec_type dt then  | 
| 
1415
 
6e856be26ac7
Proper error message.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1413 
diff
changeset
 | 
302  | 
(if body_index dt = ith_dtyp then fvbn $ x else error "fv_bn: recursive argument, but wrong datatype.")  | 
| 
1375
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
303  | 
          else @{term "{} :: atom set"}) else
 | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
304  | 
if is_atom thy ty then mk_single_atom x else  | 
| 
1534
 
984ea1299cd7
The nominal infrastructure for fset. 'fs' missing, but not needed so far.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1516 
diff
changeset
 | 
305  | 
if is_atom_set thy ty then mk_atom_set x else  | 
| 
 
984ea1299cd7
The nominal infrastructure for fset. 'fs' missing, but not needed so far.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1516 
diff
changeset
 | 
306  | 
if is_atom_fset thy ty then mk_atom_fset x else  | 
| 
1375
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
307  | 
if is_rec_type dt then nth fv_frees (body_index dt) $ x else  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
308  | 
        @{term "{} :: atom set"}
 | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
309  | 
end;  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
310  | 
val arg_nos = 0 upto (length dts - 1)  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
311  | 
in  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
312  | 
HOLogic.mk_Trueprop (HOLogic.mk_eq  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
313  | 
(fvbn $ list_comb (c, args), mk_union (map fv_arg (dts ~~ args ~~ arg_nos))))  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
314  | 
end;  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
315  | 
val (_, (_, _, constrs)) = nth descr ith_dtyp;  | 
| 
1379
 
5bb0149329ee
Separate lists for separate constructors, to match bn_eqs.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1377 
diff
changeset
 | 
316  | 
val eqs = map2i fv_bn_constr constrs args_in_bns  | 
| 
1375
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
317  | 
in  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
318  | 
((bn, fvbn), (fvbn_name, eqs))  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
319  | 
end  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
320  | 
*}  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
321  | 
|
| 
1385
 
51b8e6dd72d5
exported template for alpha_bn
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1383 
diff
changeset
 | 
322  | 
ML {*
 | 
| 
 
51b8e6dd72d5
exported template for alpha_bn
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1383 
diff
changeset
 | 
323  | 
fun alpha_bn thy (dt_info : Datatype_Aux.info) alpha_frees ((bn, ith_dtyp, args_in_bns), is_rec) =  | 
| 
 
51b8e6dd72d5
exported template for alpha_bn
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1383 
diff
changeset
 | 
324  | 
let  | 
| 
 
51b8e6dd72d5
exported template for alpha_bn
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1383 
diff
changeset
 | 
325  | 
  val {descr, sorts, ...} = dt_info;
 | 
| 
 
51b8e6dd72d5
exported template for alpha_bn
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1383 
diff
changeset
 | 
326  | 
fun nth_dtyp i = typ_of_dtyp descr sorts (DtRec i);  | 
| 
 
51b8e6dd72d5
exported template for alpha_bn
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1383 
diff
changeset
 | 
327  | 
val alpha_bn_name = "alpha_" ^ (Long_Name.base_name (fst (dest_Const bn)));  | 
| 
1457
 
91fe914e1bef
alpha_bn doesn't need the permutation in non-recursive case.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1454 
diff
changeset
 | 
328  | 
val alpha_bn_type =  | 
| 
1462
 
7c59dd8e5435
The old recursive alpha works fine.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1457 
diff
changeset
 | 
329  | 
    (*if is_rec then @{typ perm} --> nth_dtyp ith_dtyp --> nth_dtyp ith_dtyp --> @{typ bool} else*)
 | 
| 
 
7c59dd8e5435
The old recursive alpha works fine.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1457 
diff
changeset
 | 
330  | 
    nth_dtyp ith_dtyp --> nth_dtyp ith_dtyp --> @{typ bool};
 | 
| 
1385
 
51b8e6dd72d5
exported template for alpha_bn
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1383 
diff
changeset
 | 
331  | 
val alpha_bn_free = Free(alpha_bn_name, alpha_bn_type);  | 
| 
1457
 
91fe914e1bef
alpha_bn doesn't need the permutation in non-recursive case.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1454 
diff
changeset
 | 
332  | 
  val pi = Free("pi", @{typ perm})
 | 
| 
1386
 
0511e879a687
alpha_bn_constr template
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1385 
diff
changeset
 | 
333  | 
fun alpha_bn_constr (cname, dts) args_in_bn =  | 
| 
 
0511e879a687
alpha_bn_constr template
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1385 
diff
changeset
 | 
334  | 
let  | 
| 
 
0511e879a687
alpha_bn_constr template
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1385 
diff
changeset
 | 
335  | 
val Ts = map (typ_of_dtyp descr sorts) dts;  | 
| 
 
0511e879a687
alpha_bn_constr template
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1385 
diff
changeset
 | 
336  | 
val names = Name.variant_list ["pi"] (Datatype_Prop.make_tnames Ts);  | 
| 
 
0511e879a687
alpha_bn_constr template
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1385 
diff
changeset
 | 
337  | 
    val names2 = Name.variant_list ("pi" :: names) (Datatype_Prop.make_tnames Ts);
 | 
| 
 
0511e879a687
alpha_bn_constr template
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1385 
diff
changeset
 | 
338  | 
val args = map Free (names ~~ Ts);  | 
| 
 
0511e879a687
alpha_bn_constr template
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1385 
diff
changeset
 | 
339  | 
val args2 = map Free (names2 ~~ Ts);  | 
| 
 
0511e879a687
alpha_bn_constr template
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1385 
diff
changeset
 | 
340  | 
val c = Const (cname, Ts ---> (nth_dtyp ith_dtyp));  | 
| 
1387
 
9d70a0733786
rhs of alpha_bn, and template for the arguments.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1386 
diff
changeset
 | 
341  | 
val rhs = HOLogic.mk_Trueprop  | 
| 
1462
 
7c59dd8e5435
The old recursive alpha works fine.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1457 
diff
changeset
 | 
342  | 
(alpha_bn_free $ (list_comb (c, args)) $ (list_comb (c, args2)));  | 
| 
1387
 
9d70a0733786
rhs of alpha_bn, and template for the arguments.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1386 
diff
changeset
 | 
343  | 
fun lhs_arg ((dt, arg_no), (arg, arg2)) =  | 
| 
1388
 
ad38ca4213f4
Filled the algorithm for alpha_bn_arg
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1387 
diff
changeset
 | 
344  | 
let  | 
| 
 
ad38ca4213f4
Filled the algorithm for alpha_bn_arg
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1387 
diff
changeset
 | 
345  | 
val argty = fastype_of arg;  | 
| 
 
ad38ca4213f4
Filled the algorithm for alpha_bn_arg
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1387 
diff
changeset
 | 
346  | 
        val permute = Const (@{const_name permute}, @{typ perm} --> argty --> argty);
 | 
| 
 
ad38ca4213f4
Filled the algorithm for alpha_bn_arg
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1387 
diff
changeset
 | 
347  | 
in  | 
| 
 
ad38ca4213f4
Filled the algorithm for alpha_bn_arg
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1387 
diff
changeset
 | 
348  | 
if is_rec_type dt then  | 
| 
1462
 
7c59dd8e5435
The old recursive alpha works fine.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1457 
diff
changeset
 | 
349  | 
if arg_no mem args_in_bn then alpha_bn_free $ arg $ arg2  | 
| 
 
7c59dd8e5435
The old recursive alpha works fine.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1457 
diff
changeset
 | 
350  | 
else (nth alpha_frees (body_index dt)) $ arg $ arg2  | 
| 
1388
 
ad38ca4213f4
Filled the algorithm for alpha_bn_arg
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1387 
diff
changeset
 | 
351  | 
else  | 
| 
 
ad38ca4213f4
Filled the algorithm for alpha_bn_arg
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1387 
diff
changeset
 | 
352  | 
        if arg_no mem args_in_bn then @{term True}
 | 
| 
1462
 
7c59dd8e5435
The old recursive alpha works fine.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1457 
diff
changeset
 | 
353  | 
else HOLogic.mk_eq (arg, arg2)  | 
| 
1388
 
ad38ca4213f4
Filled the algorithm for alpha_bn_arg
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1387 
diff
changeset
 | 
354  | 
end  | 
| 
1387
 
9d70a0733786
rhs of alpha_bn, and template for the arguments.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1386 
diff
changeset
 | 
355  | 
val arg_nos = 0 upto (length dts - 1)  | 
| 
 
9d70a0733786
rhs of alpha_bn, and template for the arguments.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1386 
diff
changeset
 | 
356  | 
val lhss = mk_conjl (map lhs_arg (dts ~~ arg_nos ~~ (args ~~ args2)))  | 
| 
 
9d70a0733786
rhs of alpha_bn, and template for the arguments.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1386 
diff
changeset
 | 
357  | 
val eq = Logic.mk_implies (HOLogic.mk_Trueprop lhss, rhs)  | 
| 
1386
 
0511e879a687
alpha_bn_constr template
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1385 
diff
changeset
 | 
358  | 
in  | 
| 
1387
 
9d70a0733786
rhs of alpha_bn, and template for the arguments.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1386 
diff
changeset
 | 
359  | 
eq  | 
| 
1386
 
0511e879a687
alpha_bn_constr template
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1385 
diff
changeset
 | 
360  | 
end  | 
| 
1385
 
51b8e6dd72d5
exported template for alpha_bn
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1383 
diff
changeset
 | 
361  | 
val (_, (_, _, constrs)) = nth descr ith_dtyp;  | 
| 
1386
 
0511e879a687
alpha_bn_constr template
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1385 
diff
changeset
 | 
362  | 
val eqs = map2i alpha_bn_constr constrs args_in_bns  | 
| 
1385
 
51b8e6dd72d5
exported template for alpha_bn
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1383 
diff
changeset
 | 
363  | 
in  | 
| 
1389
 
d0ba4829a76c
include alpha in the definitions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1388 
diff
changeset
 | 
364  | 
((bn, alpha_bn_free), (alpha_bn_name, eqs))  | 
| 
1385
 
51b8e6dd72d5
exported template for alpha_bn
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1383 
diff
changeset
 | 
365  | 
end  | 
| 
 
51b8e6dd72d5
exported template for alpha_bn
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1383 
diff
changeset
 | 
366  | 
*}  | 
| 
 
51b8e6dd72d5
exported template for alpha_bn
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1383 
diff
changeset
 | 
367  | 
|
| 
1397
 
6e2dfe52b271
Allows multiple bindings with same lhs.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1394 
diff
changeset
 | 
368  | 
(* Checks that a list of bindings contains only compatible ones *)  | 
| 
 
6e2dfe52b271
Allows multiple bindings with same lhs.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1394 
diff
changeset
 | 
369  | 
ML {*
 | 
| 
 
6e2dfe52b271
Allows multiple bindings with same lhs.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1394 
diff
changeset
 | 
370  | 
fun bns_same l =  | 
| 
 
6e2dfe52b271
Allows multiple bindings with same lhs.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1394 
diff
changeset
 | 
371  | 
length (distinct (op =) (map (fn ((b, _, _), _) => b) l)) = 1  | 
| 
 
6e2dfe52b271
Allows multiple bindings with same lhs.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1394 
diff
changeset
 | 
372  | 
*}  | 
| 
 
6e2dfe52b271
Allows multiple bindings with same lhs.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1394 
diff
changeset
 | 
373  | 
|
| 1206 | 374  | 
(* TODO: Notice datatypes without bindings and replace alpha with equality *)  | 
| 1175 | 375  | 
ML {*
 | 
| 
1375
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
376  | 
fun define_fv_alpha (dt_info : Datatype_Aux.info) bindsall bns lthy =  | 
| 1178 | 377  | 
let  | 
| 
1366
 
2bf82fa871e7
Proper recognition of atoms and atom sets.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1362 
diff
changeset
 | 
378  | 
val thy = ProofContext.theory_of lthy;  | 
| 
1277
 
6eacf60ce41d
Permutation and FV_Alpha interface change.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1258 
diff
changeset
 | 
379  | 
  val {descr, sorts, ...} = dt_info;
 | 
| 
1168
 
5c1e16806901
Code for generating the fv function, no bindings yet.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
380  | 
fun nth_dtyp i = typ_of_dtyp descr sorts (DtRec i);  | 
| 
 
5c1e16806901
Code for generating the fv function, no bindings yet.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
381  | 
val fv_names = Datatype_Prop.indexify_names (map (fn (i, _) =>  | 
| 
 
5c1e16806901
Code for generating the fv function, no bindings yet.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
382  | 
"fv_" ^ name_of_typ (nth_dtyp i)) descr);  | 
| 
 
5c1e16806901
Code for generating the fv function, no bindings yet.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
383  | 
  val fv_types = map (fn (i, _) => nth_dtyp i --> @{typ "atom set"}) descr;
 | 
| 
 
5c1e16806901
Code for generating the fv function, no bindings yet.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
384  | 
val fv_frees = map Free (fv_names ~~ fv_types);  | 
| 
1375
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
385  | 
val nr_bns = non_rec_binds bindsall;  | 
| 
1464
 
1850361efb8f
Revert 7c8cd6eae8e2, now all proofs in Term5 go through, both recursive and not.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1462 
diff
changeset
 | 
386  | 
val rel_bns = filter (fn (bn, _, _) => bn mem nr_bns) bns;  | 
| 
1375
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
387  | 
val (bn_fv_bns, fv_bn_names_eqs) = split_list (map (fv_bn thy dt_info fv_frees) rel_bns);  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
388  | 
val (fv_bn_names, fv_bn_eqs) = split_list fv_bn_names_eqs;  | 
| 
1193
 
a228acf2907e
Full alpha equivalence + testing in terms. Some differ but it seems the generated version is more correct.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1192 
diff
changeset
 | 
389  | 
val alpha_names = Datatype_Prop.indexify_names (map (fn (i, _) =>  | 
| 
 
a228acf2907e
Full alpha equivalence + testing in terms. Some differ but it seems the generated version is more correct.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1192 
diff
changeset
 | 
390  | 
"alpha_" ^ name_of_typ (nth_dtyp i)) descr);  | 
| 
 
a228acf2907e
Full alpha equivalence + testing in terms. Some differ but it seems the generated version is more correct.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1192 
diff
changeset
 | 
391  | 
  val alpha_types = map (fn (i, _) => nth_dtyp i --> nth_dtyp i --> @{typ bool}) descr;
 | 
| 
 
a228acf2907e
Full alpha equivalence + testing in terms. Some differ but it seems the generated version is more correct.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1192 
diff
changeset
 | 
392  | 
val alpha_frees = map Free (alpha_names ~~ alpha_types);  | 
| 
1385
 
51b8e6dd72d5
exported template for alpha_bn
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1383 
diff
changeset
 | 
393  | 
(* We assume that a bn is either recursive or not *)  | 
| 
 
51b8e6dd72d5
exported template for alpha_bn
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1383 
diff
changeset
 | 
394  | 
val bns_rec = map (fn (bn, _, _) => not (bn mem nr_bns)) bns;  | 
| 
1389
 
d0ba4829a76c
include alpha in the definitions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1388 
diff
changeset
 | 
395  | 
val (bn_alpha_bns, alpha_bn_names_eqs) = split_list (map (alpha_bn thy dt_info alpha_frees) (bns ~~ bns_rec))  | 
| 
 
d0ba4829a76c
include alpha in the definitions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1388 
diff
changeset
 | 
396  | 
val (alpha_bn_names, alpha_bn_eqs) = split_list alpha_bn_names_eqs;  | 
| 
 
d0ba4829a76c
include alpha in the definitions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1388 
diff
changeset
 | 
397  | 
val alpha_bn_frees = map snd bn_alpha_bns;  | 
| 
 
d0ba4829a76c
include alpha in the definitions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1388 
diff
changeset
 | 
398  | 
val alpha_bn_types = map fastype_of alpha_bn_frees;  | 
| 
1288
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
399  | 
fun fv_alpha_constr ith_dtyp (cname, dts) bindcs =  | 
| 
1168
 
5c1e16806901
Code for generating the fv function, no bindings yet.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
400  | 
let  | 
| 
 
5c1e16806901
Code for generating the fv function, no bindings yet.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
401  | 
val Ts = map (typ_of_dtyp descr sorts) dts;  | 
| 
1288
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
402  | 
val bindslen = length bindcs  | 
| 
1323
 
acf262971303
Fixes for the fv problem and alpha problem.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1308 
diff
changeset
 | 
403  | 
val pi_strs_same = replicate bindslen "pi"  | 
| 
 
acf262971303
Fixes for the fv problem and alpha problem.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1308 
diff
changeset
 | 
404  | 
val pi_strs = Name.variant_list [] pi_strs_same;  | 
| 
1288
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
405  | 
      val pis = map (fn ps => Free (ps, @{typ perm})) pi_strs;
 | 
| 
1357
 
42b7abf779ec
Gather bindings with same binder, and generate only one permutation for them.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1339 
diff
changeset
 | 
406  | 
val bind_pis_gath = bindcs ~~ pis;  | 
| 
 
42b7abf779ec
Gather bindings with same binder, and generate only one permutation for them.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1339 
diff
changeset
 | 
407  | 
val bind_pis = un_gather_binds_cons bind_pis_gath;  | 
| 
 
42b7abf779ec
Gather bindings with same binder, and generate only one permutation for them.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1339 
diff
changeset
 | 
408  | 
val bindcs = map fst bind_pis;  | 
| 
1288
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
409  | 
val names = Name.variant_list pi_strs (Datatype_Prop.make_tnames Ts);  | 
| 
1168
 
5c1e16806901
Code for generating the fv function, no bindings yet.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
410  | 
val args = map Free (names ~~ Ts);  | 
| 
1288
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
411  | 
val names2 = Name.variant_list (pi_strs @ names) (Datatype_Prop.make_tnames Ts);  | 
| 
1193
 
a228acf2907e
Full alpha equivalence + testing in terms. Some differ but it seems the generated version is more correct.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1192 
diff
changeset
 | 
412  | 
val args2 = map Free (names2 ~~ Ts);  | 
| 
1288
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
413  | 
val c = Const (cname, Ts ---> (nth_dtyp ith_dtyp));  | 
| 
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
414  | 
val fv_c = nth fv_frees ith_dtyp;  | 
| 
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
415  | 
val alpha = nth alpha_frees ith_dtyp;  | 
| 
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
416  | 
val arg_nos = 0 upto (length dts - 1)  | 
| 
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
417  | 
fun fv_bind args (NONE, i, _) =  | 
| 
1177
 
6f01720fe520
Add bindings of recursive types by free_variables.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1176 
diff
changeset
 | 
418  | 
if is_rec_type (nth dts i) then (nth fv_frees (body_index (nth dts i))) $ (nth args i) else  | 
| 
1366
 
2bf82fa871e7
Proper recognition of atoms and atom sets.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1362 
diff
changeset
 | 
419  | 
if ((is_atom thy) o fastype_of) (nth args i) then mk_single_atom (nth args i) else  | 
| 
1534
 
984ea1299cd7
The nominal infrastructure for fset. 'fs' missing, but not needed so far.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1516 
diff
changeset
 | 
420  | 
if ((is_atom_set thy) o fastype_of) (nth args i) then mk_atom_set (nth args i) else  | 
| 
 
984ea1299cd7
The nominal infrastructure for fset. 'fs' missing, but not needed so far.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1516 
diff
changeset
 | 
421  | 
if ((is_atom_fset thy) o fastype_of) (nth args i) then mk_atom_fset (nth args i) else  | 
| 
1366
 
2bf82fa871e7
Proper recognition of atoms and atom sets.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1362 
diff
changeset
 | 
422  | 
(* TODO we do not know what to do with non-atomizable things *)  | 
| 
 
2bf82fa871e7
Proper recognition of atoms and atom sets.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1362 
diff
changeset
 | 
423  | 
            @{term "{} :: atom set"}
 | 
| 
1375
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
424  | 
| fv_bind args (SOME (f, _), i, _) = f $ (nth args i);  | 
| 
1288
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
425  | 
fun fv_binds args relevant = mk_union (map (fv_bind args) relevant)  | 
| 
1464
 
1850361efb8f
Revert 7c8cd6eae8e2, now all proofs in Term5 go through, both recursive and not.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1462 
diff
changeset
 | 
426  | 
fun find_nonrec_binder j (SOME (f, false), i, _) = if i = j then SOME f else NONE  | 
| 
 
1850361efb8f
Revert 7c8cd6eae8e2, now all proofs in Term5 go through, both recursive and not.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1462 
diff
changeset
 | 
427  | 
| find_nonrec_binder _ _ = NONE  | 
| 
1288
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
428  | 
fun fv_arg ((dt, x), arg_no) =  | 
| 
1464
 
1850361efb8f
Revert 7c8cd6eae8e2, now all proofs in Term5 go through, both recursive and not.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1462 
diff
changeset
 | 
429  | 
case get_first (find_nonrec_binder arg_no) bindcs of  | 
| 
 
1850361efb8f
Revert 7c8cd6eae8e2, now all proofs in Term5 go through, both recursive and not.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1462 
diff
changeset
 | 
430  | 
SOME f =>  | 
| 
1375
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
431  | 
(case get_first (fn (x, y) => if x = f then SOME y else NONE) bn_fv_bns of  | 
| 
1464
 
1850361efb8f
Revert 7c8cd6eae8e2, now all proofs in Term5 go through, both recursive and not.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1462 
diff
changeset
 | 
432  | 
SOME fv_bn => fv_bn $ x  | 
| 
1375
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
433  | 
| NONE => error "bn specified in a non-rec binding but not in bn list")  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
434  | 
| NONE =>  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
435  | 
let  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
436  | 
val arg =  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
437  | 
if is_rec_type dt then nth fv_frees (body_index dt) $ x else  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
438  | 
if ((is_atom thy) o fastype_of) x then mk_single_atom x else  | 
| 
1534
 
984ea1299cd7
The nominal infrastructure for fset. 'fs' missing, but not needed so far.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1516 
diff
changeset
 | 
439  | 
if ((is_atom_set thy) o fastype_of) x then mk_atom_set x else  | 
| 
 
984ea1299cd7
The nominal infrastructure for fset. 'fs' missing, but not needed so far.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1516 
diff
changeset
 | 
440  | 
if ((is_atom_fset thy) o fastype_of) x then mk_atom_fset x else  | 
| 
1375
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
441  | 
(* TODO we do not know what to do with non-atomizable things *)  | 
| 
1454
 
7c8cd6eae8e2
FV_bn generated for recursive functions as well, and used in main fv for bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1452 
diff
changeset
 | 
442  | 
                @{term "{} :: atom set"};
 | 
| 
1375
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
443  | 
(* If i = j then we generate it only once *)  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
444  | 
val relevant = filter (fn (_, i, j) => ((i = arg_no) orelse (j = arg_no))) bindcs;  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
445  | 
val sub = fv_binds args relevant  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
446  | 
in  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
447  | 
mk_diff arg sub  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
448  | 
end;  | 
| 
1193
 
a228acf2907e
Full alpha equivalence + testing in terms. Some differ but it seems the generated version is more correct.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1192 
diff
changeset
 | 
449  | 
val fv_eq = HOLogic.mk_Trueprop (HOLogic.mk_eq  | 
| 
1288
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
450  | 
(fv_c $ list_comb (c, args), mk_union (map fv_arg (dts ~~ args ~~ arg_nos))))  | 
| 
1193
 
a228acf2907e
Full alpha equivalence + testing in terms. Some differ but it seems the generated version is more correct.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1192 
diff
changeset
 | 
451  | 
val alpha_rhs =  | 
| 
 
a228acf2907e
Full alpha equivalence + testing in terms. Some differ but it seems the generated version is more correct.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1192 
diff
changeset
 | 
452  | 
HOLogic.mk_Trueprop (alpha $ (list_comb (c, args)) $ (list_comb (c, args2)));  | 
| 
1288
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
453  | 
fun alpha_arg ((dt, arg_no), (arg, arg2)) =  | 
| 
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
454  | 
let  | 
| 
1383
 
8399236f901b
Use alpha_bns in normal alpha defs.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1382 
diff
changeset
 | 
455  | 
val rel_in_simp_binds = filter (fn ((NONE, i, _), _) => i = arg_no | _ => false) bind_pis;  | 
| 
 
8399236f901b
Use alpha_bns in normal alpha defs.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1382 
diff
changeset
 | 
456  | 
val rel_in_comp_binds = filter (fn ((SOME _, i, _), _) => i = arg_no | _ => false) bind_pis;  | 
| 
1468
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
457  | 
val rel_has_binds = filter (fn ((NONE, _, j), _) => j = arg_no  | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
458  | 
| ((SOME (_, false), _, j), _) => j = arg_no  | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
459  | 
| _ => false) bind_pis;  | 
| 
1472
 
4fa5365cd871
Fix in alpha; support of the recursive Let works :)
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1468 
diff
changeset
 | 
460  | 
val rel_has_rec_binds = filter  | 
| 
 
4fa5365cd871
Fix in alpha; support of the recursive Let works :)
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1468 
diff
changeset
 | 
461  | 
(fn ((SOME (_, true), _, j), _) => j = arg_no | _ => false) bind_pis;  | 
| 
1288
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
462  | 
in  | 
| 
1472
 
4fa5365cd871
Fix in alpha; support of the recursive Let works :)
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1468 
diff
changeset
 | 
463  | 
case (rel_in_simp_binds, rel_in_comp_binds, rel_has_binds, rel_has_rec_binds) of  | 
| 
 
4fa5365cd871
Fix in alpha; support of the recursive Let works :)
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1468 
diff
changeset
 | 
464  | 
([], [], [], []) =>  | 
| 
1383
 
8399236f901b
Use alpha_bns in normal alpha defs.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1382 
diff
changeset
 | 
465  | 
if is_rec_type dt then (nth alpha_frees (body_index dt) $ arg $ arg2)  | 
| 
 
8399236f901b
Use alpha_bns in normal alpha defs.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1382 
diff
changeset
 | 
466  | 
else (HOLogic.mk_eq (arg, arg2))  | 
| 
1472
 
4fa5365cd871
Fix in alpha; support of the recursive Let works :)
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1468 
diff
changeset
 | 
467  | 
          | (_, [], [], []) => @{term True}
 | 
| 
 
4fa5365cd871
Fix in alpha; support of the recursive Let works :)
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1468 
diff
changeset
 | 
468  | 
          | ([], [], [], _) => @{term True}
 | 
| 
 
4fa5365cd871
Fix in alpha; support of the recursive Let works :)
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1468 
diff
changeset
 | 
469  | 
| ([], ((((SOME (bn, is_rec)), _, _), pi) :: _), [], []) =>  | 
| 
1462
 
7c59dd8e5435
The old recursive alpha works fine.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1457 
diff
changeset
 | 
470  | 
if not (bns_same rel_in_comp_binds) then error "incompatible bindings for an argument" else  | 
| 
 
7c59dd8e5435
The old recursive alpha works fine.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1457 
diff
changeset
 | 
471  | 
if is_rec then  | 
| 
 
7c59dd8e5435
The old recursive alpha works fine.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1457 
diff
changeset
 | 
472  | 
let  | 
| 
 
7c59dd8e5435
The old recursive alpha works fine.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1457 
diff
changeset
 | 
473  | 
val (rbinds, rpis) = split_list rel_in_comp_binds  | 
| 
1468
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
474  | 
val bound_in_nos = map (fn (_, _, i) => i) rbinds  | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
475  | 
val bound_in_ty_nos = map (fn i => body_index (nth dts i)) bound_in_nos;  | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
476  | 
val bound_args = arg :: map (nth args) bound_in_nos;  | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
477  | 
val bound_args2 = arg2 :: map (nth args2) bound_in_nos;  | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
478  | 
fun bound_in args (_, _, i) = nth args i;  | 
| 
1462
 
7c59dd8e5435
The old recursive alpha works fine.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1457 
diff
changeset
 | 
479  | 
val lhs_binds = fv_binds args rbinds  | 
| 
1468
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
480  | 
val lhs_arg = foldr1 HOLogic.mk_prod bound_args  | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
481  | 
val lhs = mk_pair (lhs_binds, lhs_arg);  | 
| 
1462
 
7c59dd8e5435
The old recursive alpha works fine.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1457 
diff
changeset
 | 
482  | 
val rhs_binds = fv_binds args2 rbinds;  | 
| 
1468
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
483  | 
val rhs_arg = foldr1 HOLogic.mk_prod bound_args2;  | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
484  | 
val rhs = mk_pair (rhs_binds, rhs_arg);  | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
485  | 
val fvs = map (nth fv_frees) ((body_index dt) :: bound_in_ty_nos);  | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
486  | 
val fv = mk_compound_fv fvs;  | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
487  | 
val alphas = map (nth alpha_frees) ((body_index dt) :: bound_in_ty_nos);  | 
| 
 
416c9c5a1126
Generate compound FV and Alpha for recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1464 
diff
changeset
 | 
488  | 
val alpha = mk_compound_alpha alphas;  | 
| 
1462
 
7c59dd8e5435
The old recursive alpha works fine.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1457 
diff
changeset
 | 
489  | 
val pi = foldr1 add_perm (distinct (op =) rpis);  | 
| 
 
7c59dd8e5435
The old recursive alpha works fine.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1457 
diff
changeset
 | 
490  | 
                val alpha_gen_pre = Const (@{const_name alpha_gen}, dummyT) $ lhs $ alpha $ fv $ pi $ rhs;
 | 
| 
 
7c59dd8e5435
The old recursive alpha works fine.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1457 
diff
changeset
 | 
491  | 
val alpha_gen = Syntax.check_term lthy alpha_gen_pre  | 
| 
 
7c59dd8e5435
The old recursive alpha works fine.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1457 
diff
changeset
 | 
492  | 
in  | 
| 
 
7c59dd8e5435
The old recursive alpha works fine.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1457 
diff
changeset
 | 
493  | 
alpha_gen  | 
| 
 
7c59dd8e5435
The old recursive alpha works fine.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1457 
diff
changeset
 | 
494  | 
end  | 
| 
 
7c59dd8e5435
The old recursive alpha works fine.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1457 
diff
changeset
 | 
495  | 
else  | 
| 
 
7c59dd8e5435
The old recursive alpha works fine.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1457 
diff
changeset
 | 
496  | 
let  | 
| 
 
7c59dd8e5435
The old recursive alpha works fine.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1457 
diff
changeset
 | 
497  | 
val alpha_bn_const =  | 
| 
 
7c59dd8e5435
The old recursive alpha works fine.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1457 
diff
changeset
 | 
498  | 
nth alpha_bn_frees (find_index (fn (b, _, _) => b = bn) bns)  | 
| 
 
7c59dd8e5435
The old recursive alpha works fine.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1457 
diff
changeset
 | 
499  | 
in  | 
| 
 
7c59dd8e5435
The old recursive alpha works fine.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1457 
diff
changeset
 | 
500  | 
alpha_bn_const $ arg $ arg2  | 
| 
 
7c59dd8e5435
The old recursive alpha works fine.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1457 
diff
changeset
 | 
501  | 
end  | 
| 
1472
 
4fa5365cd871
Fix in alpha; support of the recursive Let works :)
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1468 
diff
changeset
 | 
502  | 
| ([], [], relevant, []) =>  | 
| 
1383
 
8399236f901b
Use alpha_bns in normal alpha defs.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1382 
diff
changeset
 | 
503  | 
let  | 
| 
1288
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
504  | 
val (rbinds, rpis) = split_list relevant  | 
| 
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
505  | 
val lhs_binds = fv_binds args rbinds  | 
| 
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
506  | 
val lhs = mk_pair (lhs_binds, arg);  | 
| 
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
507  | 
val rhs_binds = fv_binds args2 rbinds;  | 
| 
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
508  | 
val rhs = mk_pair (rhs_binds, arg2);  | 
| 
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
509  | 
val alpha = nth alpha_frees (body_index dt);  | 
| 
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
510  | 
val fv = nth fv_frees (body_index dt);  | 
| 
1359
 
3bf496a971c6
Fix permutation addition.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1358 
diff
changeset
 | 
511  | 
val pi = foldr1 add_perm (distinct (op =) rpis);  | 
| 
1288
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
512  | 
              val alpha_gen_pre = Const (@{const_name alpha_gen}, dummyT) $ lhs $ alpha $ fv $ pi $ rhs;
 | 
| 
1325
 
0be098c61d00
Add the supp intersection conditions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1323 
diff
changeset
 | 
513  | 
val alpha_gen = Syntax.check_term lthy alpha_gen_pre  | 
| 
1288
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
514  | 
in  | 
| 
1357
 
42b7abf779ec
Gather bindings with same binder, and generate only one permutation for them.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1339 
diff
changeset
 | 
515  | 
alpha_gen  | 
| 
1383
 
8399236f901b
Use alpha_bns in normal alpha defs.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1382 
diff
changeset
 | 
516  | 
end  | 
| 
1385
 
51b8e6dd72d5
exported template for alpha_bn
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1383 
diff
changeset
 | 
517  | 
| _ => error "Fv.alpha: not supported binding structure"  | 
| 
1288
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
518  | 
end  | 
| 
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
519  | 
val alphas = map alpha_arg (dts ~~ arg_nos ~~ (args ~~ args2))  | 
| 
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
520  | 
val alpha_lhss = mk_conjl alphas  | 
| 
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
521  | 
val alpha_lhss_ex =  | 
| 
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
522  | 
        fold (fn pi_str => fn t => HOLogic.mk_exists (pi_str, @{typ perm}, t)) pi_strs alpha_lhss
 | 
| 
 
0203cd5cfd6c
The new alpha-equivalence and testing in Trm2 and Trm5.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1277 
diff
changeset
 | 
523  | 
val alpha_eq = Logic.mk_implies (HOLogic.mk_Trueprop alpha_lhss_ex, alpha_rhs)  | 
| 
1173
 
9cb99a28b40e
Some optimizations and fixes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1172 
diff
changeset
 | 
524  | 
in  | 
| 
1193
 
a228acf2907e
Full alpha equivalence + testing in terms. Some differ but it seems the generated version is more correct.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1192 
diff
changeset
 | 
525  | 
(fv_eq, alpha_eq)  | 
| 
1168
 
5c1e16806901
Code for generating the fv function, no bindings yet.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
526  | 
end;  | 
| 
1302
 
d3101a5b9c4d
Length fix for nested recursions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1301 
diff
changeset
 | 
527  | 
fun fv_alpha_eq (i, (_, _, constrs)) binds = map2i (fv_alpha_constr i) constrs binds;  | 
| 
1376
 
56efa1e854bf
Separate primrecs in Fv.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1375 
diff
changeset
 | 
528  | 
val fveqs_alphaeqs = map2i fv_alpha_eq descr (gather_binds bindsall)  | 
| 
 
56efa1e854bf
Separate primrecs in Fv.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1375 
diff
changeset
 | 
529  | 
val (fv_eqs_perfv, alpha_eqs) = apsnd flat (split_list (map split_list fveqs_alphaeqs))  | 
| 
 
56efa1e854bf
Separate primrecs in Fv.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1375 
diff
changeset
 | 
530  | 
val rel_bns_nos = map (fn (_, i, _) => i) rel_bns;  | 
| 
1385
 
51b8e6dd72d5
exported template for alpha_bn
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1383 
diff
changeset
 | 
531  | 
fun filter_fun (_, b) = b mem rel_bns_nos;  | 
| 
1376
 
56efa1e854bf
Separate primrecs in Fv.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1375 
diff
changeset
 | 
532  | 
val all_fvs = (fv_names ~~ fv_eqs_perfv) ~~ (0 upto (length fv_names - 1))  | 
| 
 
56efa1e854bf
Separate primrecs in Fv.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1375 
diff
changeset
 | 
533  | 
val (fv_names_fst, fv_eqs_fst) = apsnd flat (split_list (map fst (filter_out filter_fun all_fvs)))  | 
| 
 
56efa1e854bf
Separate primrecs in Fv.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1375 
diff
changeset
 | 
534  | 
val (fv_names_snd, fv_eqs_snd) = apsnd flat (split_list (map fst (filter filter_fun all_fvs)))  | 
| 
 
56efa1e854bf
Separate primrecs in Fv.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1375 
diff
changeset
 | 
535  | 
val fv_eqs_all = fv_eqs_fst @ (flat fv_bn_eqs);  | 
| 
 
56efa1e854bf
Separate primrecs in Fv.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1375 
diff
changeset
 | 
536  | 
val fv_names_all = fv_names_fst @ fv_bn_names;  | 
| 
1193
 
a228acf2907e
Full alpha equivalence + testing in terms. Some differ but it seems the generated version is more correct.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1192 
diff
changeset
 | 
537  | 
val add_binds = map (fn x => (Attrib.empty_binding, x))  | 
| 
1375
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
538  | 
(* Function_Fun.add_fun Function_Common.default_config ... true *)  | 
| 
1193
 
a228acf2907e
Full alpha equivalence + testing in terms. Some differ but it seems the generated version is more correct.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1192 
diff
changeset
 | 
539  | 
val (fvs, lthy') = (Primrec.add_primrec  | 
| 
1375
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
540  | 
(map (fn s => (Binding.name s, NONE, NoSyn)) fv_names_all) (add_binds fv_eqs_all) lthy)  | 
| 
1376
 
56efa1e854bf
Separate primrecs in Fv.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1375 
diff
changeset
 | 
541  | 
val (fvs2, lthy'') =  | 
| 
 
56efa1e854bf
Separate primrecs in Fv.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1375 
diff
changeset
 | 
542  | 
if fv_eqs_snd = [] then (([], []), lthy') else  | 
| 
 
56efa1e854bf
Separate primrecs in Fv.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1375 
diff
changeset
 | 
543  | 
(Primrec.add_primrec  | 
| 
 
56efa1e854bf
Separate primrecs in Fv.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1375 
diff
changeset
 | 
544  | 
(map (fn s => (Binding.name s, NONE, NoSyn)) fv_names_snd) (add_binds fv_eqs_snd) lthy')  | 
| 
 
56efa1e854bf
Separate primrecs in Fv.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1375 
diff
changeset
 | 
545  | 
val (alphas, lthy''') = (Inductive.add_inductive_i  | 
| 
1325
 
0be098c61d00
Add the supp intersection conditions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1323 
diff
changeset
 | 
546  | 
     {quiet_mode = true, verbose = false, alt_name = Binding.empty,
 | 
| 
1193
 
a228acf2907e
Full alpha equivalence + testing in terms. Some differ but it seems the generated version is more correct.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1192 
diff
changeset
 | 
547  | 
coind = false, no_elim = false, no_ind = false, skip_mono = true, fork_mono = false}  | 
| 
1389
 
d0ba4829a76c
include alpha in the definitions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1388 
diff
changeset
 | 
548  | 
(map2 (fn x => fn y => ((Binding.name x, y), NoSyn)) (alpha_names @ alpha_bn_names)  | 
| 
 
d0ba4829a76c
include alpha in the definitions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1388 
diff
changeset
 | 
549  | 
(alpha_types @ alpha_bn_types)) []  | 
| 
 
d0ba4829a76c
include alpha in the definitions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1388 
diff
changeset
 | 
550  | 
(add_binds (alpha_eqs @ flat alpha_bn_eqs)) [] lthy'')  | 
| 
1385
 
51b8e6dd72d5
exported template for alpha_bn
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1383 
diff
changeset
 | 
551  | 
val all_fvs = (fst fvs @ fst fvs2, snd fvs @ snd fvs2)  | 
| 1178 | 552  | 
in  | 
| 
1385
 
51b8e6dd72d5
exported template for alpha_bn
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1383 
diff
changeset
 | 
553  | 
((all_fvs, alphas), lthy''')  | 
| 1178 | 554  | 
end  | 
| 
1168
 
5c1e16806901
Code for generating the fv function, no bindings yet.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
555  | 
*}  | 
| 
 
5c1e16806901
Code for generating the fv function, no bindings yet.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
556  | 
|
| 
1375
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
557  | 
(*  | 
| 1178 | 558  | 
atom_decl name  | 
| 
1375
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
559  | 
datatype lam =  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
560  | 
VAR "name"  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
561  | 
| APP "lam" "lam"  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
562  | 
| LET "bp" "lam"  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
563  | 
and bp =  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
564  | 
BP "name" "lam"  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
565  | 
primrec  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
566  | 
bi::"bp \<Rightarrow> atom set"  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
567  | 
where  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
568  | 
  "bi (BP x t) = {atom x}"
 | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
569  | 
setup {* snd o define_raw_perms (Datatype.the_info @{theory} "Fv.lam") 2 *}
 | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
570  | 
local_setup {*
 | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
571  | 
  snd o define_fv_alpha (Datatype.the_info @{theory} "Fv.lam")
 | 
| 
1389
 
d0ba4829a76c
include alpha in the definitions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1388 
diff
changeset
 | 
572  | 
  [[[], [], [(SOME (@{term bi}, true), 0, 1)]], [[]]] [(@{term bi}, 1, [[0]])] *}
 | 
| 
1375
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
573  | 
print_theorems  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
574  | 
*)  | 
| 
 
aa787c9b6955
A version of Fv that takes into account recursive and non-recursive bindings.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1366 
diff
changeset
 | 
575  | 
|
| 
1389
 
d0ba4829a76c
include alpha in the definitions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1388 
diff
changeset
 | 
576  | 
(*atom_decl name  | 
| 1178 | 577  | 
datatype rtrm1 =  | 
578  | 
rVr1 "name"  | 
|
579  | 
| rAp1 "rtrm1" "rtrm1"  | 
|
580  | 
| rLm1 "name" "rtrm1" --"name is bound in trm1"  | 
|
581  | 
| rLt1 "bp" "rtrm1" "rtrm1" --"all variables in bp are bound in the 2nd trm1"  | 
|
582  | 
and bp =  | 
|
583  | 
BUnit  | 
|
584  | 
| BVr "name"  | 
|
585  | 
| BPr "bp" "bp"  | 
|
| 1358 | 586  | 
primrec  | 
| 1178 | 587  | 
bv1  | 
588  | 
where  | 
|
589  | 
  "bv1 (BUnit) = {}"
 | 
|
590  | 
| "bv1 (BVr x) = {atom x}"
 | 
|
591  | 
| "bv1 (BPr bp1 bp2) = (bv1 bp1) \<union> (bv1 bp1)"  | 
|
| 
1389
 
d0ba4829a76c
include alpha in the definitions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1388 
diff
changeset
 | 
592  | 
setup {* snd o define_raw_perms (Datatype.the_info @{theory} "Fv.rtrm1") 2 *}
 | 
| 
 
d0ba4829a76c
include alpha in the definitions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1388 
diff
changeset
 | 
593  | 
local_setup {*
 | 
| 
 
d0ba4829a76c
include alpha in the definitions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1388 
diff
changeset
 | 
594  | 
  snd o define_fv_alpha (Datatype.the_info @{theory} "Fv.rtrm1")
 | 
| 
 
d0ba4829a76c
include alpha in the definitions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1388 
diff
changeset
 | 
595  | 
  [[[], [], [(NONE, 0, 1)], [(SOME (@{term bv1}, false), 0, 2)]],
 | 
| 
 
d0ba4829a76c
include alpha in the definitions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1388 
diff
changeset
 | 
596  | 
  [[], [], []]] [(@{term bv1}, 1, [[], [0], [0, 1]])] *}
 | 
| 
1168
 
5c1e16806901
Code for generating the fv function, no bindings yet.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
597  | 
print_theorems  | 
| 
1193
 
a228acf2907e
Full alpha equivalence + testing in terms. Some differ but it seems the generated version is more correct.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1192 
diff
changeset
 | 
598  | 
*)  | 
| 1180 | 599  | 
|
| 
1389
 
d0ba4829a76c
include alpha in the definitions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1388 
diff
changeset
 | 
600  | 
(*  | 
| 
 
d0ba4829a76c
include alpha in the definitions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1388 
diff
changeset
 | 
601  | 
atom_decl name  | 
| 
 
d0ba4829a76c
include alpha in the definitions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1388 
diff
changeset
 | 
602  | 
datatype rtrm5 =  | 
| 
 
d0ba4829a76c
include alpha in the definitions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1388 
diff
changeset
 | 
603  | 
rVr5 "name"  | 
| 
 
d0ba4829a76c
include alpha in the definitions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1388 
diff
changeset
 | 
604  | 
| rLt5 "rlts" "rtrm5" --"bind (bv5 lts) in (rtrm5)"  | 
| 
 
d0ba4829a76c
include alpha in the definitions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1388 
diff
changeset
 | 
605  | 
and rlts =  | 
| 
 
d0ba4829a76c
include alpha in the definitions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1388 
diff
changeset
 | 
606  | 
rLnil  | 
| 
 
d0ba4829a76c
include alpha in the definitions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1388 
diff
changeset
 | 
607  | 
| rLcons "name" "rtrm5" "rlts"  | 
| 
 
d0ba4829a76c
include alpha in the definitions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1388 
diff
changeset
 | 
608  | 
primrec  | 
| 
 
d0ba4829a76c
include alpha in the definitions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1388 
diff
changeset
 | 
609  | 
rbv5  | 
| 
 
d0ba4829a76c
include alpha in the definitions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1388 
diff
changeset
 | 
610  | 
where  | 
| 
 
d0ba4829a76c
include alpha in the definitions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1388 
diff
changeset
 | 
611  | 
  "rbv5 rLnil = {}"
 | 
| 
 
d0ba4829a76c
include alpha in the definitions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1388 
diff
changeset
 | 
612  | 
| "rbv5 (rLcons n t ltl) = {atom n} \<union> (rbv5 ltl)"
 | 
| 
 
d0ba4829a76c
include alpha in the definitions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1388 
diff
changeset
 | 
613  | 
setup {* snd o define_raw_perms (Datatype.the_info @{theory} "Fv.rtrm5") 2 *}
 | 
| 
 
d0ba4829a76c
include alpha in the definitions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1388 
diff
changeset
 | 
614  | 
local_setup {* snd o define_fv_alpha (Datatype.the_info @{theory} "Fv.rtrm5")
 | 
| 
 
d0ba4829a76c
include alpha in the definitions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1388 
diff
changeset
 | 
615  | 
  [[[], [(SOME (@{term rbv5}, false), 0, 1)]], [[], []]] [(@{term rbv5}, 1, [[], [0, 2]])] *}
 | 
| 
 
d0ba4829a76c
include alpha in the definitions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1388 
diff
changeset
 | 
616  | 
print_theorems  | 
| 
 
d0ba4829a76c
include alpha in the definitions.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1388 
diff
changeset
 | 
617  | 
*)  | 
| 
1199
 
5770c73f2415
Automatic production and proving of pseudo-injectivity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1196 
diff
changeset
 | 
618  | 
|
| 
1196
 
4efbaba9d754
Constructing alpha_inj goal.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1193 
diff
changeset
 | 
619  | 
ML {*
 | 
| 
1199
 
5770c73f2415
Automatic production and proving of pseudo-injectivity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1196 
diff
changeset
 | 
620  | 
fun alpha_inj_tac dist_inj intrs elims =  | 
| 
 
5770c73f2415
Automatic production and proving of pseudo-injectivity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1196 
diff
changeset
 | 
621  | 
SOLVED' (asm_full_simp_tac (HOL_ss addsimps intrs)) ORELSE'  | 
| 
1216
 
06ace3a1eedd
Fixed pseudo_injectivity for trm4
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1215 
diff
changeset
 | 
622  | 
  (rtac @{thm iffI} THEN' RANGE [
 | 
| 
1199
 
5770c73f2415
Automatic production and proving of pseudo-injectivity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1196 
diff
changeset
 | 
623  | 
(eresolve_tac elims THEN_ALL_NEW  | 
| 
 
5770c73f2415
Automatic production and proving of pseudo-injectivity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1196 
diff
changeset
 | 
624  | 
asm_full_simp_tac (HOL_ss addsimps dist_inj)  | 
| 
 
5770c73f2415
Automatic production and proving of pseudo-injectivity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1196 
diff
changeset
 | 
625  | 
),  | 
| 
1216
 
06ace3a1eedd
Fixed pseudo_injectivity for trm4
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1215 
diff
changeset
 | 
626  | 
asm_full_simp_tac (HOL_ss addsimps intrs)])  | 
| 
1199
 
5770c73f2415
Automatic production and proving of pseudo-injectivity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1196 
diff
changeset
 | 
627  | 
*}  | 
| 
 
5770c73f2415
Automatic production and proving of pseudo-injectivity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1196 
diff
changeset
 | 
628  | 
|
| 
 
5770c73f2415
Automatic production and proving of pseudo-injectivity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1196 
diff
changeset
 | 
629  | 
ML {*
 | 
| 
 
5770c73f2415
Automatic production and proving of pseudo-injectivity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1196 
diff
changeset
 | 
630  | 
fun build_alpha_inj_gl thm =  | 
| 
 
5770c73f2415
Automatic production and proving of pseudo-injectivity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1196 
diff
changeset
 | 
631  | 
let  | 
| 
 
5770c73f2415
Automatic production and proving of pseudo-injectivity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1196 
diff
changeset
 | 
632  | 
val prop = prop_of thm;  | 
| 
 
5770c73f2415
Automatic production and proving of pseudo-injectivity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1196 
diff
changeset
 | 
633  | 
val concl = HOLogic.dest_Trueprop (Logic.strip_imp_concl prop);  | 
| 
 
5770c73f2415
Automatic production and proving of pseudo-injectivity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1196 
diff
changeset
 | 
634  | 
val hyps = map HOLogic.dest_Trueprop (Logic.strip_imp_prems prop);  | 
| 
 
5770c73f2415
Automatic production and proving of pseudo-injectivity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1196 
diff
changeset
 | 
635  | 
fun list_conj l = foldr1 HOLogic.mk_conj l;  | 
| 
 
5770c73f2415
Automatic production and proving of pseudo-injectivity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1196 
diff
changeset
 | 
636  | 
in  | 
| 
 
5770c73f2415
Automatic production and proving of pseudo-injectivity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1196 
diff
changeset
 | 
637  | 
if hyps = [] then concl  | 
| 
 
5770c73f2415
Automatic production and proving of pseudo-injectivity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1196 
diff
changeset
 | 
638  | 
else HOLogic.mk_eq (concl, list_conj hyps)  | 
| 
 
5770c73f2415
Automatic production and proving of pseudo-injectivity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1196 
diff
changeset
 | 
639  | 
end;  | 
| 
 
5770c73f2415
Automatic production and proving of pseudo-injectivity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1196 
diff
changeset
 | 
640  | 
*}  | 
| 
 
5770c73f2415
Automatic production and proving of pseudo-injectivity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1196 
diff
changeset
 | 
641  | 
|
| 
 
5770c73f2415
Automatic production and proving of pseudo-injectivity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1196 
diff
changeset
 | 
642  | 
ML {*
 | 
| 
 
5770c73f2415
Automatic production and proving of pseudo-injectivity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1196 
diff
changeset
 | 
643  | 
fun build_alpha_inj intrs dist_inj elims ctxt =  | 
| 
1196
 
4efbaba9d754
Constructing alpha_inj goal.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1193 
diff
changeset
 | 
644  | 
let  | 
| 
1199
 
5770c73f2415
Automatic production and proving of pseudo-injectivity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1196 
diff
changeset
 | 
645  | 
val ((_, thms_imp), ctxt') = Variable.import false intrs ctxt;  | 
| 
 
5770c73f2415
Automatic production and proving of pseudo-injectivity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1196 
diff
changeset
 | 
646  | 
val gls = map (HOLogic.mk_Trueprop o build_alpha_inj_gl) thms_imp;  | 
| 
 
5770c73f2415
Automatic production and proving of pseudo-injectivity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1196 
diff
changeset
 | 
647  | 
fun tac _ = alpha_inj_tac dist_inj intrs elims 1;  | 
| 
 
5770c73f2415
Automatic production and proving of pseudo-injectivity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1196 
diff
changeset
 | 
648  | 
val thms = map (fn gl => Goal.prove ctxt' [] [] gl tac) gls;  | 
| 
1196
 
4efbaba9d754
Constructing alpha_inj goal.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1193 
diff
changeset
 | 
649  | 
in  | 
| 
1199
 
5770c73f2415
Automatic production and proving of pseudo-injectivity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1196 
diff
changeset
 | 
650  | 
Variable.export ctxt' ctxt thms  | 
| 
1168
 
5c1e16806901
Code for generating the fv function, no bindings yet.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
651  | 
end  | 
| 
1196
 
4efbaba9d754
Constructing alpha_inj goal.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1193 
diff
changeset
 | 
652  | 
*}  | 
| 
 
4efbaba9d754
Constructing alpha_inj goal.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1193 
diff
changeset
 | 
653  | 
|
| 1207 | 654  | 
ML {*
 | 
| 
1214
 
0f92257edeee
A tactic for final equivp
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1213 
diff
changeset
 | 
655  | 
fun build_alpha_refl_gl alphas (x, y, z) =  | 
| 1207 | 656  | 
let  | 
657  | 
fun build_alpha alpha =  | 
|
658  | 
let  | 
|
659  | 
val ty = domain_type (fastype_of alpha);  | 
|
| 
1214
 
0f92257edeee
A tactic for final equivp
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1213 
diff
changeset
 | 
660  | 
val var = Free(x, ty);  | 
| 
 
0f92257edeee
A tactic for final equivp
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1213 
diff
changeset
 | 
661  | 
val var2 = Free(y, ty);  | 
| 
 
0f92257edeee
A tactic for final equivp
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1213 
diff
changeset
 | 
662  | 
val var3 = Free(z, ty);  | 
| 
1209
 
7b1a3df239cd
Some progress about transp
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1208 
diff
changeset
 | 
663  | 
val symp = HOLogic.mk_imp (alpha $ var $ var2, alpha $ var2 $ var);  | 
| 
 
7b1a3df239cd
Some progress about transp
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1208 
diff
changeset
 | 
664  | 
val transp = HOLogic.mk_imp (alpha $ var $ var2,  | 
| 
1214
 
0f92257edeee
A tactic for final equivp
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1213 
diff
changeset
 | 
665  | 
HOLogic.mk_all (z, ty,  | 
| 
1209
 
7b1a3df239cd
Some progress about transp
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1208 
diff
changeset
 | 
666  | 
HOLogic.mk_imp (alpha $ var2 $ var3, alpha $ var $ var3)))  | 
| 1207 | 667  | 
in  | 
| 
1209
 
7b1a3df239cd
Some progress about transp
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1208 
diff
changeset
 | 
668  | 
((alpha $ var $ var), (symp, transp))  | 
| 
1208
 
cc86faf0d2a0
alpha-symmetric addons.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1207 
diff
changeset
 | 
669  | 
end;  | 
| 
1209
 
7b1a3df239cd
Some progress about transp
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1208 
diff
changeset
 | 
670  | 
val (refl_eqs, eqs) = split_list (map build_alpha alphas)  | 
| 
 
7b1a3df239cd
Some progress about transp
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1208 
diff
changeset
 | 
671  | 
val (sym_eqs, trans_eqs) = split_list eqs  | 
| 
 
7b1a3df239cd
Some progress about transp
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1208 
diff
changeset
 | 
672  | 
  fun conj l = @{term Trueprop} $ foldr1 HOLogic.mk_conj l
 | 
| 1207 | 673  | 
in  | 
| 
1209
 
7b1a3df239cd
Some progress about transp
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1208 
diff
changeset
 | 
674  | 
(conj refl_eqs, (conj sym_eqs, conj trans_eqs))  | 
| 
1196
 
4efbaba9d754
Constructing alpha_inj goal.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1193 
diff
changeset
 | 
675  | 
end  | 
| 1207 | 676  | 
*}  | 
677  | 
||
| 
1213
 
43bd70786f9f
More equivp infrastructure.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1209 
diff
changeset
 | 
678  | 
ML {*
 | 
| 
1333
 
c6e521a2a0b1
reflp for multiple quantifiers.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1325 
diff
changeset
 | 
679  | 
fun reflp_tac induct inj ctxt =  | 
| 
1213
 
43bd70786f9f
More equivp infrastructure.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1209 
diff
changeset
 | 
680  | 
rtac induct THEN_ALL_NEW  | 
| 
1333
 
c6e521a2a0b1
reflp for multiple quantifiers.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1325 
diff
changeset
 | 
681  | 
simp_tac ((mk_minimal_ss ctxt) addsimps inj) THEN_ALL_NEW  | 
| 
 
c6e521a2a0b1
reflp for multiple quantifiers.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1325 
diff
changeset
 | 
682  | 
  split_conjs THEN_ALL_NEW REPEAT o rtac @{thm exI[of _ "0 :: perm"]}
 | 
| 
 
c6e521a2a0b1
reflp for multiple quantifiers.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1325 
diff
changeset
 | 
683  | 
THEN_ALL_NEW split_conjs THEN_ALL_NEW asm_full_simp_tac (HOL_ss addsimps  | 
| 
 
c6e521a2a0b1
reflp for multiple quantifiers.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1325 
diff
changeset
 | 
684  | 
     @{thms alpha_gen fresh_star_def fresh_zero_perm permute_zero ball_triv
 | 
| 
1482
 
a98c15866300
Trying to find a compose lemma for 2 arguments.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1480 
diff
changeset
 | 
685  | 
add_0_left supp_zero_perm Int_empty_left split_conv})  | 
| 
1213
 
43bd70786f9f
More equivp infrastructure.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1209 
diff
changeset
 | 
686  | 
*}  | 
| 
 
43bd70786f9f
More equivp infrastructure.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1209 
diff
changeset
 | 
687  | 
|
| 
1333
 
c6e521a2a0b1
reflp for multiple quantifiers.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1325 
diff
changeset
 | 
688  | 
|
| 1301 | 689  | 
lemma exi_neg: "\<exists>(pi :: perm). P pi \<Longrightarrow> (\<And>(p :: perm). P p \<Longrightarrow> Q (- p)) \<Longrightarrow> \<exists>pi. Q pi"  | 
690  | 
apply (erule exE)  | 
|
691  | 
apply (rule_tac x="-pi" in exI)  | 
|
692  | 
by auto  | 
|
693  | 
||
| 
1213
 
43bd70786f9f
More equivp infrastructure.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1209 
diff
changeset
 | 
694  | 
ML {*
 | 
| 
1334
 
80441e27dfd6
Code for solving symp goals with multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1333 
diff
changeset
 | 
695  | 
fun symp_tac induct inj eqvt ctxt =  | 
| 
 
80441e27dfd6
Code for solving symp goals with multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1333 
diff
changeset
 | 
696  | 
ind_tac induct THEN_ALL_NEW  | 
| 
 
80441e27dfd6
Code for solving symp goals with multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1333 
diff
changeset
 | 
697  | 
simp_tac ((mk_minimal_ss ctxt) addsimps inj) THEN_ALL_NEW split_conjs  | 
| 
 
80441e27dfd6
Code for solving symp goals with multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1333 
diff
changeset
 | 
698  | 
THEN_ALL_NEW  | 
| 
 
80441e27dfd6
Code for solving symp goals with multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1333 
diff
changeset
 | 
699  | 
  REPEAT o etac @{thm exi_neg}
 | 
| 
 
80441e27dfd6
Code for solving symp goals with multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1333 
diff
changeset
 | 
700  | 
THEN_ALL_NEW  | 
| 
 
80441e27dfd6
Code for solving symp goals with multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1333 
diff
changeset
 | 
701  | 
split_conjs THEN_ALL_NEW  | 
| 
 
80441e27dfd6
Code for solving symp goals with multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1333 
diff
changeset
 | 
702  | 
  asm_full_simp_tac (HOL_ss addsimps @{thms supp_minus_perm minus_add[symmetric]}) THEN_ALL_NEW
 | 
| 1487 | 703  | 
  TRY o (rtac @{thm alpha_gen_compose_sym2} ORELSE' rtac @{thm alpha_gen_compose_sym}) THEN_ALL_NEW
 | 
704  | 
(asm_full_simp_tac (HOL_ss addsimps (eqvt @ all_eqvts ctxt)))  | 
|
| 
1213
 
43bd70786f9f
More equivp infrastructure.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1209 
diff
changeset
 | 
705  | 
*}  | 
| 
 
43bd70786f9f
More equivp infrastructure.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1209 
diff
changeset
 | 
706  | 
|
| 
 
43bd70786f9f
More equivp infrastructure.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1209 
diff
changeset
 | 
707  | 
ML {*
 | 
| 
1217
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
708  | 
fun imp_elim_tac case_rules =  | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
709  | 
  Subgoal.FOCUS (fn {concl, context, ...} =>
 | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
710  | 
case term_of concl of  | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
711  | 
_ $ (_ $ asm $ _) =>  | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
712  | 
let  | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
713  | 
fun filter_fn case_rule = (  | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
714  | 
case Logic.strip_assums_hyp (prop_of case_rule) of  | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
715  | 
((_ $ asmc) :: _) =>  | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
716  | 
let  | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
717  | 
val thy = ProofContext.theory_of context  | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
718  | 
in  | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
719  | 
Pattern.matches thy (asmc, asm)  | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
720  | 
end  | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
721  | 
| _ => false)  | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
722  | 
val matching_rules = filter filter_fn case_rules  | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
723  | 
in  | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
724  | 
(rtac impI THEN' rotate_tac (~1) THEN' eresolve_tac matching_rules) 1  | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
725  | 
end  | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
726  | 
| _ => no_tac  | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
727  | 
)  | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
728  | 
*}  | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
729  | 
|
| 1301 | 730  | 
|
731  | 
lemma exi_sum: "\<exists>(pi :: perm). P pi \<Longrightarrow> \<exists>(pi :: perm). Q pi \<Longrightarrow> (\<And>(p :: perm) (pi :: perm). P p \<Longrightarrow> Q pi \<Longrightarrow> R (pi + p)) \<Longrightarrow> \<exists>pi. R pi"  | 
|
732  | 
apply (erule exE)+  | 
|
733  | 
apply (rule_tac x="pia + pi" in exI)  | 
|
734  | 
by auto  | 
|
735  | 
||
| 
1217
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
736  | 
ML {*
 | 
| 
1339
 
5256f256edd8
Comment out Weird and Phd until we have an idea how to handle multiple permutations. Transp that works for multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1338 
diff
changeset
 | 
737  | 
fun is_ex (Const ("Ex", _) $ Abs _) = true
 | 
| 
 
5256f256edd8
Comment out Weird and Phd until we have an idea how to handle multiple permutations. Transp that works for multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1338 
diff
changeset
 | 
738  | 
| is_ex _ = false;  | 
| 
 
5256f256edd8
Comment out Weird and Phd until we have an idea how to handle multiple permutations. Transp that works for multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1338 
diff
changeset
 | 
739  | 
*}  | 
| 
 
5256f256edd8
Comment out Weird and Phd until we have an idea how to handle multiple permutations. Transp that works for multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1338 
diff
changeset
 | 
740  | 
|
| 
 
5256f256edd8
Comment out Weird and Phd until we have an idea how to handle multiple permutations. Transp that works for multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1338 
diff
changeset
 | 
741  | 
ML {*
 | 
| 
 
5256f256edd8
Comment out Weird and Phd until we have an idea how to handle multiple permutations. Transp that works for multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1338 
diff
changeset
 | 
742  | 
fun eetac rule = Subgoal.FOCUS_PARAMS  | 
| 
 
5256f256edd8
Comment out Weird and Phd until we have an idea how to handle multiple permutations. Transp that works for multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1338 
diff
changeset
 | 
743  | 
(fn (focus) =>  | 
| 
 
5256f256edd8
Comment out Weird and Phd until we have an idea how to handle multiple permutations. Transp that works for multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1338 
diff
changeset
 | 
744  | 
let  | 
| 
 
5256f256edd8
Comment out Weird and Phd until we have an idea how to handle multiple permutations. Transp that works for multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1338 
diff
changeset
 | 
745  | 
val concl = #concl focus  | 
| 
 
5256f256edd8
Comment out Weird and Phd until we have an idea how to handle multiple permutations. Transp that works for multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1338 
diff
changeset
 | 
746  | 
val prems = Logic.strip_imp_prems (term_of concl)  | 
| 
 
5256f256edd8
Comment out Weird and Phd until we have an idea how to handle multiple permutations. Transp that works for multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1338 
diff
changeset
 | 
747  | 
val exs = filter (fn x => is_ex (HOLogic.dest_Trueprop x)) prems  | 
| 
 
5256f256edd8
Comment out Weird and Phd until we have an idea how to handle multiple permutations. Transp that works for multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1338 
diff
changeset
 | 
748  | 
val cexs = map (SOME o (cterm_of (ProofContext.theory_of (#context focus)))) exs  | 
| 
 
5256f256edd8
Comment out Weird and Phd until we have an idea how to handle multiple permutations. Transp that works for multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1338 
diff
changeset
 | 
749  | 
val thins = map (fn cex => Drule.instantiate' [] [cex] Drule.thin_rl) cexs  | 
| 
 
5256f256edd8
Comment out Weird and Phd until we have an idea how to handle multiple permutations. Transp that works for multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1338 
diff
changeset
 | 
750  | 
in  | 
| 
 
5256f256edd8
Comment out Weird and Phd until we have an idea how to handle multiple permutations. Transp that works for multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1338 
diff
changeset
 | 
751  | 
(etac rule THEN' RANGE[  | 
| 
 
5256f256edd8
Comment out Weird and Phd until we have an idea how to handle multiple permutations. Transp that works for multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1338 
diff
changeset
 | 
752  | 
atac,  | 
| 
 
5256f256edd8
Comment out Weird and Phd until we have an idea how to handle multiple permutations. Transp that works for multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1338 
diff
changeset
 | 
753  | 
eresolve_tac thins  | 
| 
 
5256f256edd8
Comment out Weird and Phd until we have an idea how to handle multiple permutations. Transp that works for multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1338 
diff
changeset
 | 
754  | 
]) 1  | 
| 
 
5256f256edd8
Comment out Weird and Phd until we have an idea how to handle multiple permutations. Transp that works for multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1338 
diff
changeset
 | 
755  | 
end  | 
| 
 
5256f256edd8
Comment out Weird and Phd until we have an idea how to handle multiple permutations. Transp that works for multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1338 
diff
changeset
 | 
756  | 
)  | 
| 
 
5256f256edd8
Comment out Weird and Phd until we have an idea how to handle multiple permutations. Transp that works for multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1338 
diff
changeset
 | 
757  | 
*}  | 
| 
 
5256f256edd8
Comment out Weird and Phd until we have an idea how to handle multiple permutations. Transp that works for multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1338 
diff
changeset
 | 
758  | 
|
| 
 
5256f256edd8
Comment out Weird and Phd until we have an idea how to handle multiple permutations. Transp that works for multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1338 
diff
changeset
 | 
759  | 
ML {*
 | 
| 
1217
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
760  | 
fun transp_tac ctxt induct alpha_inj term_inj distinct cases eqvt =  | 
| 
1339
 
5256f256edd8
Comment out Weird and Phd until we have an idea how to handle multiple permutations. Transp that works for multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1338 
diff
changeset
 | 
761  | 
ind_tac induct THEN_ALL_NEW  | 
| 
1217
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
762  | 
(TRY o rtac allI THEN' imp_elim_tac cases ctxt) THEN_ALL_NEW  | 
| 
1339
 
5256f256edd8
Comment out Weird and Phd until we have an idea how to handle multiple permutations. Transp that works for multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1338 
diff
changeset
 | 
763  | 
asm_full_simp_tac ((mk_minimal_ss ctxt) addsimps alpha_inj) THEN_ALL_NEW  | 
| 
 
5256f256edd8
Comment out Weird and Phd until we have an idea how to handle multiple permutations. Transp that works for multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1338 
diff
changeset
 | 
764  | 
  split_conjs THEN_ALL_NEW REPEAT o (eetac @{thm exi_sum} ctxt) THEN_ALL_NEW split_conjs
 | 
| 
 
5256f256edd8
Comment out Weird and Phd until we have an idea how to handle multiple permutations. Transp that works for multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1338 
diff
changeset
 | 
765  | 
THEN_ALL_NEW (asm_full_simp_tac (HOL_ss addsimps (term_inj @ distinct)))  | 
| 
 
5256f256edd8
Comment out Weird and Phd until we have an idea how to handle multiple permutations. Transp that works for multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1338 
diff
changeset
 | 
766  | 
THEN_ALL_NEW split_conjs THEN_ALL_NEW  | 
| 
 
5256f256edd8
Comment out Weird and Phd until we have an idea how to handle multiple permutations. Transp that works for multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1338 
diff
changeset
 | 
767  | 
  TRY o (etac @{thm alpha_gen_compose_trans} THEN' RANGE[atac]) THEN_ALL_NEW
 | 
| 
 
5256f256edd8
Comment out Weird and Phd until we have an idea how to handle multiple permutations. Transp that works for multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1338 
diff
changeset
 | 
768  | 
(asm_full_simp_tac (HOL_ss addsimps (all_eqvts ctxt @ eqvt @ term_inj @ distinct)))  | 
| 
1213
 
43bd70786f9f
More equivp infrastructure.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1209 
diff
changeset
 | 
769  | 
*}  | 
| 
 
43bd70786f9f
More equivp infrastructure.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1209 
diff
changeset
 | 
770  | 
|
| 
1215
 
aec9576b3950
Testing auto equivp code.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1214 
diff
changeset
 | 
771  | 
lemma transp_aux:  | 
| 
 
aec9576b3950
Testing auto equivp code.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1214 
diff
changeset
 | 
772  | 
"(\<And>xa ya. R xa ya \<longrightarrow> (\<forall>z. R ya z \<longrightarrow> R xa z)) \<Longrightarrow> transp R"  | 
| 
 
aec9576b3950
Testing auto equivp code.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1214 
diff
changeset
 | 
773  | 
unfolding transp_def  | 
| 
 
aec9576b3950
Testing auto equivp code.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1214 
diff
changeset
 | 
774  | 
by blast  | 
| 
 
aec9576b3950
Testing auto equivp code.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1214 
diff
changeset
 | 
775  | 
|
| 
 
aec9576b3950
Testing auto equivp code.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1214 
diff
changeset
 | 
776  | 
ML {*
 | 
| 
 
aec9576b3950
Testing auto equivp code.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1214 
diff
changeset
 | 
777  | 
fun equivp_tac reflps symps transps =  | 
| 
 
aec9576b3950
Testing auto equivp code.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1214 
diff
changeset
 | 
778  | 
  simp_tac (HOL_ss addsimps @{thms equivp_reflp_symp_transp reflp_def symp_def})
 | 
| 1221 | 779  | 
THEN' rtac conjI THEN' rtac allI THEN'  | 
| 
1215
 
aec9576b3950
Testing auto equivp code.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1214 
diff
changeset
 | 
780  | 
resolve_tac reflps THEN'  | 
| 1221 | 781  | 
rtac conjI THEN' rtac allI THEN' rtac allI THEN'  | 
| 
1215
 
aec9576b3950
Testing auto equivp code.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1214 
diff
changeset
 | 
782  | 
resolve_tac symps THEN'  | 
| 
 
aec9576b3950
Testing auto equivp code.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1214 
diff
changeset
 | 
783  | 
  rtac @{thm transp_aux} THEN' resolve_tac transps
 | 
| 
 
aec9576b3950
Testing auto equivp code.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1214 
diff
changeset
 | 
784  | 
*}  | 
| 
 
aec9576b3950
Testing auto equivp code.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1214 
diff
changeset
 | 
785  | 
|
| 
1213
 
43bd70786f9f
More equivp infrastructure.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1209 
diff
changeset
 | 
786  | 
ML {*
 | 
| 
1214
 
0f92257edeee
A tactic for final equivp
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1213 
diff
changeset
 | 
787  | 
fun build_equivps alphas term_induct alpha_induct term_inj alpha_inj distinct cases eqvt ctxt =  | 
| 
1213
 
43bd70786f9f
More equivp infrastructure.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1209 
diff
changeset
 | 
788  | 
let  | 
| 
1214
 
0f92257edeee
A tactic for final equivp
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1213 
diff
changeset
 | 
789  | 
val ([x, y, z], ctxt') = Variable.variant_fixes ["x","y","z"] ctxt;  | 
| 
 
0f92257edeee
A tactic for final equivp
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1213 
diff
changeset
 | 
790  | 
val (reflg, (symg, transg)) = build_alpha_refl_gl alphas (x, y, z)  | 
| 
1333
 
c6e521a2a0b1
reflp for multiple quantifiers.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1325 
diff
changeset
 | 
791  | 
fun reflp_tac' _ = reflp_tac term_induct alpha_inj ctxt 1;  | 
| 
1334
 
80441e27dfd6
Code for solving symp goals with multiple existentials.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1333 
diff
changeset
 | 
792  | 
fun symp_tac' _ = symp_tac alpha_induct alpha_inj eqvt ctxt 1;  | 
| 
1217
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
793  | 
fun transp_tac' _ = transp_tac ctxt alpha_induct alpha_inj term_inj distinct cases eqvt 1;  | 
| 
1214
 
0f92257edeee
A tactic for final equivp
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1213 
diff
changeset
 | 
794  | 
val reflt = Goal.prove ctxt' [] [] reflg reflp_tac';  | 
| 
 
0f92257edeee
A tactic for final equivp
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1213 
diff
changeset
 | 
795  | 
val symt = Goal.prove ctxt' [] [] symg symp_tac';  | 
| 
 
0f92257edeee
A tactic for final equivp
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1213 
diff
changeset
 | 
796  | 
val transt = Goal.prove ctxt' [] [] transg transp_tac';  | 
| 
 
0f92257edeee
A tactic for final equivp
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1213 
diff
changeset
 | 
797  | 
val [refltg, symtg, transtg] = Variable.export ctxt' ctxt [reflt, symt, transt]  | 
| 
1215
 
aec9576b3950
Testing auto equivp code.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1214 
diff
changeset
 | 
798  | 
val reflts = HOLogic.conj_elims refltg  | 
| 
 
aec9576b3950
Testing auto equivp code.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1214 
diff
changeset
 | 
799  | 
val symts = HOLogic.conj_elims symtg  | 
| 
 
aec9576b3950
Testing auto equivp code.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1214 
diff
changeset
 | 
800  | 
val transts = HOLogic.conj_elims transtg  | 
| 
1214
 
0f92257edeee
A tactic for final equivp
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1213 
diff
changeset
 | 
801  | 
fun equivp alpha =  | 
| 
 
0f92257edeee
A tactic for final equivp
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1213 
diff
changeset
 | 
802  | 
let  | 
| 
1215
 
aec9576b3950
Testing auto equivp code.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1214 
diff
changeset
 | 
803  | 
      val equivp = Const (@{const_name equivp}, fastype_of alpha --> @{typ bool})
 | 
| 
 
aec9576b3950
Testing auto equivp code.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1214 
diff
changeset
 | 
804  | 
      val goal = @{term Trueprop} $ (equivp $ alpha)
 | 
| 
 
aec9576b3950
Testing auto equivp code.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1214 
diff
changeset
 | 
805  | 
fun tac _ = equivp_tac reflts symts transts 1  | 
| 
 
aec9576b3950
Testing auto equivp code.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1214 
diff
changeset
 | 
806  | 
in  | 
| 
 
aec9576b3950
Testing auto equivp code.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1214 
diff
changeset
 | 
807  | 
Goal.prove ctxt [] [] goal tac  | 
| 
 
aec9576b3950
Testing auto equivp code.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1214 
diff
changeset
 | 
808  | 
end  | 
| 
1213
 
43bd70786f9f
More equivp infrastructure.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1209 
diff
changeset
 | 
809  | 
in  | 
| 
1215
 
aec9576b3950
Testing auto equivp code.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1214 
diff
changeset
 | 
810  | 
map equivp alphas  | 
| 
1213
 
43bd70786f9f
More equivp infrastructure.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1209 
diff
changeset
 | 
811  | 
end  | 
| 
 
43bd70786f9f
More equivp infrastructure.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1209 
diff
changeset
 | 
812  | 
*}  | 
| 1207 | 813  | 
|
| 
1217
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
814  | 
(*  | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
815  | 
Tests:  | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
816  | 
prove alpha1_reflp_aux: {* fst (build_alpha_refl_gl [@{term alpha_rtrm1}, @{term alpha_bp}] ("x","y","z")) *}
 | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
817  | 
by (tactic {* reflp_tac @{thm rtrm1_bp.induct} @{thms alpha1_inj} 1 *})
 | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
818  | 
|
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
819  | 
prove alpha1_symp_aux: {* (fst o snd) (build_alpha_refl_gl [@{term alpha_rtrm1}, @{term alpha_bp}] ("x","y","z")) *}
 | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
820  | 
by (tactic {* symp_tac @{thm alpha_rtrm1_alpha_bp.induct} @{thms alpha1_inj} @{thms alpha1_eqvt} 1 *})
 | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
821  | 
|
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
822  | 
prove alpha1_transp_aux: {* (snd o snd) (build_alpha_refl_gl [@{term alpha_rtrm1}, @{term alpha_bp}] ("x","y","z")) *}
 | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
823  | 
by (tactic {* transp_tac @{context} @{thm alpha_rtrm1_alpha_bp.induct} @{thms alpha1_inj} @{thms rtrm1.inject bp.inject} @{thms rtrm1.distinct bp.distinct} @{thms alpha_rtrm1.cases alpha_bp.cases} @{thms alpha1_eqvt} 1 *})
 | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
824  | 
|
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
825  | 
lemma alpha1_equivp:  | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
826  | 
"equivp alpha_rtrm1"  | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
827  | 
"equivp alpha_bp"  | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
828  | 
apply (tactic {*
 | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
829  | 
  (simp_tac (HOL_ss addsimps @{thms equivp_reflp_symp_transp reflp_def symp_def})
 | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
830  | 
  THEN' rtac @{thm conjI} THEN' rtac @{thm allI} THEN'
 | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
831  | 
  resolve_tac (HOLogic.conj_elims @{thm alpha1_reflp_aux})
 | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
832  | 
  THEN' rtac @{thm conjI} THEN' rtac @{thm allI} THEN' rtac @{thm allI} THEN'
 | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
833  | 
  resolve_tac (HOLogic.conj_elims @{thm alpha1_symp_aux}) THEN' rtac @{thm transp_aux}
 | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
834  | 
  THEN' resolve_tac (HOLogic.conj_elims @{thm alpha1_transp_aux})
 | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
835  | 
)  | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
836  | 
1 *})  | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
837  | 
done*)  | 
| 
 
74e2b9b95add
Fixes for auxiliary datatypes.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1216 
diff
changeset
 | 
838  | 
|
| 
1308
 
80dabcaafc38
Moving wrappers out of Lift.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1303 
diff
changeset
 | 
839  | 
ML {*
 | 
| 
 
80dabcaafc38
Moving wrappers out of Lift.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1303 
diff
changeset
 | 
840  | 
fun dtyp_no_of_typ _ (TFree (n, _)) = error "dtyp_no_of_typ: Illegal free"  | 
| 
 
80dabcaafc38
Moving wrappers out of Lift.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1303 
diff
changeset
 | 
841  | 
| dtyp_no_of_typ _ (TVar _) = error "dtyp_no_of_typ: Illegal schematic"  | 
| 
 
80dabcaafc38
Moving wrappers out of Lift.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1303 
diff
changeset
 | 
842  | 
| dtyp_no_of_typ dts (Type (tname, Ts)) =  | 
| 
 
80dabcaafc38
Moving wrappers out of Lift.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1303 
diff
changeset
 | 
843  | 
case try (find_index (curry op = tname o fst)) dts of  | 
| 
 
80dabcaafc38
Moving wrappers out of Lift.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1303 
diff
changeset
 | 
844  | 
NONE => error "dtyp_no_of_typ: Illegal recursion"  | 
| 
 
80dabcaafc38
Moving wrappers out of Lift.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1303 
diff
changeset
 | 
845  | 
| SOME i => i  | 
| 
 
80dabcaafc38
Moving wrappers out of Lift.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1303 
diff
changeset
 | 
846  | 
*}  | 
| 
 
80dabcaafc38
Moving wrappers out of Lift.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1303 
diff
changeset
 | 
847  | 
|
| 
1427
 
b355cab42841
mk_supports_eq and supports_tac.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1422 
diff
changeset
 | 
848  | 
lemma not_in_union: "c \<notin> a \<union> b \<equiv> (c \<notin> a \<and> c \<notin> b)"  | 
| 
 
b355cab42841
mk_supports_eq and supports_tac.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1422 
diff
changeset
 | 
849  | 
by auto  | 
| 
 
b355cab42841
mk_supports_eq and supports_tac.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1422 
diff
changeset
 | 
850  | 
|
| 
 
b355cab42841
mk_supports_eq and supports_tac.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1422 
diff
changeset
 | 
851  | 
ML {*
 | 
| 
 
b355cab42841
mk_supports_eq and supports_tac.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1422 
diff
changeset
 | 
852  | 
fun supports_tac perm =  | 
| 
 
b355cab42841
mk_supports_eq and supports_tac.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1422 
diff
changeset
 | 
853  | 
  simp_tac (HOL_ss addsimps @{thms supports_def not_in_union} @ perm) THEN_ALL_NEW (
 | 
| 
 
b355cab42841
mk_supports_eq and supports_tac.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1422 
diff
changeset
 | 
854  | 
REPEAT o rtac allI THEN' REPEAT o rtac impI THEN' split_conjs THEN'  | 
| 
 
b355cab42841
mk_supports_eq and supports_tac.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1422 
diff
changeset
 | 
855  | 
    asm_full_simp_tac (HOL_ss addsimps @{thms fresh_def[symmetric]
 | 
| 
1534
 
984ea1299cd7
The nominal infrastructure for fset. 'fs' missing, but not needed so far.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1516 
diff
changeset
 | 
856  | 
swap_fresh_fresh fresh_atom swap_at_base_simps(3) swap_atom_image_fresh  | 
| 
 
984ea1299cd7
The nominal infrastructure for fset. 'fs' missing, but not needed so far.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1516 
diff
changeset
 | 
857  | 
supp_fset_to_set supp_fmap_atom}))  | 
| 
1427
 
b355cab42841
mk_supports_eq and supports_tac.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1422 
diff
changeset
 | 
858  | 
*}  | 
| 
 
b355cab42841
mk_supports_eq and supports_tac.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1422 
diff
changeset
 | 
859  | 
|
| 
 
b355cab42841
mk_supports_eq and supports_tac.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1422 
diff
changeset
 | 
860  | 
ML {*
 | 
| 
1428
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
861  | 
fun mk_supp ty x =  | 
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
862  | 
  Const (@{const_name supp}, ty --> @{typ "atom set"}) $ x
 | 
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
863  | 
*}  | 
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
864  | 
|
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
865  | 
ML {*
 | 
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
866  | 
fun mk_supports_eq thy cnstr =  | 
| 
1427
 
b355cab42841
mk_supports_eq and supports_tac.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1422 
diff
changeset
 | 
867  | 
let  | 
| 
 
b355cab42841
mk_supports_eq and supports_tac.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1422 
diff
changeset
 | 
868  | 
val (tys, ty) = (strip_type o fastype_of) cnstr  | 
| 
 
b355cab42841
mk_supports_eq and supports_tac.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1422 
diff
changeset
 | 
869  | 
val names = Datatype_Prop.make_tnames tys  | 
| 
 
b355cab42841
mk_supports_eq and supports_tac.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1422 
diff
changeset
 | 
870  | 
val frees = map Free (names ~~ tys)  | 
| 
 
b355cab42841
mk_supports_eq and supports_tac.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1422 
diff
changeset
 | 
871  | 
val rhs = list_comb (cnstr, frees)  | 
| 
1428
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
872  | 
|
| 
1427
 
b355cab42841
mk_supports_eq and supports_tac.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1422 
diff
changeset
 | 
873  | 
fun mk_supp_arg (x, ty) =  | 
| 
1428
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
874  | 
    if is_atom thy ty then mk_supp @{typ atom} (mk_atom ty $ x) else
 | 
| 
1534
 
984ea1299cd7
The nominal infrastructure for fset. 'fs' missing, but not needed so far.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1516 
diff
changeset
 | 
875  | 
    if is_atom_set thy ty then mk_supp @{typ "atom set"} (mk_atom_set x) else
 | 
| 
 
984ea1299cd7
The nominal infrastructure for fset. 'fs' missing, but not needed so far.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1516 
diff
changeset
 | 
876  | 
    if is_atom_fset thy ty then mk_supp @{typ "atom set"} (mk_atom_fset x)
 | 
| 
1427
 
b355cab42841
mk_supports_eq and supports_tac.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1422 
diff
changeset
 | 
877  | 
else mk_supp ty x  | 
| 
 
b355cab42841
mk_supports_eq and supports_tac.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1422 
diff
changeset
 | 
878  | 
val lhss = map mk_supp_arg (frees ~~ tys)  | 
| 
 
b355cab42841
mk_supports_eq and supports_tac.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1422 
diff
changeset
 | 
879  | 
  val supports = Const(@{const_name "supports"}, @{typ "atom set"} --> ty --> @{typ bool})
 | 
| 
 
b355cab42841
mk_supports_eq and supports_tac.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1422 
diff
changeset
 | 
880  | 
val eq = HOLogic.mk_Trueprop (supports $ mk_union lhss $ rhs)  | 
| 
 
b355cab42841
mk_supports_eq and supports_tac.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1422 
diff
changeset
 | 
881  | 
in  | 
| 
 
b355cab42841
mk_supports_eq and supports_tac.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1422 
diff
changeset
 | 
882  | 
(names, eq)  | 
| 
1422
 
a26cb19375e8
Remove "_raw" from lifted theorems.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1415 
diff
changeset
 | 
883  | 
end  | 
| 
1427
 
b355cab42841
mk_supports_eq and supports_tac.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1422 
diff
changeset
 | 
884  | 
*}  | 
| 
 
b355cab42841
mk_supports_eq and supports_tac.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1422 
diff
changeset
 | 
885  | 
|
| 
1428
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
886  | 
ML {*
 | 
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
887  | 
fun prove_supports ctxt perms cnst =  | 
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
888  | 
let  | 
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
889  | 
val (names, eq) = mk_supports_eq (ProofContext.theory_of ctxt) cnst  | 
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
890  | 
in  | 
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
891  | 
Goal.prove ctxt names [] eq (fn _ => supports_tac perms 1)  | 
| 
1427
 
b355cab42841
mk_supports_eq and supports_tac.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1422 
diff
changeset
 | 
892  | 
end  | 
| 
1428
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
893  | 
*}  | 
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
894  | 
|
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
895  | 
ML {*
 | 
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
896  | 
fun mk_fs tys =  | 
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
897  | 
let  | 
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
898  | 
val names = Datatype_Prop.make_tnames tys  | 
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
899  | 
val frees = map Free (names ~~ tys)  | 
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
900  | 
val supps = map2 mk_supp tys frees  | 
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
901  | 
  val fin_supps = map (fn x => @{term "finite :: atom set \<Rightarrow> bool"} $ x) supps
 | 
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
902  | 
in  | 
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
903  | 
(names, HOLogic.mk_Trueprop (mk_conjl fin_supps))  | 
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
904  | 
end  | 
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
905  | 
*}  | 
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
906  | 
|
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
907  | 
ML {*
 | 
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
908  | 
fun fs_tac induct supports = ind_tac induct THEN_ALL_NEW (  | 
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
909  | 
  rtac @{thm supports_finite} THEN' resolve_tac supports) THEN_ALL_NEW
 | 
| 
1534
 
984ea1299cd7
The nominal infrastructure for fset. 'fs' missing, but not needed so far.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1516 
diff
changeset
 | 
910  | 
  asm_full_simp_tac (HOL_ss addsimps @{thms supp_atom supp_atom_image supp_fset_to_set
 | 
| 
 
984ea1299cd7
The nominal infrastructure for fset. 'fs' missing, but not needed so far.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1516 
diff
changeset
 | 
911  | 
supp_fmap_atom finite_insert finite.emptyI finite_Un})  | 
| 
1428
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
912  | 
*}  | 
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
913  | 
|
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
914  | 
ML {*
 | 
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
915  | 
fun prove_fs ctxt induct supports tys =  | 
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
916  | 
let  | 
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
917  | 
val (names, eq) = mk_fs tys  | 
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
918  | 
in  | 
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
919  | 
Goal.prove ctxt names [] eq (fn _ => fs_tac induct supports 1)  | 
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
920  | 
end  | 
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
921  | 
*}  | 
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
922  | 
|
| 
 
4029105011ca
Show that the new types are in finite support typeclass.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
1427 
diff
changeset
 | 
923  | 
end  |