author | Cezary Kaliszyk <cezarykaliszyk@gmail.com> |
Mon, 26 Mar 2012 13:10:51 +0200 | |
changeset 3138 | b47301ebb3ca |
parent 3088 | 5e74bd87bcda |
child 3175 | 52730e5ec8cb |
permissions | -rw-r--r-- |
2893
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
1 |
header {* The main lemma about Num and the Second Fixed Point Theorem *} |
2898
a95a497e1f4f
Make examples work with non-precompiled image
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
2894
diff
changeset
|
2 |
|
2893
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
3 |
theory Theorem imports Consts begin |
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
4 |
|
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
5 |
lemmas [simp] = b3[OF bI] b1 b4 b5 supp_Num[unfolded Num_def supp_ltgt] Num_def lam.fresh[unfolded fresh_def] fresh_def b6 |
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
6 |
lemmas app = Ltgt1_app |
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
7 |
|
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
8 |
lemma Num: |
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
9 |
shows "Num \<cdot> \<lbrace>M\<rbrace> \<approx> \<lbrace>\<lbrace>M\<rbrace>\<rbrace>" |
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
10 |
proof (induct M rule: lam.induct) |
3087
c95afd0dc594
SFT: Rename Lambda to LambdaTerms, rename constants to match Lambda, remove smt proofs.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
2898
diff
changeset
|
11 |
case (Var n) |
c95afd0dc594
SFT: Rename Lambda to LambdaTerms, rename constants to match Lambda, remove smt proofs.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
2898
diff
changeset
|
12 |
have "Num \<cdot> \<lbrace>Var n\<rbrace> = Num \<cdot> (VAR \<cdot> Var n)" by simp |
c95afd0dc594
SFT: Rename Lambda to LambdaTerms, rename constants to match Lambda, remove smt proofs.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
2898
diff
changeset
|
13 |
also have "... = \<guillemotleft>[\<guillemotleft>[A1,A2,A3]\<guillemotright>]\<guillemotright> \<cdot> (VAR \<cdot> Var n)" by simp |
c95afd0dc594
SFT: Rename Lambda to LambdaTerms, rename constants to match Lambda, remove smt proofs.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
2898
diff
changeset
|
14 |
also have "... \<approx> VAR \<cdot> Var n \<cdot> \<guillemotleft>[A1,A2,A3]\<guillemotright>" using app . |
c95afd0dc594
SFT: Rename Lambda to LambdaTerms, rename constants to match Lambda, remove smt proofs.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
2898
diff
changeset
|
15 |
also have "... \<approx> \<guillemotleft>[A1,A2,A3]\<guillemotright> \<cdot> Umn 2 2 \<cdot> Var n \<cdot> \<guillemotleft>[A1,A2,A3]\<guillemotright>" using VAR_app . |
c95afd0dc594
SFT: Rename Lambda to LambdaTerms, rename constants to match Lambda, remove smt proofs.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
2898
diff
changeset
|
16 |
also have "... \<approx> A1 \<cdot> Var n \<cdot> \<guillemotleft>[A1,A2,A3]\<guillemotright>" using U_app by simp |
c95afd0dc594
SFT: Rename Lambda to LambdaTerms, rename constants to match Lambda, remove smt proofs.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
2898
diff
changeset
|
17 |
also have "... \<approx> F1 \<cdot> Var n" using A_app(1) . |
c95afd0dc594
SFT: Rename Lambda to LambdaTerms, rename constants to match Lambda, remove smt proofs.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
2898
diff
changeset
|
18 |
also have "... \<approx> APP \<cdot> \<lbrace>VAR\<rbrace> \<cdot> (VAR \<cdot> Var n)" using F_app(1) . |
c95afd0dc594
SFT: Rename Lambda to LambdaTerms, rename constants to match Lambda, remove smt proofs.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
2898
diff
changeset
|
19 |
also have "... = \<lbrace>\<lbrace>Var n\<rbrace>\<rbrace>" by simp |
c95afd0dc594
SFT: Rename Lambda to LambdaTerms, rename constants to match Lambda, remove smt proofs.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
2898
diff
changeset
|
20 |
finally show "Num \<cdot> \<lbrace>Var n\<rbrace> \<approx> \<lbrace>\<lbrace>Var n\<rbrace>\<rbrace>". |
2893
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
21 |
next |
3087
c95afd0dc594
SFT: Rename Lambda to LambdaTerms, rename constants to match Lambda, remove smt proofs.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
2898
diff
changeset
|
22 |
case (App M N) |
2893
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
23 |
assume IH: "Num \<cdot> \<lbrace>M\<rbrace> \<approx> \<lbrace>\<lbrace>M\<rbrace>\<rbrace>" "Num \<cdot> \<lbrace>N\<rbrace> \<approx> \<lbrace>\<lbrace>N\<rbrace>\<rbrace>" |
3087
c95afd0dc594
SFT: Rename Lambda to LambdaTerms, rename constants to match Lambda, remove smt proofs.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
2898
diff
changeset
|
24 |
have "Num \<cdot> \<lbrace>M \<cdot> N\<rbrace> = Num \<cdot> (APP \<cdot> \<lbrace>M\<rbrace> \<cdot> \<lbrace>N\<rbrace>)" by simp |
c95afd0dc594
SFT: Rename Lambda to LambdaTerms, rename constants to match Lambda, remove smt proofs.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
2898
diff
changeset
|
25 |
also have "... = \<guillemotleft>[\<guillemotleft>[A1,A2,A3]\<guillemotright>]\<guillemotright> \<cdot> (APP \<cdot> \<lbrace>M\<rbrace> \<cdot> \<lbrace>N\<rbrace>)" by simp |
c95afd0dc594
SFT: Rename Lambda to LambdaTerms, rename constants to match Lambda, remove smt proofs.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
2898
diff
changeset
|
26 |
also have "... \<approx> APP \<cdot> \<lbrace>M\<rbrace> \<cdot> \<lbrace>N\<rbrace> \<cdot> \<guillemotleft>[A1,A2,A3]\<guillemotright>" using app . |
c95afd0dc594
SFT: Rename Lambda to LambdaTerms, rename constants to match Lambda, remove smt proofs.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
2898
diff
changeset
|
27 |
also have "... \<approx> \<guillemotleft>[A1,A2,A3]\<guillemotright> \<cdot> Umn 2 1 \<cdot> \<lbrace>M\<rbrace> \<cdot> \<lbrace>N\<rbrace> \<cdot> \<guillemotleft>[A1,A2,A3]\<guillemotright>" using APP_app . |
2893
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
28 |
also have "... \<approx> A2 \<cdot> \<lbrace>M\<rbrace> \<cdot> \<lbrace>N\<rbrace> \<cdot> \<guillemotleft>[A1,A2,A3]\<guillemotright>" using U_app by simp |
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
29 |
also have "... \<approx> F2 \<cdot> \<lbrace>M\<rbrace> \<cdot> \<lbrace>N\<rbrace> \<cdot> Num" using A_app(2) by simp |
3087
c95afd0dc594
SFT: Rename Lambda to LambdaTerms, rename constants to match Lambda, remove smt proofs.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
2898
diff
changeset
|
30 |
also have "... \<approx> APP \<cdot> (APP \<cdot> \<lbrace>APP\<rbrace> \<cdot> (Num \<cdot> \<lbrace>M\<rbrace>)) \<cdot> (Num \<cdot> \<lbrace>N\<rbrace>)" using F_app(2) . |
c95afd0dc594
SFT: Rename Lambda to LambdaTerms, rename constants to match Lambda, remove smt proofs.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
2898
diff
changeset
|
31 |
also have "... \<approx> APP \<cdot> (APP \<cdot> \<lbrace>APP\<rbrace> \<cdot> (\<lbrace>\<lbrace>M\<rbrace>\<rbrace>)) \<cdot> (Num \<cdot> \<lbrace>N\<rbrace>)" using IH by simp |
2893
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
32 |
also have "... \<approx> \<lbrace>\<lbrace>M \<cdot> N\<rbrace>\<rbrace>" using IH by simp |
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
33 |
finally show "Num \<cdot> \<lbrace>M \<cdot> N\<rbrace> \<approx> \<lbrace>\<lbrace>M \<cdot> N\<rbrace>\<rbrace>". |
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
34 |
next |
3087
c95afd0dc594
SFT: Rename Lambda to LambdaTerms, rename constants to match Lambda, remove smt proofs.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
2898
diff
changeset
|
35 |
case (Lam x P) |
2893
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
36 |
assume IH: "Num \<cdot> \<lbrace>P\<rbrace> \<approx> \<lbrace>\<lbrace>P\<rbrace>\<rbrace>" |
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
37 |
have "Num \<cdot> \<lbrace>\<integral> x. P\<rbrace> = Num \<cdot> (Abs \<cdot> \<integral> x. \<lbrace>P\<rbrace>)" by simp |
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
38 |
also have "... = \<guillemotleft>[\<guillemotleft>[A1,A2,A3]\<guillemotright>]\<guillemotright> \<cdot> (Abs \<cdot> \<integral> x. \<lbrace>P\<rbrace>)" by simp |
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
39 |
also have "... \<approx> Abs \<cdot> (\<integral> x. \<lbrace>P\<rbrace>) \<cdot> \<guillemotleft>[A1,A2,A3]\<guillemotright>" using app . |
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
40 |
also have "... \<approx> \<guillemotleft>[A1,A2,A3]\<guillemotright> \<cdot> Umn 2 0 \<cdot> (\<integral> x. \<lbrace>P\<rbrace>) \<cdot> \<guillemotleft>[A1,A2,A3]\<guillemotright>" using Abs_app . |
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
41 |
also have "... \<approx> A3 \<cdot> (\<integral> x. \<lbrace>P\<rbrace>) \<cdot> \<guillemotleft>[A1,A2,A3]\<guillemotright>" using U_app by simp |
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
42 |
also have "... \<approx> F3 \<cdot> (\<integral> x. \<lbrace>P\<rbrace>) \<cdot> \<guillemotleft>[\<guillemotleft>[A1,A2,A3]\<guillemotright>]\<guillemotright>" using A_app(3) . |
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
43 |
also have "... = F3 \<cdot> (\<integral> x. \<lbrace>P\<rbrace>) \<cdot> Num" by simp |
3087
c95afd0dc594
SFT: Rename Lambda to LambdaTerms, rename constants to match Lambda, remove smt proofs.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
2898
diff
changeset
|
44 |
also have "... \<approx> APP \<cdot> \<lbrace>Abs\<rbrace> \<cdot> (Abs \<cdot> \<integral> x. (Num \<cdot> ((\<integral> x. \<lbrace>P\<rbrace>) \<cdot> Var x)))" by (rule F3_app) simp_all |
c95afd0dc594
SFT: Rename Lambda to LambdaTerms, rename constants to match Lambda, remove smt proofs.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
2898
diff
changeset
|
45 |
also have "... \<approx> APP \<cdot> \<lbrace>Abs\<rbrace> \<cdot> (Abs \<cdot> \<integral> x. (Num \<cdot> \<lbrace>P\<rbrace>))" using beta_app by simp |
c95afd0dc594
SFT: Rename Lambda to LambdaTerms, rename constants to match Lambda, remove smt proofs.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
2898
diff
changeset
|
46 |
also have "... \<approx> APP \<cdot> \<lbrace>Abs\<rbrace> \<cdot> (Abs \<cdot> \<integral> x. \<lbrace>\<lbrace>P\<rbrace>\<rbrace>)" using IH by simp |
2893
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
47 |
also have "... = \<lbrace>\<lbrace>\<integral> x. P\<rbrace>\<rbrace>" by simp |
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
48 |
finally show "Num \<cdot> \<lbrace>\<integral> x. P\<rbrace> \<approx> \<lbrace>\<lbrace>\<integral> x. P\<rbrace>\<rbrace>" . |
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
49 |
qed |
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
50 |
|
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
51 |
lemmas [simp] = Ap Num |
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
52 |
lemmas [simp del] = fresh_def Num_def |
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
53 |
|
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
54 |
theorem SFP: |
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
55 |
fixes F :: lam |
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
56 |
shows "\<exists>X. X \<approx> F \<cdot> \<lbrace>X\<rbrace>" |
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
57 |
proof - |
3088
5e74bd87bcda
SFT/LambdaTerms: rename 'var' to 'name' to match Lambda.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
3087
diff
changeset
|
58 |
obtain x :: name where [simp]:"atom x \<sharp> F" using obtain_fresh by blast |
3087
c95afd0dc594
SFT: Rename Lambda to LambdaTerms, rename constants to match Lambda, remove smt proofs.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
2898
diff
changeset
|
59 |
def W \<equiv> "\<integral>x. (F \<cdot> (APP \<cdot> Var x \<cdot> (Num \<cdot> Var x)))" |
2893
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
60 |
def X \<equiv> "W \<cdot> \<lbrace>W\<rbrace>" |
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
61 |
have a: "X = W \<cdot> \<lbrace>W\<rbrace>" unfolding X_def .. |
3087
c95afd0dc594
SFT: Rename Lambda to LambdaTerms, rename constants to match Lambda, remove smt proofs.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
2898
diff
changeset
|
62 |
also have "... = (\<integral>x. (F \<cdot> (APP \<cdot> Var x \<cdot> (Num \<cdot> Var x)))) \<cdot> \<lbrace>W\<rbrace>" unfolding W_def .. |
c95afd0dc594
SFT: Rename Lambda to LambdaTerms, rename constants to match Lambda, remove smt proofs.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
2898
diff
changeset
|
63 |
also have "... \<approx> F \<cdot> (APP \<cdot> \<lbrace>W\<rbrace> \<cdot> (Num \<cdot> \<lbrace>W\<rbrace>))" by simp |
c95afd0dc594
SFT: Rename Lambda to LambdaTerms, rename constants to match Lambda, remove smt proofs.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
2898
diff
changeset
|
64 |
also have "... \<approx> F \<cdot> (APP \<cdot> \<lbrace>W\<rbrace> \<cdot> \<lbrace>\<lbrace>W\<rbrace>\<rbrace>)" by simp |
2893
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
65 |
also have "... \<approx> F \<cdot> \<lbrace>W \<cdot> \<lbrace>W\<rbrace>\<rbrace>" by simp |
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
66 |
also have "... = F \<cdot> \<lbrace>X\<rbrace>" unfolding X_def .. |
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
67 |
finally show ?thesis by blast |
589b1a0c75e6
Second Fixed Point Theorem
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff
changeset
|
68 |
qed |
2894
8ec94871de1e
More usual names for substitution properties
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
2893
diff
changeset
|
69 |
|
8ec94871de1e
More usual names for substitution properties
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
2893
diff
changeset
|
70 |
end |