2893
+ − 1
header {* The main lemma about Num and the Second Fixed Point Theorem *}
2898
+ − 2
2893
+ − 3
theory Theorem imports Consts begin
+ − 4
+ − 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
+ − 6
lemmas app = Ltgt1_app
+ − 7
+ − 8
lemma Num:
+ − 9
shows "Num \<cdot> \<lbrace>M\<rbrace> \<approx> \<lbrace>\<lbrace>M\<rbrace>\<rbrace>"
+ − 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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
diff
changeset
+ − 20
finally show "Num \<cdot> \<lbrace>Var n\<rbrace> \<approx> \<lbrace>\<lbrace>Var n\<rbrace>\<rbrace>".
2893
+ − 21
next
3087
c95afd0dc594
SFT: Rename Lambda to LambdaTerms, rename constants to match Lambda, remove smt proofs.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 22
case (App M N)
2893
+ − 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>
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>
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>
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>
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
+ − 28
also have "... \<approx> A2 \<cdot> \<lbrace>M\<rbrace> \<cdot> \<lbrace>N\<rbrace> \<cdot> \<guillemotleft>[A1,A2,A3]\<guillemotright>" using U_app by simp
+ − 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>
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>
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
+ − 32
also have "... \<approx> \<lbrace>\<lbrace>M \<cdot> N\<rbrace>\<rbrace>" using IH by simp
+ − 33
finally show "Num \<cdot> \<lbrace>M \<cdot> N\<rbrace> \<approx> \<lbrace>\<lbrace>M \<cdot> N\<rbrace>\<rbrace>".
+ − 34
next
3087
c95afd0dc594
SFT: Rename Lambda to LambdaTerms, rename constants to match Lambda, remove smt proofs.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 35
case (Lam x P)
2893
+ − 36
assume IH: "Num \<cdot> \<lbrace>P\<rbrace> \<approx> \<lbrace>\<lbrace>P\<rbrace>\<rbrace>"
+ − 37
have "Num \<cdot> \<lbrace>\<integral> x. P\<rbrace> = Num \<cdot> (Abs \<cdot> \<integral> x. \<lbrace>P\<rbrace>)" by simp
+ − 38
also have "... = \<guillemotleft>[\<guillemotleft>[A1,A2,A3]\<guillemotright>]\<guillemotright> \<cdot> (Abs \<cdot> \<integral> x. \<lbrace>P\<rbrace>)" by simp
+ − 39
also have "... \<approx> Abs \<cdot> (\<integral> x. \<lbrace>P\<rbrace>) \<cdot> \<guillemotleft>[A1,A2,A3]\<guillemotright>" using app .
+ − 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 .
+ − 41
also have "... \<approx> A3 \<cdot> (\<integral> x. \<lbrace>P\<rbrace>) \<cdot> \<guillemotleft>[A1,A2,A3]\<guillemotright>" using U_app by simp
+ − 42
also have "... \<approx> F3 \<cdot> (\<integral> x. \<lbrace>P\<rbrace>) \<cdot> \<guillemotleft>[\<guillemotleft>[A1,A2,A3]\<guillemotright>]\<guillemotright>" using A_app(3) .
+ − 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>
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>
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>
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
+ − 47
also have "... = \<lbrace>\<lbrace>\<integral> x. P\<rbrace>\<rbrace>" by simp
+ − 48
finally show "Num \<cdot> \<lbrace>\<integral> x. P\<rbrace> \<approx> \<lbrace>\<lbrace>\<integral> x. P\<rbrace>\<rbrace>" .
+ − 49
qed
+ − 50
+ − 51
lemmas [simp] = Ap Num
+ − 52
lemmas [simp del] = fresh_def Num_def
+ − 53
+ − 54
theorem SFP:
+ − 55
fixes F :: lam
+ − 56
shows "\<exists>X. X \<approx> F \<cdot> \<lbrace>X\<rbrace>"
+ − 57
proof -
3088
+ − 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>
diff
changeset
+ − 59
def W \<equiv> "\<integral>x. (F \<cdot> (APP \<cdot> Var x \<cdot> (Num \<cdot> Var x)))"
2893
+ − 60
def X \<equiv> "W \<cdot> \<lbrace>W\<rbrace>"
+ − 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>
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>
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>
diff
changeset
+ − 64
also have "... \<approx> F \<cdot> (APP \<cdot> \<lbrace>W\<rbrace> \<cdot> \<lbrace>\<lbrace>W\<rbrace>\<rbrace>)" by simp
2893
+ − 65
also have "... \<approx> F \<cdot> \<lbrace>W \<cdot> \<lbrace>W\<rbrace>\<rbrace>" by simp
+ − 66
also have "... = F \<cdot> \<lbrace>X\<rbrace>" unfolding X_def ..
+ − 67
finally show ?thesis by blast
+ − 68
qed
2894
+ − 69
+ − 70
end