changeset 1737 | 8b6a285ad480 |
parent 1736 | ba66fa116e05 |
child 1739 | 468c3c1adcba |
1736:ba66fa116e05 | 1737:8b6a285ad480 |
---|---|
576 as long as it is finitely supported) and also @{text "p"} does not affect anything |
576 as long as it is finitely supported) and also @{text "p"} does not affect anything |
577 in the support of @{text x} (that is @{term "supp x \<sharp>* p"}). The last |
577 in the support of @{text x} (that is @{term "supp x \<sharp>* p"}). The last |
578 fact and Property~\ref{supppermeq} allow us to ``rename'' just the binders |
578 fact and Property~\ref{supppermeq} allow us to ``rename'' just the binders |
579 @{text as} in @{text x}, because @{term "p \<bullet> x = x"}. |
579 @{text as} in @{text x}, because @{term "p \<bullet> x = x"}. |
580 |
580 |
581 All properties given in this section are formalised in Isabelle/HOL and |
581 Most properties given in this section are described in \cite{HuffmanUrban10} |
582 most of proofs are described in \cite{HuffmanUrban10} to which we refer the |
582 and of course all are formalised in Isabelle/HOL. In the next sections we will make |
583 reader. In the next sections we will make extensively use of these |
583 extensively use of these properties in order to define alpha-equivalence in |
584 properties in order to define alpha-equivalence in the presence of multiple |
584 the presence of multiple binders. |
585 binders. |
|
586 *} |
585 *} |
587 |
586 |
588 |
587 |
589 section {* General Binders\label{sec:binders} *} |
588 section {* General Binders\label{sec:binders} *} |
590 |
589 |
765 \end{center} |
764 \end{center} |
766 |
765 |
767 \noindent |
766 \noindent |
768 indicating that a set (or list) @{text as} is abstracted in @{text x}. We will |
767 indicating that a set (or list) @{text as} is abstracted in @{text x}. We will |
769 call the types \emph{abstraction types} and their elements |
768 call the types \emph{abstraction types} and their elements |
770 \emph{abstractions}. The important property we need to derive is what the |
769 \emph{abstractions}. The important property we need to derive the support of |
771 support of abstractions is, namely: |
770 abstractions, namely: |
772 |
771 |
773 \begin{thm}[Support of Abstractions]\label{suppabs} |
772 \begin{thm}[Support of Abstractions]\label{suppabs} |
774 Assuming @{text x} has finite support, then\\[-6mm] |
773 Assuming @{text x} has finite support, then\\[-6mm] |
775 \begin{center} |
774 \begin{center} |
776 \begin{tabular}{l@ {\hspace{2mm}}c@ {\hspace{2mm}}l} |
775 \begin{tabular}{l@ {\hspace{2mm}}c@ {\hspace{2mm}}l} |
823 |
822 |
824 \noindent |
823 \noindent |
825 which by Property~\ref{supportsprop} gives us ``one half'' of |
824 which by Property~\ref{supportsprop} gives us ``one half'' of |
826 Thm~\ref{suppabs}. The ``other half'' is a bit more involved. To establish |
825 Thm~\ref{suppabs}. The ``other half'' is a bit more involved. To establish |
827 it, we use a trick from \cite{Pitts04} and first define an auxiliary |
826 it, we use a trick from \cite{Pitts04} and first define an auxiliary |
828 function taking an abstraction as argument: |
827 function @{text aux}, taking an abstraction as argument: |
829 % |
828 % |
830 \begin{center} |
829 \begin{center} |
831 @{thm supp_gen.simps[THEN eq_reflection, no_vars]} |
830 @{thm supp_gen.simps[THEN eq_reflection, no_vars]} |
832 \end{center} |
831 \end{center} |
833 |
832 |
848 \begin{equation}\label{halftwo} |
847 \begin{equation}\label{halftwo} |
849 @{thm (concl) supp_abs_subset1(1)[no_vars]} |
848 @{thm (concl) supp_abs_subset1(1)[no_vars]} |
850 \end{equation} |
849 \end{equation} |
851 |
850 |
852 \noindent |
851 \noindent |
853 since for finite sets, @{text "S"}, we have @{thm (concl) supp_finite_atom_set[no_vars]}. |
852 since for finite sets of atoms, @{text "bs"}, we have |
854 |
853 @{thm (concl) supp_finite_atom_set[where S="bs", no_vars]}. |
855 Finally, taking \eqref{halfone} and \eqref{halftwo} together establishes of |
854 Finally, taking \eqref{halfone} and \eqref{halftwo} together establishes |
856 Theorem~\ref{suppabs}. The method of first considering abstractions of the |
855 Theorem~\ref{suppabs}. |
856 |
|
857 The method of first considering abstractions of the |
|
857 form @{term "Abs as x"} etc is motivated by the fact that properties about them |
858 form @{term "Abs as x"} etc is motivated by the fact that properties about them |
858 can be conveninetly established at the Isabelle/HOL level. It would be |
859 can be conveninetly established at the Isabelle/HOL level. It would be |
859 difficult to write custom ML-code that derives automatically such properties |
860 difficult to write custom ML-code that derives automatically such properties |
860 for every term-constructor that binds some atoms. Also the generality of |
861 for every term-constructor that binds some atoms. Also the generality of |
861 the definitions for alpha-equivalence will also help us in the next section. |
862 the definitions for alpha-equivalence will help us in the next section. |
862 *} |
863 *} |
863 |
864 |
864 section {* Alpha-Equivalence and Free Variables\label{sec:alpha} *} |
865 section {* Alpha-Equivalence and Free Variables\label{sec:alpha} *} |
865 |
866 |
866 text {* |
867 text {* |
904 \begin{center} |
905 \begin{center} |
905 @{text "C\<^sup>\<alpha> label\<^isub>1::ty"}$'_1$ @{text "\<dots> label\<^isub>l::ty"}$'_l\;\;$ @{text "binding_clauses"} |
906 @{text "C\<^sup>\<alpha> label\<^isub>1::ty"}$'_1$ @{text "\<dots> label\<^isub>l::ty"}$'_l\;\;$ @{text "binding_clauses"} |
906 \end{center} |
907 \end{center} |
907 |
908 |
908 \noindent |
909 \noindent |
909 whereby some of the @{text ty}$'_{1..l}$ (or their components) are contained |
910 whereby some of the @{text ty}$'_{1..l}$ (or their components) might be contained |
910 in the collection of @{text ty}$^\alpha_{1..n}$ declared in |
911 in the collection of @{text ty}$^\alpha_{1..n}$ declared in |
911 \eqref{scheme}. In this case we will call the corresponding argument a |
912 \eqref{scheme}. |
912 \emph{recursive argument} of @{text "C\<^sup>\<alpha>"}. There are ``positivity'' |
913 %In this case we will call the corresponding argument a |
913 restrictions imposed in the type of such recursive arguments, which ensure |
914 %\emph{recursive argument} of @{text "C\<^sup>\<alpha>"}. The types of such recursive |
914 that the type has a set-theoretic semantics \cite{Berghofer99}. The labels |
915 %arguments need to satisfy a ``positivity'' |
916 %restriction, which ensures that the type has a set-theoretic semantics |
|
917 %\cite{Berghofer99}. |
|
918 The labels |
|
915 annotated on the types are optional. Their purpose is to be used in the |
919 annotated on the types are optional. Their purpose is to be used in the |
916 (possibly empty) list of \emph{binding clauses}, which indicate the binders |
920 (possibly empty) list of \emph{binding clauses}, which indicate the binders |
917 and their scope in a term-constructor. They come in three \emph{modes}: |
921 and their scope in a term-constructor. They come in three \emph{modes}: |
918 |
922 |
919 \begin{center} |
923 \begin{center} |
927 \noindent |
931 \noindent |
928 The first mode is for binding lists of atoms (the order of binders matters); |
932 The first mode is for binding lists of atoms (the order of binders matters); |
929 the second is for sets of binders (the order does not matter, but the |
933 the second is for sets of binders (the order does not matter, but the |
930 cardinality does) and the last is for sets of binders (with vacuous binders |
934 cardinality does) and the last is for sets of binders (with vacuous binders |
931 preserving alpha-equivalence). The ``\isacommand{in}-part'' of a binding |
935 preserving alpha-equivalence). The ``\isacommand{in}-part'' of a binding |
932 clause will be called the \emph{body} of the abstraction; the |
936 clause will be called the \emph{body}; the |
933 ``\isacommand{bind}-part'' will be the \emph{binder} of the binding clause. |
937 ``\isacommand{bind}-part'' will be the \emph{binder}. |
934 |
938 |
935 In addition we distinguish between \emph{shallow} and \emph{deep} |
939 In addition we distinguish between \emph{shallow} and \emph{deep} |
936 binders. Shallow binders are of the form \isacommand{bind}\; {\it label}\; |
940 binders. Shallow binders are of the form \isacommand{bind}\; {\it label}\; |
937 \isacommand{in}\; {\it label'} (similar for the other two modes). The |
941 \isacommand{in}\; {\it label'} (similar for the other two modes). The |
938 restriction we impose on shallow binders is that the {\it label} must either |
942 restriction we impose on shallow binders is that the {\it label} must either |
984 call such binders \emph{recursive}, see below). |
988 call such binders \emph{recursive}, see below). |
985 The corresponding binding functions are expected to return either a set of atoms |
989 The corresponding binding functions are expected to return either a set of atoms |
986 (for \isacommand{bind\_set} and \isacommand{bind\_res}) or a list of atoms |
990 (for \isacommand{bind\_set} and \isacommand{bind\_res}) or a list of atoms |
987 (for \isacommand{bind}). They can be defined by primitive recursion over the |
991 (for \isacommand{bind}). They can be defined by primitive recursion over the |
988 corresponding type; the equations must be given in the binding function part of |
992 corresponding type; the equations must be given in the binding function part of |
989 the scheme shown in \eqref{scheme}. For example a term-calculus containing lets |
993 the scheme shown in \eqref{scheme}. For example a term-calculus containing @{text "Let"}s |
990 with tuple patterns might be specified as: |
994 with tuple patterns might be specified as: |
991 |
995 |
992 \begin{center} |
996 \begin{center} |
993 \begin{tabular}{l} |
997 \begin{tabular}{l} |
994 \isacommand{nominal\_datatype} @{text trm} =\\ |
998 \isacommand{nominal\_datatype} @{text trm} =\\ |
1064 \noindent |
1068 \noindent |
1065 since there is no overlap of binders. |
1069 since there is no overlap of binders. |
1066 |
1070 |
1067 Note that in the last example we wrote {\it\isacommand{bind}\;bn(p)\;\isacommand{in}\;p}. |
1071 Note that in the last example we wrote {\it\isacommand{bind}\;bn(p)\;\isacommand{in}\;p}. |
1068 Whenever such a binding clause is present, we will call the binder \emph{recursive}. |
1072 Whenever such a binding clause is present, we will call the binder \emph{recursive}. |
1069 To see the purpose for such recursive binders, compare ``plain'' @{text "Let"}s and @{text "Let_rec"}s: |
1073 To see the purpose of such recursive binders, compare ``plain'' @{text "Let"}s and @{text "Let_rec"}s |
1074 in the following specification: |
|
1070 % |
1075 % |
1071 \begin{equation}\label{letrecs} |
1076 \begin{equation}\label{letrecs} |
1072 \mbox{% |
1077 \mbox{% |
1073 \begin{tabular}{@ {}l@ {}} |
1078 \begin{tabular}{@ {}l@ {}} |
1074 \isacommand{nominal\_datatype}~@{text "trm ="}\\ |
1079 \isacommand{nominal\_datatype}~@{text "trm ="}\\ |
1159 \end{center} |
1164 \end{center} |
1160 |
1165 |
1161 \noindent |
1166 \noindent |
1162 The reason for this setup is that in a deep binder not all atoms have to be |
1167 The reason for this setup is that in a deep binder not all atoms have to be |
1163 bound, as we shall see in an example below. We need therefore the function |
1168 bound, as we shall see in an example below. We need therefore the function |
1164 that returns us those unbound atoms. |
1169 that calculates those unbound atoms. |
1165 |
1170 |
1166 While the idea behind these |
1171 While the idea behind these |
1167 free-variable functions is clear (they just collect all atoms that are not bound), |
1172 free-variable functions is clear (they just collect all atoms that are not bound), |
1168 because of the rather complicated binding mechanisms their definitions are |
1173 because of the rather complicated binding mechanisms their definitions are |
1169 somewhat involved. |
1174 somewhat involved. |
1170 Given a term-constructor @{text "C"} of type @{text ty} with argument types |
1175 Given a term-constructor @{text "C"} of type @{text ty} with argument types |
1171 \mbox{@{text "ty\<^isub>1 \<dots> ty\<^isub>n"}}, the function |
1176 \mbox{@{text "ty\<^isub>1 \<dots> ty\<^isub>n"}}, the function |
1172 @{text "fv_ty (C x\<^isub>1 \<dots> x\<^isub>n)"} will be the union of the values |
1177 @{text "fv_ty (C x\<^isub>1 \<dots> x\<^isub>n)"} will be the union of the values |
1173 calculated next for each argument. |
1178 calculated below for each argument. |
1174 First we deal with the case that @{text "x\<^isub>i"} is a binder. From the binding clauses, |
1179 First we deal with the case that @{text "x\<^isub>i"} is a binder. From the binding clauses, |
1175 we can determine whether the argument is a shallow or deep |
1180 we can determine whether the argument is a shallow or deep |
1176 binder, and in the latter case also whether it is a recursive or |
1181 binder, and in the latter case also whether it is a recursive or |
1177 non-recursive binder. |
1182 non-recursive binder. |
1178 |
1183 |
1199 whether the @{text "x\<^isub>i"} is the body of one or more binding clauses. |
1204 whether the @{text "x\<^isub>i"} is the body of one or more binding clauses. |
1200 In this case we first calculate the set @{text "bnds"} as follows: |
1205 In this case we first calculate the set @{text "bnds"} as follows: |
1201 either the corresponding binders are all shallow or there is a single deep binder. |
1206 either the corresponding binders are all shallow or there is a single deep binder. |
1202 In the former case we take @{text bnds} to be the union of all shallow |
1207 In the former case we take @{text bnds} to be the union of all shallow |
1203 binders; in the latter case, we just take the set of atoms specified by the |
1208 binders; in the latter case, we just take the set of atoms specified by the |
1204 binding function. The value for @{text "x\<^isub>i"} is then given by: |
1209 corrsponding binding function. The value for @{text "x\<^isub>i"} is then given by: |
1205 |
1210 % |
1206 \begin{equation}\label{deepbody} |
1211 \begin{equation}\label{deepbody} |
1207 \mbox{% |
1212 \mbox{% |
1208 \begin{tabular}{c@ {\hspace{2mm}}p{7cm}} |
1213 \begin{tabular}{c@ {\hspace{2mm}}p{7cm}} |
1209 $\bullet$ & @{text "{atom x\<^isub>i} - bnds"} provided @{term "x\<^isub>i"} is an atom\\ |
1214 $\bullet$ & @{text "{atom x\<^isub>i} - bnds"} provided @{term "x\<^isub>i"} is an atom\\ |
1210 $\bullet$ & @{text "(atoms x\<^isub>i) - bnds"} provided @{term "x\<^isub>i"} is a set of atoms\\ |
1215 $\bullet$ & @{text "(atoms x\<^isub>i) - bnds"} provided @{term "x\<^isub>i"} is a set of atoms\\ |
1216 $\bullet$ & @{term "{}"} otherwise |
1221 $\bullet$ & @{term "{}"} otherwise |
1217 \end{tabular}} |
1222 \end{tabular}} |
1218 \end{equation} |
1223 \end{equation} |
1219 |
1224 |
1220 \noindent |
1225 \noindent |
1221 Like the coercion function @{text atom} used above, @{text "atoms as"} coerces |
1226 Like the coercion function @{text atom} used earlier, @{text "atoms as"} coerces |
1222 the set @{text as} to the generic atom type. |
1227 the set @{text as} to the generic atom type. |
1223 It is defined as @{text "atom as \<equiv> {atom a | a \<in> as}"}. |
1228 It is defined as @{text "atoms as \<equiv> {atom a | a \<in> as}"}. |
1224 |
1229 |
1225 The last case we need to consider is when @{text "x\<^isub>i"} is neither |
1230 The last case we need to consider is when @{text "x\<^isub>i"} is neither |
1226 a binder nor a body of an abstraction. In this case it is defined |
1231 a binder nor a body of an abstraction. In this case it is defined |
1227 as in \eqref{deepbody}, except that we do not need to subtract the |
1232 as in \eqref{deepbody}, except that we do not need to subtract the |
1228 set @{text bnds}. |
1233 set @{text bnds}. |
1229 |
1234 |
1230 Next, we need to define a free-variable function @{text "fv_bn\<^isub>j"} for |
1235 Next, we need to define a free-variable function @{text "fv_bn\<^isub>j"} for |
1231 each binding function @{text "bn\<^isub>j"}. The idea behind this |
1236 each binding function @{text "bn\<^isub>j"}. The idea behind these |
1232 function is to compute the set of free atoms that are not bound by |
1237 functions is to compute the set of free atoms that are not bound by |
1233 @{text "bn\<^isub>j"}. Because of the restrictions we imposed on the |
1238 @{text "bn\<^isub>j"}. Because of the restrictions we imposed on the |
1234 form of binding functions, this can be done automatically by recursively |
1239 form of binding functions, this can be done automatically by recursively |
1235 building up the the set of free variables from the arguments that are |
1240 building up the the set of free variables from the arguments that are |
1236 not bound. Let us assume one clause of the binding function is |
1241 not bound. Let us assume one clause of a binding function is |
1237 @{text "bn\<^isub>j (C x\<^isub>1 \<dots> x\<^isub>n) = rhs"}, then @{text "fv_bn\<^isub>j"} is the |
1242 @{text "bn\<^isub>j (C x\<^isub>1 \<dots> x\<^isub>n) = rhs"}, then @{text "fv_bn\<^isub>j"} is the |
1238 union of the values calculated for @{text "x\<^isub>i"} of type @{text "ty\<^isub>i"} |
1243 union of the values calculated for @{text "x\<^isub>i"} of type @{text "ty\<^isub>i"} |
1239 as follows: |
1244 as follows: |
1240 |
1245 |
1241 \begin{center} |
1246 \begin{center} |
1243 \multicolumn{2}{l}{@{text "x\<^isub>i"} occurs in @{text "rhs"}:}\\ |
1248 \multicolumn{2}{l}{@{text "x\<^isub>i"} occurs in @{text "rhs"}:}\\ |
1244 $\bullet$ & @{term "{}"} provided @{term "x\<^isub>i"} is a single atom, |
1249 $\bullet$ & @{term "{}"} provided @{term "x\<^isub>i"} is a single atom, |
1245 atom list or atom set\\ |
1250 atom list or atom set\\ |
1246 $\bullet$ & @{text "fv_bn x\<^isub>i"} in case @{text "rhs"} contains the |
1251 $\bullet$ & @{text "fv_bn x\<^isub>i"} in case @{text "rhs"} contains the |
1247 recursive call @{text "bn x\<^isub>i"}\medskip\\ |
1252 recursive call @{text "bn x\<^isub>i"}\medskip\\ |
1248 % |
1253 \end{tabular} |
1254 \end{center} |
|
1255 |
|
1256 \begin{center} |
|
1257 \begin{tabular}{c@ {\hspace{2mm}}p{7cm}} |
|
1249 \multicolumn{2}{l}{@{text "x\<^isub>i"} does not occur in @{text "rhs"}:}\\ |
1258 \multicolumn{2}{l}{@{text "x\<^isub>i"} does not occur in @{text "rhs"}:}\\ |
1250 $\bullet$ & @{text "atom x\<^isub>i"} provided @{term "x\<^isub>i"} is an atom\\ |
1259 $\bullet$ & @{text "atom x\<^isub>i"} provided @{term "x\<^isub>i"} is an atom\\ |
1251 $\bullet$ & @{text "atoms x\<^isub>i"} provided @{term "x\<^isub>i"} is a set of atoms\\ |
1260 $\bullet$ & @{text "atoms x\<^isub>i"} provided @{term "x\<^isub>i"} is a set of atoms\\ |
1252 $\bullet$ & @{term "atoms (set x\<^isub>i)"} provided @{term "x\<^isub>i"} is a list of atoms\\ |
1261 $\bullet$ & @{term "atoms (set x\<^isub>i)"} provided @{term "x\<^isub>i"} is a list of atoms\\ |
1253 $\bullet$ & @{text "fv_ty\<^isub>i x\<^isub>i"} provided @{term "ty\<^isub>i"} is one of the raw |
1262 $\bullet$ & @{text "fv_ty\<^isub>i x\<^isub>i"} provided @{term "ty\<^isub>i"} is one of the raw |
1258 \end{tabular} |
1267 \end{tabular} |
1259 \end{center} |
1268 \end{center} |
1260 |
1269 |
1261 \noindent |
1270 \noindent |
1262 To see how these definitions work in practise, let us reconsider the term-constructors |
1271 To see how these definitions work in practise, let us reconsider the term-constructors |
1263 @{text "Let"} and @{text "Let_rec"} from example shown in \eqref{letrecs}. |
1272 @{text "Let"} and @{text "Let_rec"} from the example shown in \eqref{letrecs}. |
1264 For this specification we need to define three functions, namely |
1273 For this specification we need to define three free-variable functions, namely |
1265 @{text "fv\<^bsub>trm\<^esub>"}, @{text "fv\<^bsub>assn\<^esub>"} and @{text "fv\<^bsub>bn\<^esub>"}. They are as follows: |
1274 @{text "fv\<^bsub>trm\<^esub>"}, @{text "fv\<^bsub>assn\<^esub>"} and @{text "fv\<^bsub>bn\<^esub>"}. They are as follows: |
1266 % |
1275 % |
1267 \begin{center} |
1276 \begin{center} |
1268 \begin{tabular}{@ {}l@ {\hspace{1mm}}c@ {\hspace{1mm}}l@ {}} |
1277 \begin{tabular}{@ {}l@ {\hspace{1mm}}c@ {\hspace{1mm}}l@ {}} |
1269 @{text "fv\<^bsub>trm\<^esub> (Let as t)"} & @{text "="} & @{text "fv\<^bsub>bn\<^esub> as \<union> (fv\<^bsub>trm\<^esub> t - set (bn as))"}\\ |
1278 @{text "fv\<^bsub>trm\<^esub> (Let as t)"} & @{text "="} & @{text "fv\<^bsub>bn\<^esub> as \<union> (fv\<^bsub>trm\<^esub> t - set (bn as))"}\\ |
1291 recursive binder where we want to also bind all occurences of the atoms |
1300 recursive binder where we want to also bind all occurences of the atoms |
1292 @{text "bn as"} inside @{text "as"}. Therefore we have to subtract @{text |
1301 @{text "bn as"} inside @{text "as"}. Therefore we have to subtract @{text |
1293 "set (bn as)"} from @{text "fv\<^bsub>assn\<^esub> as"}, as well as from |
1302 "set (bn as)"} from @{text "fv\<^bsub>assn\<^esub> as"}, as well as from |
1294 @{text "fv\<^bsub>trm\<^esub> t"}. An interesting point in this example is |
1303 @{text "fv\<^bsub>trm\<^esub> t"}. An interesting point in this example is |
1295 that an assignment ``alone'' does not have any bound variables. Only in the |
1304 that an assignment ``alone'' does not have any bound variables. Only in the |
1296 context of a @{text Let} or @{text "Let_rec"} will some atoms become bound |
1305 context of a @{text Let} or @{text "Let_rec"} will some atoms become bound. |
1297 (the term-constructors that have binding clauses). This is a phenomenon |
1306 This is a phenomenon |
1298 that has also been pointed out in \cite{ott-jfp}. We can also see that |
1307 that has also been pointed out in \cite{ott-jfp}. We can also see that |
1299 given a @{text "bn"}-function for a type @{text "ty"}, then we have |
1308 given a @{text "bn"}-function for a type @{text "ty"}, we have that |
1300 % |
1309 % |
1301 \begin{equation}\label{bnprop} |
1310 \begin{equation}\label{bnprop} |
1302 @{text "fv_ty x = bn x \<union> fv_bn x"}. |
1311 @{text "fv_ty x = bn x \<union> fv_bn x"}. |
1303 \end{equation} |
1312 \end{equation} |
1304 |
1313 |
1305 Next we define alpha-equivalence for the types @{text "ty\<^isub>1, \<dots>, ty\<^isub>n"}. We call them |
1314 Next we define alpha-equivalence for the types @{text "ty\<^isub>1, \<dots>, ty\<^isub>n"}. We call them |
1306 @{text "\<approx>ty\<^isub>1, \<dots>, \<approx>ty\<^isub>n"}. Like with the free-variable functions, |
1315 @{text "\<approx>ty\<^isub>1, \<dots>, \<approx>ty\<^isub>n"}. Like with the free-variable functions, |
1307 we also need to define auxiliary alpha-equivalence relations for the binding functions. |
1316 we also need to define auxiliary alpha-equivalence relations for the binding functions. |
1308 Say we have @{text "bn\<^isub>1, \<dots>, bn\<^isub>m"}, we also define @{text "\<approx>bn\<^isub>1, \<dots>, \<approx>b\<^isub>m"}. |
1317 Say we have @{text "bn\<^isub>1, \<dots>, bn\<^isub>m"}, then we also define @{text "\<approx>bn\<^isub>1, \<dots>, \<approx>b\<^isub>m"}. |
1309 To simplify our definitions we will use the following abbreviations for |
1318 To simplify our definitions we will use the following abbreviations for |
1310 relations and free-variable acting on products. |
1319 relations and free-variable acting on products. |
1311 % |
1320 % |
1312 \begin{center} |
1321 \begin{center} |
1313 \begin{tabular}{rcl} |
1322 \begin{tabular}{r@ {\hspace{2mm}}c@ {\hspace{2mm}}l} |
1314 @{text "(x\<^isub>1, y\<^isub>1) (R\<^isub>1 \<otimes> R\<^isub>2) (x\<^isub>2, y\<^isub>2)"} & @{text "\<equiv>"} & @{text "x\<^isub>1 R\<^isub>1 y\<^isub>1 \<and> x\<^isub>2 R\<^isub>2 y\<^isub>2"}\\ |
1323 @{text "(x\<^isub>1, y\<^isub>1) (R\<^isub>1 \<otimes> R\<^isub>2) (x\<^isub>2, y\<^isub>2)"} & @{text "\<equiv>"} & @{text "x\<^isub>1 R\<^isub>1 y\<^isub>1 \<and> x\<^isub>2 R\<^isub>2 y\<^isub>2"}\\ |
1315 @{text "(fv\<^isub>1 \<oplus> fv\<^isub>2) (x, y)"} & @{text "\<equiv>"} & @{text "fv\<^isub>1 x \<union> fv\<^isub>2 y"}\\ |
1324 @{text "(fv\<^isub>1 \<oplus> fv\<^isub>2) (x, y)"} & @{text "\<equiv>"} & @{text "fv\<^isub>1 x \<union> fv\<^isub>2 y"}\\ |
1316 \end{tabular} |
1325 \end{tabular} |
1317 \end{center} |
1326 \end{center} |
1318 |
1327 |
1319 |
1328 |
1320 The relations for alpha-equivalence are inductively defined predicates, whose clauses have |
1329 The relations for alpha-equivalence are inductively defined predicates, whose clauses have |
1321 conclusions of the form @{text "C x\<^isub>1 \<dots> x\<^isub>n \<approx>ty C y\<^isub>1 \<dots> y\<^isub>n"} (let us assume |
1330 conclusions of the form |
1331 % |
|
1332 \begin{center} |
|
1333 @{text "C x\<^isub>1 \<dots> x\<^isub>n \<approx>ty C y\<^isub>1 \<dots> y\<^isub>n"} |
|
1334 \end{center} |
|
1335 |
|
1336 \noindent |
|
1337 For what follows, let us assume |
|
1322 @{text C} is of type @{text ty} and its arguments are given by @{text "C ty\<^isub>1 \<dots> ty\<^isub>n"}). |
1338 @{text C} is of type @{text ty} and its arguments are given by @{text "C ty\<^isub>1 \<dots> ty\<^isub>n"}). |
1323 The task now is to specify what the premises of these clauses are. For this we |
1339 The task now is to specify what the premises of these clauses are. For this we |
1324 consider the pairs @{text "(x\<^isub>i, y\<^isub>i)"}. We will analyse these pairs according to |
1340 consider the pairs \mbox{@{text "(x\<^isub>i, y\<^isub>i)"}}, but instead of considering them in turn, it will |
1325 ``clusters'' of the binding clauses. There are the following cases: |
1341 be easier to analyse these pairs according to ``clusters'' of the binding clauses. |
1342 Therefore we distinguish the following cases: |
|
1326 *} |
1343 *} |
1327 (*<*) |
1344 (*<*) |
1328 consts alpha_ty ::'a |
1345 consts alpha_ty ::'a |
1329 notation alpha_ty ("\<approx>ty") |
1346 notation alpha_ty ("\<approx>ty") |
1330 (*>*) |
1347 (*>*) |
1331 text {* |
1348 text {* |
1332 \begin{itemize} |
1349 \begin{itemize} |
1333 \item The @{text "(x\<^isub>i, y\<^isub>i)"} are bodies of shallow binders with type @{text "ty"}. We assume the |
1350 \item The @{text "(x\<^isub>i, y\<^isub>i)"} are bodies of shallow binders with type @{text "ty"}. We assume the |
1334 @{text "(u\<^isub>1, v\<^isub>1),\<dots>,(u\<^isub>m, v\<^isub>m)"} are the corresponding binders. For the binding mode |
1351 \mbox{@{text "(u\<^isub>1, v\<^isub>1),\<dots>,(u\<^isub>m, v\<^isub>m)"}} are the corresponding binders. For the binding mode |
1335 \isacommand{bind\_set} we generate the premise |
1352 \isacommand{bind\_set} we generate the premise |
1336 \begin{center} |
1353 \begin{center} |
1337 @{term "\<exists>p. (u\<^isub>1 \<union> \<xi> \<union> u\<^isub>m, x\<^isub>i) \<approx>gen alpha_ty fv_ty\<^isub>i p (v\<^isub>1 \<union> \<xi> \<union> v\<^isub>m, y\<^isub>i)"} |
1354 @{term "\<exists>p. (u\<^isub>1 \<union> \<xi> \<union> u\<^isub>m, x\<^isub>i) \<approx>gen alpha_ty fv_ty\<^isub>i p (v\<^isub>1 \<union> \<xi> \<union> v\<^isub>m, y\<^isub>i)"} |
1338 \end{center} |
1355 \end{center} |
1339 |
1356 |
1340 Similarly for the other modes. |
1357 For the binding mode \isacommand{bind} we use $\approx_{\textit{list}}$, and for |
1358 binding mode \isacommand{bind\_res} we use $\approx_{\textit{res}}$. |
|
1341 |
1359 |
1342 \item The @{text "(x\<^isub>i, y\<^isub>i)"} are deep non-recursive binders with type @{text "ty"} |
1360 \item The @{text "(x\<^isub>i, y\<^isub>i)"} are deep non-recursive binders with type @{text "ty"} |
1343 and with @{text bn} being the auxiliary binding function. We assume |
1361 and @{text bn} being the auxiliary binding function. We assume |
1344 @{text "(u\<^isub>1, v\<^isub>1),\<dots>,(u\<^isub>m, v\<^isub>m)"} are the corresponding bodies with types @{text "ty\<^isub>1,\<dots>, ty\<^isub>m"}. |
1362 @{text "(u\<^isub>1, v\<^isub>1),\<dots>,(u\<^isub>m, v\<^isub>m)"} are the corresponding bodies with types @{text "ty\<^isub>1,\<dots>, ty\<^isub>m"}. |
1345 For the binding mode \isacommand{bind\_set} we generate the two premises |
1363 For the binding mode \isacommand{bind\_set} we generate two premises |
1346 |
1364 % |
1347 \begin{center} |
1365 \begin{center} |
1348 @{text "x\<^isub>i \<approx>bn y\<^isub>i"}\\ |
1366 @{text "x\<^isub>i \<approx>bn y\<^isub>i"}\hfill |
1349 @{term "\<exists>p. (bn x\<^isub>i, (u\<^isub>1,\<xi>,u\<^isub>m)) \<approx>gen R fv p (bn y\<^isub>i, (v\<^isub>1,\<xi>,v\<^isub>m))"} |
1367 @{term "\<exists>p. (bn x\<^isub>i, (u\<^isub>1,\<xi>,u\<^isub>m)) \<approx>gen R fv p (bn y\<^isub>i, (v\<^isub>1,\<xi>,v\<^isub>m))"} |
1350 \end{center} |
1368 \end{center} |
1351 |
1369 |
1352 \noindent |
1370 \noindent |
1353 where @{text R} is @{text "\<approx>ty\<^isub>1 \<otimes> ... \<otimes> \<approx>ty\<^isub>m"} and @{text fv} is |
1371 where @{text R} is @{text "\<approx>ty\<^isub>1 \<otimes> ... \<otimes> \<approx>ty\<^isub>m"} and @{text fv} is |
1354 @{text "fv_ty\<^isub>1 \<oplus> ... \<oplus> fv_ty\<^isub>m"}. Similarly for the other modes. |
1372 @{text "fv_ty\<^isub>1 \<oplus> ... \<oplus> fv_ty\<^isub>m"}. Similarly for the other binding modes. |
1355 |
1373 |
1356 \item The @{text "(x\<^isub>i, y\<^isub>i)"} are deep recursive binders with type @{text "ty"} |
1374 \item The @{text "(x\<^isub>i, y\<^isub>i)"} are deep recursive binders with type @{text "ty"} |
1357 and with @{text bn} being the auxiliary binding function. We assume |
1375 and with @{text bn} being the auxiliary binding function. We assume |
1358 @{text "(u\<^isub>1, v\<^isub>1),\<dots>,(u\<^isub>m, v\<^isub>m)"} are the corresponding bodies with types @{text "ty\<^isub>1,\<dots>, ty\<^isub>m"}. |
1376 @{text "(u\<^isub>1, v\<^isub>1),\<dots>,(u\<^isub>m, v\<^isub>m)"} are the corresponding bodies with types @{text "ty\<^isub>1,\<dots>, ty\<^isub>m"}. |
1359 For the binding mode \isacommand{bind\_set} we generate the premise |
1377 For the binding mode \isacommand{bind\_set} we generate the premise |
1360 |
1378 % |
1361 \begin{center} |
1379 \begin{center} |
1362 @{term "\<exists>p. (bn x\<^isub>i, (x\<^isub>i, u\<^isub>1,\<xi>,u\<^isub>m)) \<approx>gen R fv p (bn y\<^isub>i, (y\<^isub>i, v\<^isub>1,\<xi>,v\<^isub>m))"} |
1380 @{term "\<exists>p. (bn x\<^isub>i, (x\<^isub>i, u\<^isub>1,\<xi>,u\<^isub>m)) \<approx>gen R fv p (bn y\<^isub>i, (y\<^isub>i, v\<^isub>1,\<xi>,v\<^isub>m))"} |
1363 \end{center} |
1381 \end{center} |
1364 |
1382 |
1365 \noindent |
1383 \noindent |
1366 where @{text R} is @{text "\<approx>ty \<otimes> \<approx>ty\<^isub>1 \<otimes> ... \<otimes> \<approx>ty\<^isub>m"} and @{text fv} is |
1384 where @{text R} is @{text "\<approx>ty \<otimes> \<approx>ty\<^isub>1 \<otimes> ... \<otimes> \<approx>ty\<^isub>m"} and @{text fv} is |
1367 @{text "fv_ty \<oplus> fv_ty\<^isub>1 \<oplus> ... \<oplus> fv_ty\<^isub>m"}. Similarly for the other modes. |
1385 @{text "fv_ty \<oplus> fv_ty\<^isub>1 \<oplus> ... \<oplus> fv_ty\<^isub>m"}. Similarly for the other modes. |
1368 \end{itemize} |
1386 \end{itemize} |
1369 |
1387 |
1370 \noindent |
1388 \noindent |
1371 The only cases that are not covered by these rules is if @{text "(x\<^isub>i, y\<^isub>i)"} is |
1389 From these definition it is clear why we can only support one binding mode per binder |
1390 and body, as we cannot mix the relations $\approx_{\textit{set}}$, $\approx_{\textit{list}}$ |
|
1391 and $\approx_{\textit{res}}$. It is also clear why we had to impose the restriction |
|
1392 of excluding overlapping binders, as these would need to be translated to separate |
|
1393 abstractions. |
|
1394 |
|
1395 |
|
1396 The only cases that are not covered by the rules above are the cases where @{text "(x\<^isub>i, y\<^isub>i)"} is |
|
1372 neither a binder nor a body. Then we just generate @{text "x\<^isub>i \<approx>ty y\<^isub>i"} provided |
1397 neither a binder nor a body. Then we just generate @{text "x\<^isub>i \<approx>ty y\<^isub>i"} provided |
1373 the type of @{text "x\<^isub>i"} and @{text "y\<^isub>i"} is @{text ty} and the arguments are |
1398 the type of @{text "x\<^isub>i"} and @{text "y\<^isub>i"} is @{text ty} and the arguments are |
1374 recursive arguments of the term constructor. If they are non-recursive arguments |
1399 recursive arguments of the term-constructor. If they are non-recursive arguments |
1375 then we generate @{text "x\<^isub>i = y\<^isub>i"}. |
1400 then we generate just @{text "x\<^isub>i = y\<^isub>i"}. |
1376 |
1401 |
1377 TODO |
1402 TODO |
1378 |
1403 |
1379 The alpha-equivalence relations for binding functions are similar to the alpha-equivalences |
1404 The alpha-equivalence relations for binding functions are similar to the alpha-equivalences |
1380 for their respective types, the difference is that they ommit checking the arguments that |
1405 for their respective types, the difference is that they ommit checking the arguments that |