| author | krauss | 
| Mon, 05 Jun 2006 14:22:58 +0200 | |
| changeset 19769 | c40ce2de2020 | 
| parent 16417 | 9bc16273c2d4 | 
| child 22808 | a7daa74e2980 | 
| permissions | -rw-r--r-- | 
| 1478 | 1 | (* Title: Residuals.thy | 
| 1048 | 2 | ID: $Id$ | 
| 1478 | 3 | Author: Ole Rasmussen | 
| 1048 | 4 | Copyright 1995 University of Cambridge | 
| 5 | Logic Image: ZF | |
| 6 | ||
| 7 | *) | |
| 8 | ||
| 16417 | 9 | theory Residuals imports Substitution begin | 
| 1048 | 10 | |
| 11 | consts | |
| 12593 | 12 | Sres :: "i" | 
| 13 | residuals :: "[i,i,i]=>i" | |
| 14 | "|>" :: "[i,i]=>i" (infixl 70) | |
| 15 | ||
| 1048 | 16 | translations | 
| 12593 | 17 | "residuals(u,v,w)" == "<u,v,w> \<in> Sres" | 
| 1048 | 18 | |
| 19 | inductive | |
| 20 | domains "Sres" <= "redexes*redexes*redexes" | |
| 12593 | 21 | intros | 
| 22 | Res_Var: "n \<in> nat ==> residuals(Var(n),Var(n),Var(n))" | |
| 23 | Res_Fun: "[|residuals(u,v,w)|]==> | |
| 1478 | 24 | residuals(Fun(u),Fun(v),Fun(w))" | 
| 12593 | 25 | Res_App: "[|residuals(u1,v1,w1); | 
| 26 | residuals(u2,v2,w2); b \<in> bool|]==> | |
| 1478 | 27 | residuals(App(b,u1,u2),App(0,v1,v2),App(b,w1,w2))" | 
| 12593 | 28 | Res_redex: "[|residuals(u1,v1,w1); | 
| 29 | residuals(u2,v2,w2); b \<in> bool|]==> | |
| 1478 | 30 | residuals(App(b,Fun(u1),u2),App(1,Fun(v1),v2),w2/w1)" | 
| 12593 | 31 | type_intros subst_type nat_typechecks redexes.intros bool_typechecks | 
| 32 | ||
| 33 | defs | |
| 34 | res_func_def: "u |> v == THE w. residuals(u,v,w)" | |
| 35 | ||
| 36 | ||
| 15481 | 37 | subsection{*Setting up rule lists*}
 | 
| 12593 | 38 | |
| 39 | declare Sres.intros [intro] | |
| 40 | declare Sreg.intros [intro] | |
| 41 | declare subst_type [intro] | |
| 42 | ||
| 12610 | 43 | inductive_cases [elim!]: | 
| 44 | "residuals(Var(n),Var(n),v)" | |
| 45 | "residuals(Fun(t),Fun(u),v)" | |
| 46 | "residuals(App(b, u1, u2), App(0, v1, v2),v)" | |
| 47 | "residuals(App(b, u1, u2), App(1, Fun(v1), v2),v)" | |
| 48 | "residuals(Var(n),u,v)" | |
| 49 | "residuals(Fun(t),u,v)" | |
| 50 | "residuals(App(b, u1, u2), w,v)" | |
| 51 | "residuals(u,Var(n),v)" | |
| 52 | "residuals(u,Fun(t),v)" | |
| 53 | "residuals(w,App(b, u1, u2),v)" | |
| 12593 | 54 | |
| 55 | ||
| 12610 | 56 | inductive_cases [elim!]: | 
| 57 | "Var(n) <== u" | |
| 58 | "Fun(n) <== u" | |
| 59 | "u <== Fun(n)" | |
| 60 | "App(1,Fun(t),a) <== u" | |
| 61 | "App(0,t,a) <== u" | |
| 12593 | 62 | |
| 12610 | 63 | inductive_cases [elim!]: | 
| 64 | "Fun(t) \<in> redexes" | |
| 12593 | 65 | |
| 66 | declare Sres.intros [simp] | |
| 67 | ||
| 15481 | 68 | subsection{*residuals is a  partial function*}
 | 
| 12593 | 69 | |
| 70 | lemma residuals_function [rule_format]: | |
| 71 | "residuals(u,v,w) ==> \<forall>w1. residuals(u,v,w1) --> w1 = w" | |
| 72 | by (erule Sres.induct, force+) | |
| 73 | ||
| 74 | lemma residuals_intro [rule_format]: | |
| 75 | "u~v ==> regular(v) --> (\<exists>w. residuals(u,v,w))" | |
| 76 | by (erule Scomp.induct, force+) | |
| 77 | ||
| 78 | lemma comp_resfuncD: | |
| 79 | "[| u~v; regular(v) |] ==> residuals(u, v, THE w. residuals(u, v, w))" | |
| 13339 
0f89104dd377
Fixed quantified variable name preservation for ball and bex (bounded quants)
 paulson parents: 
12610diff
changeset | 80 | apply (frule residuals_intro, assumption, clarify) | 
| 12593 | 81 | apply (subst the_equality) | 
| 82 | apply (blast intro: residuals_function)+ | |
| 83 | done | |
| 84 | ||
| 15481 | 85 | subsection{*Residual function*}
 | 
| 12593 | 86 | |
| 87 | lemma res_Var [simp]: "n \<in> nat ==> Var(n) |> Var(n) = Var(n)" | |
| 88 | by (unfold res_func_def, blast) | |
| 89 | ||
| 90 | lemma res_Fun [simp]: | |
| 91 | "[|s~t; regular(t)|]==> Fun(s) |> Fun(t) = Fun(s |> t)" | |
| 92 | apply (unfold res_func_def) | |
| 93 | apply (blast intro: comp_resfuncD residuals_function) | |
| 94 | done | |
| 95 | ||
| 96 | lemma res_App [simp]: | |
| 97 | "[|s~u; regular(u); t~v; regular(v); b \<in> bool|] | |
| 98 | ==> App(b,s,t) |> App(0,u,v) = App(b, s |> u, t |> v)" | |
| 99 | apply (unfold res_func_def) | |
| 100 | apply (blast dest!: comp_resfuncD intro: residuals_function) | |
| 101 | done | |
| 102 | ||
| 103 | lemma res_redex [simp]: | |
| 104 | "[|s~u; regular(u); t~v; regular(v); b \<in> bool|] | |
| 105 | ==> App(b,Fun(s),t) |> App(1,Fun(u),v) = (t |> v)/ (s |> u)" | |
| 106 | apply (unfold res_func_def) | |
| 107 | apply (blast elim!: redexes.free_elims dest!: comp_resfuncD | |
| 108 | intro: residuals_function) | |
| 109 | done | |
| 110 | ||
| 111 | lemma resfunc_type [simp]: | |
| 112 | "[|s~t; regular(t)|]==> regular(t) --> s |> t \<in> redexes" | |
| 13612 | 113 | by (erule Scomp.induct, auto) | 
| 12593 | 114 | |
| 15481 | 115 | subsection{*Commutation theorem*}
 | 
| 12593 | 116 | |
| 117 | lemma sub_comp [simp]: "u<==v ==> u~v" | |
| 118 | by (erule Ssub.induct, simp_all) | |
| 119 | ||
| 120 | lemma sub_preserve_reg [rule_format, simp]: | |
| 121 | "u<==v ==> regular(v) --> regular(u)" | |
| 122 | by (erule Ssub.induct, auto) | |
| 1048 | 123 | |
| 12593 | 124 | lemma residuals_lift_rec: "[|u~v; k \<in> nat|]==> regular(v)--> (\<forall>n \<in> nat. | 
| 125 | lift_rec(u,n) |> lift_rec(v,n) = lift_rec(u |> v,n))" | |
| 13339 
0f89104dd377
Fixed quantified variable name preservation for ball and bex (bounded quants)
 paulson parents: 
12610diff
changeset | 126 | apply (erule Scomp.induct, safe) | 
| 12593 | 127 | apply (simp_all add: lift_rec_Var subst_Var lift_subst) | 
| 128 | done | |
| 129 | ||
| 130 | lemma residuals_subst_rec: | |
| 131 | "u1~u2 ==> \<forall>v1 v2. v1~v2 --> regular(v2) --> regular(u2) --> | |
| 132 | (\<forall>n \<in> nat. subst_rec(v1,u1,n) |> subst_rec(v2,u2,n) = | |
| 133 | subst_rec(v1 |> v2, u1 |> u2,n))" | |
| 13339 
0f89104dd377
Fixed quantified variable name preservation for ball and bex (bounded quants)
 paulson parents: 
12610diff
changeset | 134 | apply (erule Scomp.induct, safe) | 
| 12593 | 135 | apply (simp_all add: lift_rec_Var subst_Var residuals_lift_rec) | 
| 136 | apply (drule_tac psi = "\<forall>x.?P (x) " in asm_rl) | |
| 137 | apply (simp add: substitution) | |
| 138 | done | |
| 139 | ||
| 140 | ||
| 141 | lemma commutation [simp]: | |
| 142 | "[|u1~u2; v1~v2; regular(u2); regular(v2)|] | |
| 143 | ==> (v1/u1) |> (v2/u2) = (v1 |> v2)/(u1 |> u2)" | |
| 144 | by (simp add: residuals_subst_rec) | |
| 145 | ||
| 146 | ||
| 15481 | 147 | subsection{*Residuals are comp and regular*}
 | 
| 12593 | 148 | |
| 149 | lemma residuals_preserve_comp [rule_format, simp]: | |
| 150 | "u~v ==> \<forall>w. u~w --> v~w --> regular(w) --> (u|>w) ~ (v|>w)" | |
| 151 | by (erule Scomp.induct, force+) | |
| 152 | ||
| 153 | lemma residuals_preserve_reg [rule_format, simp]: | |
| 154 | "u~v ==> regular(u) --> regular(v) --> regular(u|>v)" | |
| 13339 
0f89104dd377
Fixed quantified variable name preservation for ball and bex (bounded quants)
 paulson parents: 
12610diff
changeset | 155 | apply (erule Scomp.induct, auto) | 
| 12593 | 156 | done | 
| 157 | ||
| 15481 | 158 | subsection{*Preservation lemma*}
 | 
| 12593 | 159 | |
| 160 | lemma union_preserve_comp: "u~v ==> v ~ (u un v)" | |
| 161 | by (erule Scomp.induct, simp_all) | |
| 162 | ||
| 163 | lemma preservation [rule_format]: | |
| 164 | "u ~ v ==> regular(v) --> u|>v = (u un v)|>v" | |
| 13339 
0f89104dd377
Fixed quantified variable name preservation for ball and bex (bounded quants)
 paulson parents: 
12610diff
changeset | 165 | apply (erule Scomp.induct, safe) | 
| 12593 | 166 | apply (drule_tac [3] psi = "Fun (?u) |> ?v = ?w" in asm_rl) | 
| 167 | apply (auto simp add: union_preserve_comp comp_sym_iff) | |
| 168 | done | |
| 169 | ||
| 170 | ||
| 171 | declare sub_comp [THEN comp_sym, simp] | |
| 172 | ||
| 15481 | 173 | subsection{*Prism theorem*}
 | 
| 12593 | 174 | |
| 175 | (* Having more assumptions than needed -- removed below *) | |
| 176 | lemma prism_l [rule_format]: | |
| 177 | "v<==u ==> | |
| 178 | regular(u) --> (\<forall>w. w~v --> w~u --> | |
| 179 | w |> u = (w|>v) |> (u|>v))" | |
| 15481 | 180 | by (erule Ssub.induct, force+) | 
| 12593 | 181 | |
| 15481 | 182 | lemma prism: "[|v <== u; regular(u); w~v|] ==> w |> u = (w|>v) |> (u|>v)" | 
| 12593 | 183 | apply (rule prism_l) | 
| 13339 
0f89104dd377
Fixed quantified variable name preservation for ball and bex (bounded quants)
 paulson parents: 
12610diff
changeset | 184 | apply (rule_tac [4] comp_trans, auto) | 
| 12593 | 185 | done | 
| 186 | ||
| 187 | ||
| 15481 | 188 | subsection{*Levy's Cube Lemma*}
 | 
| 12593 | 189 | |
| 190 | lemma cube: "[|u~v; regular(v); regular(u); w~u|]==> | |
| 191 | (w|>u) |> (v|>u) = (w|>v) |> (u|>v)" | |
| 15481 | 192 | apply (subst preservation [of u], assumption, assumption) | 
| 193 | apply (subst preservation [of v], erule comp_sym, assumption) | |
| 194 | apply (subst prism [symmetric, of v]) | |
| 12593 | 195 | apply (simp add: union_r comp_sym_iff) | 
| 196 | apply (simp add: union_preserve_regular comp_sym_iff) | |
| 13339 
0f89104dd377
Fixed quantified variable name preservation for ball and bex (bounded quants)
 paulson parents: 
12610diff
changeset | 197 | apply (erule comp_trans, assumption) | 
| 12593 | 198 | apply (simp add: prism [symmetric] union_l union_preserve_regular | 
| 199 | comp_sym_iff union_sym) | |
| 200 | done | |
| 201 | ||
| 202 | ||
| 15481 | 203 | subsection{*paving theorem*}
 | 
| 12593 | 204 | |
| 205 | lemma paving: "[|w~u; w~v; regular(u); regular(v)|]==> | |
| 206 | \<exists>uv vu. (w|>u) |> vu = (w|>v) |> uv & (w|>u)~vu & | |
| 207 | regular(vu) & (w|>v)~uv & regular(uv) " | |
| 208 | apply (subgoal_tac "u~v") | |
| 209 | apply (safe intro!: exI) | |
| 210 | apply (rule cube) | |
| 211 | apply (simp_all add: comp_sym_iff) | |
| 212 | apply (blast intro: residuals_preserve_comp comp_trans comp_sym)+ | |
| 213 | done | |
| 214 | ||
| 215 | ||
| 1048 | 216 | end | 
| 217 |