src/HOLCF/ex/Strict_Fun.thy
author bulwahn
Mon, 29 Mar 2010 17:30:52 +0200
changeset 36032 dfd30b5b4e73
parent 35547 991a6af75978
permissions -rw-r--r--
adding specialisation of predicates to the predicate compiler
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
35167
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
     1
(*  Title:      HOLCF/ex/Strict_Fun.thy
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
     2
    Author:     Brian Huffman
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
     3
*)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
     4
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
     5
header {* The Strict Function Type *}
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
     6
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
     7
theory Strict_Fun
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
     8
imports HOLCF
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
     9
begin
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    10
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    11
pcpodef (open) ('a, 'b) sfun (infixr "->!" 0)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    12
  = "{f :: 'a \<rightarrow> 'b. f\<cdot>\<bottom> = \<bottom>}"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    13
by simp_all
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    14
35427
ad039d29e01c proper (type_)notation;
wenzelm
parents: 35167
diff changeset
    15
type_notation (xsymbols)
ad039d29e01c proper (type_)notation;
wenzelm
parents: 35167
diff changeset
    16
  sfun  (infixr "\<rightarrow>!" 0)
35167
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    17
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    18
text {* TODO: Define nice syntax for abstraction, application. *}
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    19
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    20
definition
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    21
  sfun_abs :: "('a \<rightarrow> 'b) \<rightarrow> ('a \<rightarrow>! 'b)"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    22
where
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    23
  "sfun_abs = (\<Lambda> f. Abs_sfun (strictify\<cdot>f))"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    24
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    25
definition
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    26
  sfun_rep :: "('a \<rightarrow>! 'b) \<rightarrow> 'a \<rightarrow> 'b"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    27
where
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    28
  "sfun_rep = (\<Lambda> f. Rep_sfun f)"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    29
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    30
lemma sfun_rep_beta: "sfun_rep\<cdot>f = Rep_sfun f"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    31
  unfolding sfun_rep_def by (simp add: cont_Rep_sfun)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    32
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    33
lemma sfun_rep_strict1 [simp]: "sfun_rep\<cdot>\<bottom> = \<bottom>"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    34
  unfolding sfun_rep_beta by (rule Rep_sfun_strict)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    35
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    36
lemma sfun_rep_strict2 [simp]: "sfun_rep\<cdot>f\<cdot>\<bottom> = \<bottom>"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    37
  unfolding sfun_rep_beta by (rule Rep_sfun [simplified])
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    38
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    39
lemma strictify_cancel: "f\<cdot>\<bottom> = \<bottom> \<Longrightarrow> strictify\<cdot>f = f"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    40
  by (simp add: expand_cfun_eq strictify_conv_if)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    41
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    42
lemma sfun_abs_sfun_rep: "sfun_abs\<cdot>(sfun_rep\<cdot>f) = f"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    43
  unfolding sfun_abs_def sfun_rep_def
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    44
  apply (simp add: cont_Abs_sfun cont_Rep_sfun)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    45
  apply (simp add: Rep_sfun_inject [symmetric] Abs_sfun_inverse)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    46
  apply (simp add: expand_cfun_eq strictify_conv_if)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    47
  apply (simp add: Rep_sfun [simplified])
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    48
  done
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    49
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    50
lemma sfun_rep_sfun_abs [simp]: "sfun_rep\<cdot>(sfun_abs\<cdot>f) = strictify\<cdot>f"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    51
  unfolding sfun_abs_def sfun_rep_def
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    52
  apply (simp add: cont_Abs_sfun cont_Rep_sfun)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    53
  apply (simp add: Abs_sfun_inverse)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    54
  done
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    55
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    56
lemma ep_pair_sfun: "ep_pair sfun_rep sfun_abs"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    57
apply default
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    58
apply (rule sfun_abs_sfun_rep)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    59
apply (simp add: expand_cfun_below strictify_conv_if)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    60
done
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    61
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    62
interpretation sfun: ep_pair sfun_rep sfun_abs
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    63
  by (rule ep_pair_sfun)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    64
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    65
subsection {* Map functional for strict function space *}
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    66
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    67
definition
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    68
  sfun_map :: "('b \<rightarrow> 'a) \<rightarrow> ('c \<rightarrow> 'd) \<rightarrow> ('a \<rightarrow>! 'c) \<rightarrow> ('b \<rightarrow>! 'd)"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    69
where
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    70
  "sfun_map = (\<Lambda> a b. sfun_abs oo cfun_map\<cdot>a\<cdot>b oo sfun_rep)"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    71
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    72
lemma sfun_map_ID: "sfun_map\<cdot>ID\<cdot>ID = ID"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    73
  unfolding sfun_map_def
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    74
  by (simp add: cfun_map_ID expand_cfun_eq)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    75
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    76
lemma sfun_map_map:
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    77
  assumes "f2\<cdot>\<bottom> = \<bottom>" and "g2\<cdot>\<bottom> = \<bottom>" shows
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    78
  "sfun_map\<cdot>f1\<cdot>g1\<cdot>(sfun_map\<cdot>f2\<cdot>g2\<cdot>p) =
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    79
    sfun_map\<cdot>(\<Lambda> x. f2\<cdot>(f1\<cdot>x))\<cdot>(\<Lambda> x. g1\<cdot>(g2\<cdot>x))\<cdot>p"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    80
unfolding sfun_map_def
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    81
by (simp add: expand_cfun_eq strictify_cancel assms cfun_map_map)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    82
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    83
lemma ep_pair_sfun_map:
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    84
  assumes 1: "ep_pair e1 p1"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    85
  assumes 2: "ep_pair e2 p2"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    86
  shows "ep_pair (sfun_map\<cdot>p1\<cdot>e2) (sfun_map\<cdot>e1\<cdot>p2)"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    87
proof
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    88
  interpret e1p1: pcpo_ep_pair e1 p1
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    89
    unfolding pcpo_ep_pair_def by fact
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    90
  interpret e2p2: pcpo_ep_pair e2 p2
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    91
    unfolding pcpo_ep_pair_def by fact
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    92
  fix f show "sfun_map\<cdot>e1\<cdot>p2\<cdot>(sfun_map\<cdot>p1\<cdot>e2\<cdot>f) = f"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    93
    unfolding sfun_map_def
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    94
    apply (simp add: sfun.e_eq_iff [symmetric] strictify_cancel)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    95
    apply (rule ep_pair.e_inverse)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    96
    apply (rule ep_pair_cfun_map [OF 1 2])
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    97
    done
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    98
  fix g show "sfun_map\<cdot>p1\<cdot>e2\<cdot>(sfun_map\<cdot>e1\<cdot>p2\<cdot>g) \<sqsubseteq> g"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
    99
    unfolding sfun_map_def
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   100
    apply (simp add: sfun.e_below_iff [symmetric] strictify_cancel)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   101
    apply (rule ep_pair.e_p_below)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   102
    apply (rule ep_pair_cfun_map [OF 1 2])
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   103
    done
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   104
qed
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   105
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   106
lemma deflation_sfun_map:
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   107
  assumes 1: "deflation d1"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   108
  assumes 2: "deflation d2"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   109
  shows "deflation (sfun_map\<cdot>d1\<cdot>d2)"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   110
apply (simp add: sfun_map_def)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   111
apply (rule deflation.intro)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   112
apply simp
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   113
apply (subst strictify_cancel)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   114
apply (simp add: cfun_map_def deflation_strict 1 2)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   115
apply (simp add: cfun_map_def deflation.idem 1 2)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   116
apply (simp add: sfun.e_below_iff [symmetric])
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   117
apply (subst strictify_cancel)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   118
apply (simp add: cfun_map_def deflation_strict 1 2)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   119
apply (rule deflation.below)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   120
apply (rule deflation_cfun_map [OF 1 2])
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   121
done
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   122
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   123
lemma finite_deflation_sfun_map:
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   124
  assumes 1: "finite_deflation d1"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   125
  assumes 2: "finite_deflation d2"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   126
  shows "finite_deflation (sfun_map\<cdot>d1\<cdot>d2)"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   127
proof (intro finite_deflation.intro finite_deflation_axioms.intro)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   128
  interpret d1: finite_deflation d1 by fact
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   129
  interpret d2: finite_deflation d2 by fact
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   130
  have "deflation d1" and "deflation d2" by fact+
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   131
  thus "deflation (sfun_map\<cdot>d1\<cdot>d2)" by (rule deflation_sfun_map)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   132
  from 1 2 have "finite_deflation (cfun_map\<cdot>d1\<cdot>d2)"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   133
    by (rule finite_deflation_cfun_map)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   134
  then have "finite {f. cfun_map\<cdot>d1\<cdot>d2\<cdot>f = f}"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   135
    by (rule finite_deflation.finite_fixes)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   136
  moreover have "inj (\<lambda>f. sfun_rep\<cdot>f)"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   137
    by (rule inj_onI, simp)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   138
  ultimately have "finite ((\<lambda>f. sfun_rep\<cdot>f) -` {f. cfun_map\<cdot>d1\<cdot>d2\<cdot>f = f})"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   139
    by (rule finite_vimageI)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   140
  then show "finite {f. sfun_map\<cdot>d1\<cdot>d2\<cdot>f = f}"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   141
    unfolding sfun_map_def sfun.e_eq_iff [symmetric]
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   142
    by (simp add: strictify_cancel
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   143
         deflation_strict `deflation d1` `deflation d2`)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   144
qed
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   145
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   146
subsection {* Strict function space is bifinite *}
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   147
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   148
instantiation sfun :: (bifinite, bifinite) bifinite
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   149
begin
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   150
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   151
definition
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   152
  "approx = (\<lambda>i. sfun_map\<cdot>(approx i)\<cdot>(approx i))"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   153
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   154
instance proof
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   155
  show "chain (approx :: nat \<Rightarrow> ('a \<rightarrow>! 'b) \<rightarrow> ('a \<rightarrow>! 'b))"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   156
    unfolding approx_sfun_def by simp
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   157
next
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   158
  fix x :: "'a \<rightarrow>! 'b"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   159
  show "(\<Squnion>i. approx i\<cdot>x) = x"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   160
    unfolding approx_sfun_def
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   161
    by (simp add: lub_distribs sfun_map_ID [unfolded ID_def])
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   162
next
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   163
  fix i :: nat and x :: "'a \<rightarrow>! 'b"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   164
  show "approx i\<cdot>(approx i\<cdot>x) = approx i\<cdot>x"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   165
    unfolding approx_sfun_def
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   166
    by (intro deflation.idem deflation_sfun_map deflation_approx)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   167
next
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   168
  fix i :: nat
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   169
  show "finite {x::'a \<rightarrow>! 'b. approx i\<cdot>x = x}"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   170
    unfolding approx_sfun_def
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   171
    by (intro finite_deflation.finite_fixes
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   172
              finite_deflation_sfun_map
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   173
              finite_deflation_approx)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   174
qed
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   175
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   176
end
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   177
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   178
subsection {* Strict function space is representable *}
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   179
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   180
instantiation sfun :: (rep, rep) rep
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   181
begin
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   182
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   183
definition
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   184
  "emb = udom_emb oo sfun_map\<cdot>prj\<cdot>emb"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   185
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   186
definition
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   187
  "prj = sfun_map\<cdot>emb\<cdot>prj oo udom_prj"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   188
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   189
instance
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   190
apply (default, unfold emb_sfun_def prj_sfun_def)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   191
apply (rule ep_pair_comp)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   192
apply (rule ep_pair_sfun_map)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   193
apply (rule ep_pair_emb_prj)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   194
apply (rule ep_pair_emb_prj)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   195
apply (rule ep_pair_udom)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   196
done
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   197
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   198
end
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   199
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   200
text {*
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   201
  A deflation constructor lets us configure the domain package to work
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   202
  with the strict function space type constructor.
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   203
*}
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   204
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   205
definition
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   206
  sfun_defl :: "TypeRep \<rightarrow> TypeRep \<rightarrow> TypeRep"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   207
where
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   208
  "sfun_defl = TypeRep_fun2 sfun_map"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   209
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   210
lemma cast_sfun_defl:
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   211
  "cast\<cdot>(sfun_defl\<cdot>A\<cdot>B) = udom_emb oo sfun_map\<cdot>(cast\<cdot>A)\<cdot>(cast\<cdot>B) oo udom_prj"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   212
unfolding sfun_defl_def
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   213
apply (rule cast_TypeRep_fun2)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   214
apply (erule (1) finite_deflation_sfun_map)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   215
done
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   216
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   217
lemma REP_sfun: "REP('a::rep \<rightarrow>! 'b::rep) = sfun_defl\<cdot>REP('a)\<cdot>REP('b)"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   218
apply (rule cast_eq_imp_eq, rule ext_cfun)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   219
apply (simp add: cast_REP cast_sfun_defl)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   220
apply (simp only: prj_sfun_def emb_sfun_def)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   221
apply (simp add: sfun_map_def cfun_map_def strictify_cancel)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   222
done
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   223
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   224
lemma isodefl_sfun:
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   225
  "isodefl d1 t1 \<Longrightarrow> isodefl d2 t2 \<Longrightarrow>
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   226
    isodefl (sfun_map\<cdot>d1\<cdot>d2) (sfun_defl\<cdot>t1\<cdot>t2)"
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   227
apply (rule isodeflI)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   228
apply (simp add: cast_sfun_defl cast_isodefl)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   229
apply (simp add: emb_sfun_def prj_sfun_def)
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   230
apply (simp add: sfun_map_map deflation_strict [OF isodefl_imp_deflation])
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   231
done
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   232
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   233
setup {*
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   234
  Domain_Isomorphism.add_type_constructor
35479
dffffe36344a store deflation thms for map functions in theory data
huffman
parents: 35167
diff changeset
   235
    (@{type_name "sfun"}, @{term sfun_defl}, @{const_name sfun_map}, @{thm REP_sfun},
dffffe36344a store deflation thms for map functions in theory data
huffman
parents: 35167
diff changeset
   236
       @{thm isodefl_sfun}, @{thm sfun_map_ID}, @{thm deflation_sfun_map})
35167
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   237
*}
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   238
eba22d68a0a7 add theory HOLCF/ex/Strict_Fun.thy
huffman
parents:
diff changeset
   239
end