# HG changeset patch # User huffman # Date 1258643344 28800 # Node ID c7d32e726bb953f4eb5ed11d3cfc223719243f99 # Parent 3e7ab843d817a6610ff6799af9c2778d8330148f avoid using csplit; define copy functions exactly like the current domain package diff -r 3e7ab843d817 -r c7d32e726bb9 src/HOLCF/ex/Domain_Proofs.thy --- a/src/HOLCF/ex/Domain_Proofs.thy Thu Nov 19 06:01:02 2009 -0800 +++ b/src/HOLCF/ex/Domain_Proofs.thy Thu Nov 19 07:09:04 2009 -0800 @@ -31,10 +31,10 @@ foo_bar_baz_typF :: "TypeRep \ TypeRep \ TypeRep \ TypeRep \ TypeRep \ TypeRep \ TypeRep" where - "foo_bar_baz_typF = (\ a (t1, t2, t3). + "foo_bar_baz_typF = (\ a. Abs_CFun (\(t1, t2, t3). ( ssum_typ\REP(one)\(sprod_typ\(u_typ\a)\(u_typ\t2)) , sprod_typ\(u_typ\a)\(u_typ\t3) - , sprod_typ\(u_typ\a)\(u_typ\(convex_typ\t1))))" + , sprod_typ\(u_typ\a)\(u_typ\(convex_typ\t1)))))" lemma foo_bar_baz_typF_beta: "foo_bar_baz_typF\a\t = @@ -42,7 +42,7 @@ , sprod_typ\(u_typ\a)\(u_typ\(snd (snd t))) , sprod_typ\(u_typ\a)\(u_typ\(convex_typ\(fst t))))" unfolding foo_bar_baz_typF_def -by (simp add: csplit_def cfst_def csnd_def) +by (simp add: split_def) text {* Individual type combinators are projected from the fixed point. *} @@ -268,11 +268,16 @@ definition foo_bar_baz_mapF :: + "(_ \ _) + \ (_ foo \ _ foo) \ (_ bar \ _ bar) \ (_ baz \ _ baz) + \ (_ foo \ _ foo) \ (_ bar \ _ bar) \ (_ baz \ _ baz)" +(* "('a \ 'b) \ ('a foo \ 'b foo) \ ('a bar \ 'b bar) \ ('a baz \ 'b baz) \ ('a foo \ 'b foo) \ ('a bar \ 'b bar) \ ('a baz \ 'b baz)" +*) where - "foo_bar_baz_mapF = (\ f (d1, d2, d3). + "foo_bar_baz_mapF = (\ f. Abs_CFun (\(d1, d2, d3). ( foo_abs oo ssum_map\ID\(sprod_map\(u_map\f)\(u_map\d2)) @@ -281,7 +286,7 @@ bar_abs oo sprod_map\(u_map\f)\(u_map\d3) oo bar_rep , baz_abs oo sprod_map\(u_map\f)\(u_map\(convex_map\d1)) oo baz_rep - ))" + )))" lemma foo_bar_baz_mapF_beta: "foo_bar_baz_mapF\f\d = @@ -295,7 +300,7 @@ baz_abs oo sprod_map\(u_map\f)\(u_map\(convex_map\(fst d))) oo baz_rep )" unfolding foo_bar_baz_mapF_def -by (simp add: csplit_def cfst_def csnd_def) +by (simp add: split_def) text {* Individual map functions are projected from the fixed point. *} @@ -368,23 +373,64 @@ subsection {* Step 5: Define copy functions, prove reach lemmas *} -definition "foo_bar_baz_copy = foo_bar_baz_mapF\ID" -definition "foo_copy = (\ f. fst (foo_bar_baz_copy\f))" -definition "bar_copy = (\ f. fst (snd (foo_bar_baz_copy\f)))" -definition "baz_copy = (\ f. snd (snd (foo_bar_baz_copy\f)))" +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 = Abs_CFun (\(d1, d2, d3). foo_abs oo + ssum_map\ID\(sprod_map\(u_map\ID)\(u_map\d2)) + oo foo_rep)" + +definition + bar_copy :: + "('a foo \ 'a foo) \ ('a bar \ 'a bar) \ ('a baz \ 'a baz) \ + 'a bar \ 'a bar" +where + "bar_copy = Abs_CFun (\(d1, d2, d3). bar_abs oo + sprod_map\(u_map\ID)\(u_map\d3) 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 = Abs_CFun (\(d1, d2, d3). baz_abs oo + sprod_map\(u_map\ID)\(u_map\(convex_map\d1)) oo baz_rep)" + +definition + foo_bar_baz_copy :: + "('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))" lemma fix_foo_bar_baz_copy: "fix\foo_bar_baz_copy = (foo_map\ID, bar_map\ID, baz_map\ID)" -unfolding foo_bar_baz_copy_def foo_map_def bar_map_def baz_map_def -by simp +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_copy_def +unfolding foo_copy_def bar_copy_def baz_copy_def +unfolding foo_bar_baz_mapF_def +unfolding split_def +apply (subst beta_cfun, simp)+ +apply (rule refl) +done lemma foo_reach: "fst (fix\foo_bar_baz_copy)\x = x" -unfolding fix_foo_bar_baz_copy by (simp add: foo_map_ID) +unfolding fix_foo_bar_baz_copy fst_conv snd_conv +unfolding foo_map_ID by (rule ID1) lemma bar_reach: "fst (snd (fix\foo_bar_baz_copy))\x = x" -unfolding fix_foo_bar_baz_copy by (simp add: bar_map_ID) +unfolding fix_foo_bar_baz_copy fst_conv snd_conv +unfolding bar_map_ID by (rule ID1) lemma baz_reach: "snd (snd (fix\foo_bar_baz_copy))\x = x" -unfolding fix_foo_bar_baz_copy by (simp add: baz_map_ID) +unfolding fix_foo_bar_baz_copy fst_conv snd_conv +unfolding baz_map_ID by (rule ID1) end