# HG changeset patch # User huffman # Date 1271181867 25200 # Node ID 6afa012a8f5cb4812adccf9ff36f15bc8e56dabd # Parent 64b6374a21a81741bc571d9d2e65752c2e647332 bring HOLCF/ex/Domain_Proofs.thy up to date diff -r 64b6374a21a8 -r 6afa012a8f5c src/HOLCF/ex/Domain_Proofs.thy --- a/src/HOLCF/ex/Domain_Proofs.thy Tue Apr 13 15:30:15 2010 +0200 +++ b/src/HOLCF/ex/Domain_Proofs.thy Tue Apr 13 11:04:27 2010 -0700 @@ -55,20 +55,23 @@ definition baz_defl :: "TypeRep \ TypeRep" where "baz_defl = (\ a. snd (snd (fix\(foo_bar_baz_deflF\a))))" +lemma defl_apply_thms: + "foo_defl\a = fst (fix\(foo_bar_baz_deflF\a))" + "bar_defl\a = fst (snd (fix\(foo_bar_baz_deflF\a)))" + "baz_defl\a = snd (snd (fix\(foo_bar_baz_deflF\a)))" +unfolding foo_defl_def bar_defl_def baz_defl_def by simp_all + text {* Unfold rules for each combinator. *} lemma foo_defl_unfold: "foo_defl\a = ssum_defl\REP(one)\(sprod_defl\(u_defl\a)\(u_defl\(bar_defl\a)))" -unfolding foo_defl_def bar_defl_def baz_defl_def -by (subst fix_eq, simp add: foo_bar_baz_deflF_beta) +unfolding defl_apply_thms by (subst fix_eq, simp add: foo_bar_baz_deflF_beta) lemma bar_defl_unfold: "bar_defl\a = u_defl\(cfun_defl\(baz_defl\a)\REP(tr))" -unfolding foo_defl_def bar_defl_def baz_defl_def -by (subst fix_eq, simp add: foo_bar_baz_deflF_beta) +unfolding defl_apply_thms by (subst fix_eq, simp add: foo_bar_baz_deflF_beta) lemma baz_defl_unfold: "baz_defl\a = u_defl\(cfun_defl\(convex_defl\(foo_defl\a))\REP(tr))" -unfolding foo_defl_def bar_defl_def baz_defl_def -by (subst fix_eq, simp add: foo_bar_baz_deflF_beta) +unfolding defl_apply_thms by (subst fix_eq, simp add: foo_bar_baz_deflF_beta) text "The automation for the previous steps will be quite similar to how the fixrec package works." @@ -308,6 +311,12 @@ definition baz_map :: "('a \ 'b) \ ('b baz \ 'a baz)" where "baz_map = (\ f. snd (snd (fix\(foo_bar_baz_mapF\f))))" +lemma map_apply_thms: + "foo_map\f = fst (fix\(foo_bar_baz_mapF\f))" + "bar_map\f = fst (snd (fix\(foo_bar_baz_mapF\f)))" + "baz_map\f = snd (snd (fix\(foo_bar_baz_mapF\f)))" +unfolding foo_map_def bar_map_def baz_map_def by simp_all + text {* Prove isodefl rules for all map functions simultaneously. *} lemma isodefl_foo_bar_baz: @@ -316,8 +325,7 @@ "isodefl (foo_map\d) (foo_defl\t) \ isodefl (bar_map\d) (bar_defl\t) \ isodefl (baz_map\d) (baz_defl\t)" - apply (simp add: foo_map_def bar_map_def baz_map_def) - apply (simp add: foo_defl_def bar_defl_def baz_defl_def) +unfolding map_apply_thms defl_apply_thms apply (rule parallel_fix_ind) apply (intro adm_conj adm_isodefl cont2cont_fst cont2cont_snd cont_id) apply (simp only: fst_strict snd_strict isodefl_bottom simp_thms) @@ -366,65 +374,100 @@ (********************************************************************) -subsection {* Step 5: Define copy functions, prove reach lemmas *} - -text {* Define copy functions just like the old domain package does. *} - -definition - foo_copy :: - "('a foo \ 'a foo) \ ('a bar \ 'a bar) \ ('a baz \ 'a baz) \ - 'a foo \ 'a foo" -where - "foo_copy = (\ p. foo_abs oo - ssum_map\ID\(sprod_map\(u_map\ID)\(u_map\(fst (snd p)))) - oo foo_rep)" +subsection {* Step 5: Define take functions, prove lub-take lemmas *} definition - bar_copy :: - "('a foo \ 'a foo) \ ('a bar \ 'a bar) \ ('a baz \ 'a baz) \ - 'a bar \ 'a bar" -where - "bar_copy = (\ p. bar_abs oo - u_map\(cfun_map\(snd (snd p))\ID) oo bar_rep)" - -definition - baz_copy :: - "('a foo \ 'a foo) \ ('a bar \ 'a bar) \ ('a baz \ 'a baz) \ - 'a baz \ 'a baz" -where - "baz_copy = (\ p. baz_abs oo - u_map\(cfun_map\(convex_map\(fst p))\ID) oo baz_rep)" - -definition - foo_bar_baz_copy :: + foo_bar_baz_takeF :: "('a foo \ 'a foo) \ ('a bar \ 'a bar) \ ('a baz \ 'a baz) \ ('a foo \ 'a foo) \ ('a bar \ 'a bar) \ ('a baz \ 'a baz)" where - "foo_bar_baz_copy = (\ f. (foo_copy\f, bar_copy\f, baz_copy\f))" + "foo_bar_baz_takeF = (\ p. + ( foo_abs oo + ssum_map\ID\(sprod_map\(u_map\ID)\(u_map\(fst (snd p)))) + oo foo_rep + , bar_abs oo + u_map\(cfun_map\(snd (snd p))\ID) oo bar_rep + , baz_abs oo + u_map\(cfun_map\(convex_map\(fst p))\ID) oo baz_rep + ))" + +lemma foo_bar_baz_takeF_beta: + "foo_bar_baz_takeF\p = + ( foo_abs oo + ssum_map\ID\(sprod_map\(u_map\ID)\(u_map\(fst (snd p)))) + oo foo_rep + , bar_abs oo + u_map\(cfun_map\(snd (snd p))\ID) oo bar_rep + , baz_abs oo + u_map\(cfun_map\(convex_map\(fst p))\ID) oo baz_rep + )" +unfolding foo_bar_baz_takeF_def by (rule beta_cfun, simp) + +definition + foo_take :: "nat \ 'a foo \ 'a foo" +where + "foo_take = (\n. fst (iterate n\foo_bar_baz_takeF\\))" + +definition + bar_take :: "nat \ 'a bar \ 'a bar" +where + "bar_take = (\n. fst (snd (iterate n\foo_bar_baz_takeF\\)))" -lemma fix_foo_bar_baz_copy: - "fix\foo_bar_baz_copy = (foo_map\ID, bar_map\ID, baz_map\ID)" -unfolding foo_map_def bar_map_def baz_map_def -apply (subst beta_cfun, simp)+ -apply (subst pair_collapse)+ -apply (rule cfun_arg_cong) -unfolding foo_bar_baz_mapF_def split_def -unfolding foo_bar_baz_copy_def -unfolding foo_copy_def bar_copy_def baz_copy_def -apply (subst beta_cfun, simp)+ -apply (rule refl) +definition + baz_take :: "nat \ 'a baz \ 'a baz" +where + "baz_take = (\n. snd (snd (iterate n\foo_bar_baz_takeF\\)))" + +lemma chain_take_thms: "chain foo_take" "chain bar_take" "chain baz_take" +unfolding foo_take_def bar_take_def baz_take_def +by (intro ch2ch_fst ch2ch_snd chain_iterate)+ + +lemma take_0_thms: "foo_take 0 = \" "bar_take 0 = \" "baz_take 0 = \" +unfolding foo_take_def bar_take_def baz_take_def +by (simp only: iterate_0 fst_strict snd_strict)+ + +lemma take_Suc_thms: + "foo_take (Suc n) = + foo_abs oo ssum_map\ID\(sprod_map\(u_map\ID)\(u_map\(bar_take n))) oo foo_rep" + "bar_take (Suc n) = + bar_abs oo u_map\(cfun_map\(baz_take n)\ID) oo bar_rep" + "baz_take (Suc n) = + baz_abs oo u_map\(cfun_map\(convex_map\(foo_take n))\ID) oo baz_rep" +unfolding foo_take_def bar_take_def baz_take_def +by (simp only: iterate_Suc foo_bar_baz_takeF_beta fst_conv snd_conv)+ + +lemma lub_take_lemma: + "(\n. foo_take n, \n. bar_take n, \n. baz_take n) + = (foo_map\(ID::'a \ 'a), bar_map\(ID::'a \ 'a), baz_map\(ID::'a \ 'a))" +apply (simp only: thelub_Pair [symmetric] ch2ch_Pair chain_take_thms) +apply (simp only: map_apply_thms pair_collapse) +apply (simp only: fix_def2) +apply (rule lub_eq) +apply (rule nat.induct) +apply (simp only: iterate_0 Pair_strict take_0_thms) +apply (simp only: iterate_Suc Pair_fst_snd_eq fst_conv snd_conv + foo_bar_baz_mapF_beta take_Suc_thms simp_thms) done -lemma foo_reach: "fst (fix\foo_bar_baz_copy)\x = x" -unfolding fix_foo_bar_baz_copy fst_conv snd_conv -unfolding foo_map_ID by (rule ID1) +lemma lub_foo_take: "(\n. foo_take n) = ID" +apply (rule trans [OF _ foo_map_ID]) +using lub_take_lemma +apply (elim Pair_inject) +apply assumption +done -lemma bar_reach: "fst (snd (fix\foo_bar_baz_copy))\x = x" -unfolding fix_foo_bar_baz_copy fst_conv snd_conv -unfolding bar_map_ID by (rule ID1) +lemma lub_bar_take: "(\n. bar_take n) = ID" +apply (rule trans [OF _ bar_map_ID]) +using lub_take_lemma +apply (elim Pair_inject) +apply assumption +done -lemma baz_reach: "snd (snd (fix\foo_bar_baz_copy))\x = x" -unfolding fix_foo_bar_baz_copy fst_conv snd_conv -unfolding baz_map_ID by (rule ID1) +lemma lub_baz_take: "(\n. baz_take n) = ID" +apply (rule trans [OF _ baz_map_ID]) +using lub_take_lemma +apply (elim Pair_inject) +apply assumption +done end