src/HOLCF/Powerdomains.thy
author huffman
Sun, 28 Feb 2010 18:33:57 -0800
changeset 35479 dffffe36344a
parent 35473 c4d3d65856dd
child 39973 c62b4ff97bfc
permissions -rw-r--r--
store deflation thms for map functions in theory data
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
35473
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
     1
(*  Title:      HOLCF/Powerdomains.thy
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
     2
    Author:     Brian Huffman
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
     3
*)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
     4
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
     5
header {* Powerdomains *}
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
     6
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
     7
theory Powerdomains
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
     8
imports Representable ConvexPD
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
     9
begin
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    10
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    11
subsection {* Powerdomains are representable *}
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    12
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    13
text "Upper powerdomain of a representable type is representable."
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    14
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    15
instantiation upper_pd :: (rep) rep
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    16
begin
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    17
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    18
definition emb_upper_pd_def: "emb = udom_emb oo upper_map\<cdot>emb"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    19
definition prj_upper_pd_def: "prj = upper_map\<cdot>prj oo udom_prj"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    20
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    21
instance
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    22
 apply (intro_classes, unfold emb_upper_pd_def prj_upper_pd_def)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    23
 apply (intro ep_pair_comp ep_pair_upper_map ep_pair_emb_prj ep_pair_udom)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    24
done
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    25
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    26
end
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    27
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    28
text "Lower powerdomain of a representable type is representable."
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    29
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    30
instantiation lower_pd :: (rep) rep
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    31
begin
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    32
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    33
definition emb_lower_pd_def: "emb = udom_emb oo lower_map\<cdot>emb"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    34
definition prj_lower_pd_def: "prj = lower_map\<cdot>prj oo udom_prj"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    35
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    36
instance
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    37
 apply (intro_classes, unfold emb_lower_pd_def prj_lower_pd_def)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    38
 apply (intro ep_pair_comp ep_pair_lower_map ep_pair_emb_prj ep_pair_udom)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    39
done
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    40
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    41
end
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    42
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    43
text "Convex powerdomain of a representable type is representable."
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    44
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    45
instantiation convex_pd :: (rep) rep
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    46
begin
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    47
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    48
definition emb_convex_pd_def: "emb = udom_emb oo convex_map\<cdot>emb"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    49
definition prj_convex_pd_def: "prj = convex_map\<cdot>prj oo udom_prj"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    50
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    51
instance
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    52
 apply (intro_classes, unfold emb_convex_pd_def prj_convex_pd_def)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    53
 apply (intro ep_pair_comp ep_pair_convex_map ep_pair_emb_prj ep_pair_udom)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    54
done
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    55
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    56
end
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    57
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    58
subsection {* Finite deflation lemmas *}
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    59
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    60
text "TODO: move these lemmas somewhere else"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    61
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    62
lemma finite_compact_range_imp_finite_range:
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    63
  fixes d :: "'a::profinite \<rightarrow> 'b::cpo"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    64
  assumes "finite ((\<lambda>x. d\<cdot>x) ` {x. compact x})"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    65
  shows "finite (range (\<lambda>x. d\<cdot>x))"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    66
proof (rule finite_subset [OF _ prems])
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    67
  {
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    68
    fix x :: 'a
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    69
    have "range (\<lambda>i. d\<cdot>(approx i\<cdot>x)) \<subseteq> (\<lambda>x. d\<cdot>x) ` {x. compact x}"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    70
      by auto
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    71
    hence "finite (range (\<lambda>i. d\<cdot>(approx i\<cdot>x)))"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    72
      using prems by (rule finite_subset)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    73
    hence "finite_chain (\<lambda>i. d\<cdot>(approx i\<cdot>x))"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    74
      by (simp add: finite_range_imp_finch)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    75
    hence "\<exists>i. (\<Squnion>i. d\<cdot>(approx i\<cdot>x)) = d\<cdot>(approx i\<cdot>x)"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    76
      by (simp add: finite_chain_def maxinch_is_thelub)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    77
    hence "\<exists>i. d\<cdot>x = d\<cdot>(approx i\<cdot>x)"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    78
      by (simp add: lub_distribs)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    79
    hence "d\<cdot>x \<in> (\<lambda>x. d\<cdot>x) ` {x. compact x}"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    80
      by auto
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    81
  }
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    82
  thus "range (\<lambda>x. d\<cdot>x) \<subseteq> (\<lambda>x. d\<cdot>x) ` {x. compact x}"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    83
    by clarsimp
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    84
qed
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    85
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    86
lemma finite_deflation_upper_map:
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    87
  assumes "finite_deflation d" shows "finite_deflation (upper_map\<cdot>d)"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    88
proof (intro finite_deflation.intro finite_deflation_axioms.intro)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    89
  interpret d: finite_deflation d by fact
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    90
  have "deflation d" by fact
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    91
  thus "deflation (upper_map\<cdot>d)" by (rule deflation_upper_map)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    92
  have "finite (range (\<lambda>x. d\<cdot>x))" by (rule d.finite_range)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    93
  hence "finite (Rep_compact_basis -` range (\<lambda>x. d\<cdot>x))"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    94
    by (rule finite_vimageI, simp add: inj_on_def Rep_compact_basis_inject)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    95
  hence "finite (Pow (Rep_compact_basis -` range (\<lambda>x. d\<cdot>x)))" by simp
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    96
  hence "finite (Rep_pd_basis -` (Pow (Rep_compact_basis -` range (\<lambda>x. d\<cdot>x))))"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    97
    by (rule finite_vimageI, simp add: inj_on_def Rep_pd_basis_inject)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    98
  hence "finite (upper_principal ` Rep_pd_basis -` (Pow (Rep_compact_basis -` range (\<lambda>x. d\<cdot>x))))" by simp
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
    99
  hence "finite ((\<lambda>xs. upper_map\<cdot>d\<cdot>xs) ` range upper_principal)"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   100
    apply (rule finite_subset [COMP swap_prems_rl])
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   101
    apply (clarsimp, rename_tac t)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   102
    apply (induct_tac t rule: pd_basis_induct)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   103
    apply (simp only: upper_unit_Rep_compact_basis [symmetric] upper_map_unit)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   104
    apply (subgoal_tac "\<exists>b. d\<cdot>(Rep_compact_basis a) = Rep_compact_basis b")
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   105
    apply clarsimp
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   106
    apply (rule imageI)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   107
    apply (rule vimageI2)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   108
    apply (simp add: Rep_PDUnit)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   109
    apply (rule image_eqI)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   110
    apply (erule sym)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   111
    apply simp
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   112
    apply (rule exI)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   113
    apply (rule Abs_compact_basis_inverse [symmetric])
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   114
    apply (simp add: d.compact)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   115
    apply (simp only: upper_plus_principal [symmetric] upper_map_plus)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   116
    apply clarsimp
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   117
    apply (rule imageI)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   118
    apply (rule vimageI2)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   119
    apply (simp add: Rep_PDPlus)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   120
    done
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   121
  moreover have "{xs::'a upper_pd. compact xs} = range upper_principal"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   122
    by (auto dest: upper_pd.compact_imp_principal)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   123
  ultimately have "finite ((\<lambda>xs. upper_map\<cdot>d\<cdot>xs) ` {xs::'a upper_pd. compact xs})"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   124
    by simp
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   125
  hence "finite (range (\<lambda>xs. upper_map\<cdot>d\<cdot>xs))"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   126
    by (rule finite_compact_range_imp_finite_range)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   127
  thus "finite {xs. upper_map\<cdot>d\<cdot>xs = xs}"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   128
    by (rule finite_range_imp_finite_fixes)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   129
qed
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   130
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   131
lemma finite_deflation_lower_map:
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   132
  assumes "finite_deflation d" shows "finite_deflation (lower_map\<cdot>d)"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   133
proof (intro finite_deflation.intro finite_deflation_axioms.intro)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   134
  interpret d: finite_deflation d by fact
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   135
  have "deflation d" by fact
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   136
  thus "deflation (lower_map\<cdot>d)" by (rule deflation_lower_map)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   137
  have "finite (range (\<lambda>x. d\<cdot>x))" by (rule d.finite_range)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   138
  hence "finite (Rep_compact_basis -` range (\<lambda>x. d\<cdot>x))"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   139
    by (rule finite_vimageI, simp add: inj_on_def Rep_compact_basis_inject)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   140
  hence "finite (Pow (Rep_compact_basis -` range (\<lambda>x. d\<cdot>x)))" by simp
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   141
  hence "finite (Rep_pd_basis -` (Pow (Rep_compact_basis -` range (\<lambda>x. d\<cdot>x))))"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   142
    by (rule finite_vimageI, simp add: inj_on_def Rep_pd_basis_inject)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   143
  hence "finite (lower_principal ` Rep_pd_basis -` (Pow (Rep_compact_basis -` range (\<lambda>x. d\<cdot>x))))" by simp
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   144
  hence "finite ((\<lambda>xs. lower_map\<cdot>d\<cdot>xs) ` range lower_principal)"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   145
    apply (rule finite_subset [COMP swap_prems_rl])
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   146
    apply (clarsimp, rename_tac t)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   147
    apply (induct_tac t rule: pd_basis_induct)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   148
    apply (simp only: lower_unit_Rep_compact_basis [symmetric] lower_map_unit)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   149
    apply (subgoal_tac "\<exists>b. d\<cdot>(Rep_compact_basis a) = Rep_compact_basis b")
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   150
    apply clarsimp
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   151
    apply (rule imageI)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   152
    apply (rule vimageI2)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   153
    apply (simp add: Rep_PDUnit)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   154
    apply (rule image_eqI)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   155
    apply (erule sym)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   156
    apply simp
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   157
    apply (rule exI)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   158
    apply (rule Abs_compact_basis_inverse [symmetric])
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   159
    apply (simp add: d.compact)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   160
    apply (simp only: lower_plus_principal [symmetric] lower_map_plus)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   161
    apply clarsimp
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   162
    apply (rule imageI)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   163
    apply (rule vimageI2)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   164
    apply (simp add: Rep_PDPlus)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   165
    done
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   166
  moreover have "{xs::'a lower_pd. compact xs} = range lower_principal"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   167
    by (auto dest: lower_pd.compact_imp_principal)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   168
  ultimately have "finite ((\<lambda>xs. lower_map\<cdot>d\<cdot>xs) ` {xs::'a lower_pd. compact xs})"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   169
    by simp
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   170
  hence "finite (range (\<lambda>xs. lower_map\<cdot>d\<cdot>xs))"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   171
    by (rule finite_compact_range_imp_finite_range)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   172
  thus "finite {xs. lower_map\<cdot>d\<cdot>xs = xs}"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   173
    by (rule finite_range_imp_finite_fixes)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   174
qed
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   175
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   176
lemma finite_deflation_convex_map:
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   177
  assumes "finite_deflation d" shows "finite_deflation (convex_map\<cdot>d)"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   178
proof (intro finite_deflation.intro finite_deflation_axioms.intro)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   179
  interpret d: finite_deflation d by fact
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   180
  have "deflation d" by fact
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   181
  thus "deflation (convex_map\<cdot>d)" by (rule deflation_convex_map)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   182
  have "finite (range (\<lambda>x. d\<cdot>x))" by (rule d.finite_range)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   183
  hence "finite (Rep_compact_basis -` range (\<lambda>x. d\<cdot>x))"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   184
    by (rule finite_vimageI, simp add: inj_on_def Rep_compact_basis_inject)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   185
  hence "finite (Pow (Rep_compact_basis -` range (\<lambda>x. d\<cdot>x)))" by simp
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   186
  hence "finite (Rep_pd_basis -` (Pow (Rep_compact_basis -` range (\<lambda>x. d\<cdot>x))))"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   187
    by (rule finite_vimageI, simp add: inj_on_def Rep_pd_basis_inject)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   188
  hence "finite (convex_principal ` Rep_pd_basis -` (Pow (Rep_compact_basis -` range (\<lambda>x. d\<cdot>x))))" by simp
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   189
  hence "finite ((\<lambda>xs. convex_map\<cdot>d\<cdot>xs) ` range convex_principal)"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   190
    apply (rule finite_subset [COMP swap_prems_rl])
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   191
    apply (clarsimp, rename_tac t)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   192
    apply (induct_tac t rule: pd_basis_induct)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   193
    apply (simp only: convex_unit_Rep_compact_basis [symmetric] convex_map_unit)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   194
    apply (subgoal_tac "\<exists>b. d\<cdot>(Rep_compact_basis a) = Rep_compact_basis b")
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   195
    apply clarsimp
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   196
    apply (rule imageI)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   197
    apply (rule vimageI2)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   198
    apply (simp add: Rep_PDUnit)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   199
    apply (rule image_eqI)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   200
    apply (erule sym)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   201
    apply simp
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   202
    apply (rule exI)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   203
    apply (rule Abs_compact_basis_inverse [symmetric])
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   204
    apply (simp add: d.compact)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   205
    apply (simp only: convex_plus_principal [symmetric] convex_map_plus)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   206
    apply clarsimp
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   207
    apply (rule imageI)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   208
    apply (rule vimageI2)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   209
    apply (simp add: Rep_PDPlus)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   210
    done
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   211
  moreover have "{xs::'a convex_pd. compact xs} = range convex_principal"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   212
    by (auto dest: convex_pd.compact_imp_principal)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   213
  ultimately have "finite ((\<lambda>xs. convex_map\<cdot>d\<cdot>xs) ` {xs::'a convex_pd. compact xs})"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   214
    by simp
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   215
  hence "finite (range (\<lambda>xs. convex_map\<cdot>d\<cdot>xs))"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   216
    by (rule finite_compact_range_imp_finite_range)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   217
  thus "finite {xs. convex_map\<cdot>d\<cdot>xs = xs}"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   218
    by (rule finite_range_imp_finite_fixes)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   219
qed
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   220
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   221
subsection {* Deflation combinators *}
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   222
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   223
definition "upper_defl = TypeRep_fun1 upper_map"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   224
definition "lower_defl = TypeRep_fun1 lower_map"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   225
definition "convex_defl = TypeRep_fun1 convex_map"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   226
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   227
lemma cast_upper_defl:
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   228
  "cast\<cdot>(upper_defl\<cdot>A) = udom_emb oo upper_map\<cdot>(cast\<cdot>A) oo udom_prj"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   229
unfolding upper_defl_def
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   230
apply (rule cast_TypeRep_fun1)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   231
apply (erule finite_deflation_upper_map)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   232
done
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   233
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   234
lemma cast_lower_defl:
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   235
  "cast\<cdot>(lower_defl\<cdot>A) = udom_emb oo lower_map\<cdot>(cast\<cdot>A) oo udom_prj"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   236
unfolding lower_defl_def
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   237
apply (rule cast_TypeRep_fun1)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   238
apply (erule finite_deflation_lower_map)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   239
done
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   240
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   241
lemma cast_convex_defl:
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   242
  "cast\<cdot>(convex_defl\<cdot>A) = udom_emb oo convex_map\<cdot>(cast\<cdot>A) oo udom_prj"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   243
unfolding convex_defl_def
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   244
apply (rule cast_TypeRep_fun1)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   245
apply (erule finite_deflation_convex_map)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   246
done
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   247
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   248
lemma REP_upper: "REP('a upper_pd) = upper_defl\<cdot>REP('a)"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   249
apply (rule cast_eq_imp_eq, rule ext_cfun)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   250
apply (simp add: cast_REP cast_upper_defl)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   251
apply (simp add: prj_upper_pd_def)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   252
apply (simp add: emb_upper_pd_def)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   253
apply (simp add: upper_map_map cfcomp1)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   254
done
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   255
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   256
lemma REP_lower: "REP('a lower_pd) = lower_defl\<cdot>REP('a)"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   257
apply (rule cast_eq_imp_eq, rule ext_cfun)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   258
apply (simp add: cast_REP cast_lower_defl)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   259
apply (simp add: prj_lower_pd_def)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   260
apply (simp add: emb_lower_pd_def)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   261
apply (simp add: lower_map_map cfcomp1)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   262
done
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   263
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   264
lemma REP_convex: "REP('a convex_pd) = convex_defl\<cdot>REP('a)"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   265
apply (rule cast_eq_imp_eq, rule ext_cfun)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   266
apply (simp add: cast_REP cast_convex_defl)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   267
apply (simp add: prj_convex_pd_def)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   268
apply (simp add: emb_convex_pd_def)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   269
apply (simp add: convex_map_map cfcomp1)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   270
done
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   271
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   272
lemma isodefl_upper:
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   273
  "isodefl d t \<Longrightarrow> isodefl (upper_map\<cdot>d) (upper_defl\<cdot>t)"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   274
apply (rule isodeflI)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   275
apply (simp add: cast_upper_defl cast_isodefl)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   276
apply (simp add: emb_upper_pd_def prj_upper_pd_def)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   277
apply (simp add: upper_map_map)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   278
done
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   279
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   280
lemma isodefl_lower:
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   281
  "isodefl d t \<Longrightarrow> isodefl (lower_map\<cdot>d) (lower_defl\<cdot>t)"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   282
apply (rule isodeflI)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   283
apply (simp add: cast_lower_defl cast_isodefl)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   284
apply (simp add: emb_lower_pd_def prj_lower_pd_def)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   285
apply (simp add: lower_map_map)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   286
done
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   287
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   288
lemma isodefl_convex:
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   289
  "isodefl d t \<Longrightarrow> isodefl (convex_map\<cdot>d) (convex_defl\<cdot>t)"
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   290
apply (rule isodeflI)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   291
apply (simp add: cast_convex_defl cast_isodefl)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   292
apply (simp add: emb_convex_pd_def prj_convex_pd_def)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   293
apply (simp add: convex_map_map)
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   294
done
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   295
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   296
subsection {* Domain package setup for powerdomains *}
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   297
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   298
setup {*
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   299
  fold Domain_Isomorphism.add_type_constructor
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   300
    [(@{type_name "upper_pd"}, @{term upper_defl}, @{const_name upper_map},
35479
dffffe36344a store deflation thms for map functions in theory data
huffman
parents: 35473
diff changeset
   301
        @{thm REP_upper}, @{thm isodefl_upper}, @{thm upper_map_ID},
dffffe36344a store deflation thms for map functions in theory data
huffman
parents: 35473
diff changeset
   302
          @{thm deflation_upper_map}),
35473
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   303
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   304
     (@{type_name "lower_pd"}, @{term lower_defl}, @{const_name lower_map},
35479
dffffe36344a store deflation thms for map functions in theory data
huffman
parents: 35473
diff changeset
   305
        @{thm REP_lower}, @{thm isodefl_lower}, @{thm lower_map_ID},
dffffe36344a store deflation thms for map functions in theory data
huffman
parents: 35473
diff changeset
   306
          @{thm deflation_lower_map}),
35473
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   307
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   308
     (@{type_name "convex_pd"}, @{term convex_defl}, @{const_name convex_map},
35479
dffffe36344a store deflation thms for map functions in theory data
huffman
parents: 35473
diff changeset
   309
        @{thm REP_convex}, @{thm isodefl_convex}, @{thm convex_map_ID},
dffffe36344a store deflation thms for map functions in theory data
huffman
parents: 35473
diff changeset
   310
          @{thm deflation_convex_map})]
35473
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   311
*}
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   312
c4d3d65856dd move some powerdomain stuff into a new file
huffman
parents:
diff changeset
   313
end