src/HOLCF/IMP/Denotational.thy
author huffman
Sat, 22 May 2010 16:45:46 -0700
changeset 37085 b2073920448f
parent 35174 e15040ae75d7
permissions -rw-r--r--
disambiguate some syntax
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2841
c2508f4ab739 Added "discrete" CPOs and modified IMP to use those rather than "lift"
nipkow
parents: 2798
diff changeset
     1
(*  Title:      HOLCF/IMP/Denotational.thy
12600
wenzelm
parents: 12431
diff changeset
     2
    Author:     Tobias Nipkow and Robert Sandner, TUM
2798
f84be65745b2 The HOLCF-based den. sem. of IMP.
nipkow
parents:
diff changeset
     3
    Copyright   1996 TUM
f84be65745b2 The HOLCF-based den. sem. of IMP.
nipkow
parents:
diff changeset
     4
*)
f84be65745b2 The HOLCF-based den. sem. of IMP.
nipkow
parents:
diff changeset
     5
12431
07ec657249e5 converted to Isar
kleing
parents: 12338
diff changeset
     6
header "Denotational Semantics of Commands in HOLCF"
07ec657249e5 converted to Isar
kleing
parents: 12338
diff changeset
     7
26438
090ced251009 fixed theory imports;
wenzelm
parents: 21404
diff changeset
     8
theory Denotational imports HOLCF "../../HOL/IMP/Natural" begin
12431
07ec657249e5 converted to Isar
kleing
parents: 12338
diff changeset
     9
37085
b2073920448f disambiguate some syntax
huffman
parents: 35174
diff changeset
    10
text {* Disable conflicting syntax from HOL Map theory. *}
b2073920448f disambiguate some syntax
huffman
parents: 35174
diff changeset
    11
b2073920448f disambiguate some syntax
huffman
parents: 35174
diff changeset
    12
no_syntax
b2073920448f disambiguate some syntax
huffman
parents: 35174
diff changeset
    13
  "_maplet"  :: "['a, 'a] => maplet"             ("_ /|->/ _")
b2073920448f disambiguate some syntax
huffman
parents: 35174
diff changeset
    14
  "_maplets" :: "['a, 'a] => maplet"             ("_ /[|->]/ _")
b2073920448f disambiguate some syntax
huffman
parents: 35174
diff changeset
    15
  ""         :: "maplet => maplets"             ("_")
b2073920448f disambiguate some syntax
huffman
parents: 35174
diff changeset
    16
  "_Maplets" :: "[maplet, maplets] => maplets" ("_,/ _")
b2073920448f disambiguate some syntax
huffman
parents: 35174
diff changeset
    17
  "_MapUpd"  :: "['a ~=> 'b, maplets] => 'a ~=> 'b" ("_/'(_')" [900,0]900)
b2073920448f disambiguate some syntax
huffman
parents: 35174
diff changeset
    18
  "_Map"     :: "maplets => 'a ~=> 'b"            ("(1[_])")
b2073920448f disambiguate some syntax
huffman
parents: 35174
diff changeset
    19
12431
07ec657249e5 converted to Isar
kleing
parents: 12338
diff changeset
    20
subsection "Definition"
2798
f84be65745b2 The HOLCF-based den. sem. of IMP.
nipkow
parents:
diff changeset
    21
19737
wenzelm
parents: 16417
diff changeset
    22
definition
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 19737
diff changeset
    23
  dlift :: "(('a::type) discr -> 'b::pcpo) => ('a lift -> 'b)" where
19737
wenzelm
parents: 16417
diff changeset
    24
  "dlift f = (LAM x. case x of UU => UU | Def y => f\<cdot>(Discr y))"
2841
c2508f4ab739 Added "discrete" CPOs and modified IMP to use those rather than "lift"
nipkow
parents: 2798
diff changeset
    25
27362
a6dc1769fdda modernized specifications;
wenzelm
parents: 26438
diff changeset
    26
primrec D :: "com => state discr -> state lift"
a6dc1769fdda modernized specifications;
wenzelm
parents: 26438
diff changeset
    27
where
12431
07ec657249e5 converted to Isar
kleing
parents: 12338
diff changeset
    28
  "D(\<SKIP>) = (LAM s. Def(undiscr s))"
27362
a6dc1769fdda modernized specifications;
wenzelm
parents: 26438
diff changeset
    29
| "D(X :== a) = (LAM s. Def((undiscr s)[X \<mapsto> a(undiscr s)]))"
a6dc1769fdda modernized specifications;
wenzelm
parents: 26438
diff changeset
    30
| "D(c0 ; c1) = (dlift(D c1) oo (D c0))"
a6dc1769fdda modernized specifications;
wenzelm
parents: 26438
diff changeset
    31
| "D(\<IF> b \<THEN> c1 \<ELSE> c2) =
12600
wenzelm
parents: 12431
diff changeset
    32
        (LAM s. if b (undiscr s) then (D c1)\<cdot>s else (D c2)\<cdot>s)"
27362
a6dc1769fdda modernized specifications;
wenzelm
parents: 26438
diff changeset
    33
| "D(\<WHILE> b \<DO> c) =
12600
wenzelm
parents: 12431
diff changeset
    34
        fix\<cdot>(LAM w s. if b (undiscr s) then (dlift w)\<cdot>((D c)\<cdot>s)
2841
c2508f4ab739 Added "discrete" CPOs and modified IMP to use those rather than "lift"
nipkow
parents: 2798
diff changeset
    35
                      else Def(undiscr s))"
2798
f84be65745b2 The HOLCF-based den. sem. of IMP.
nipkow
parents:
diff changeset
    36
12431
07ec657249e5 converted to Isar
kleing
parents: 12338
diff changeset
    37
subsection
07ec657249e5 converted to Isar
kleing
parents: 12338
diff changeset
    38
  "Equivalence of Denotational Semantics in HOLCF and Evaluation Semantics in HOL"
07ec657249e5 converted to Isar
kleing
parents: 12338
diff changeset
    39
12600
wenzelm
parents: 12431
diff changeset
    40
lemma dlift_Def [simp]: "dlift f\<cdot>(Def x) = f\<cdot>(Discr x)"
wenzelm
parents: 12431
diff changeset
    41
  by (simp add: dlift_def)
wenzelm
parents: 12431
diff changeset
    42
wenzelm
parents: 12431
diff changeset
    43
lemma cont_dlift [iff]: "cont (%f. dlift f)"
wenzelm
parents: 12431
diff changeset
    44
  by (simp add: dlift_def)
12431
07ec657249e5 converted to Isar
kleing
parents: 12338
diff changeset
    45
12600
wenzelm
parents: 12431
diff changeset
    46
lemma dlift_is_Def [simp]:
wenzelm
parents: 12431
diff changeset
    47
    "(dlift f\<cdot>l = Def y) = (\<exists>x. l = Def x \<and> f\<cdot>(Discr x) = Def y)"
wenzelm
parents: 12431
diff changeset
    48
  by (simp add: dlift_def split: lift.split)
12431
07ec657249e5 converted to Isar
kleing
parents: 12338
diff changeset
    49
12600
wenzelm
parents: 12431
diff changeset
    50
lemma eval_implies_D: "\<langle>c,s\<rangle> \<longrightarrow>\<^sub>c t ==> D c\<cdot>(Discr s) = (Def t)"
wenzelm
parents: 12431
diff changeset
    51
  apply (induct set: evalc)
wenzelm
parents: 12431
diff changeset
    52
        apply simp_all
wenzelm
parents: 12431
diff changeset
    53
   apply (subst fix_eq)
wenzelm
parents: 12431
diff changeset
    54
   apply simp
wenzelm
parents: 12431
diff changeset
    55
  apply (subst fix_eq)
wenzelm
parents: 12431
diff changeset
    56
  apply simp
wenzelm
parents: 12431
diff changeset
    57
  done
12431
07ec657249e5 converted to Isar
kleing
parents: 12338
diff changeset
    58
12600
wenzelm
parents: 12431
diff changeset
    59
lemma D_implies_eval: "!s t. D c\<cdot>(Discr s) = (Def t) --> \<langle>c,s\<rangle> \<longrightarrow>\<^sub>c t"
wenzelm
parents: 12431
diff changeset
    60
  apply (induct c)
wenzelm
parents: 12431
diff changeset
    61
      apply simp
wenzelm
parents: 12431
diff changeset
    62
     apply simp
12431
07ec657249e5 converted to Isar
kleing
parents: 12338
diff changeset
    63
    apply force
12600
wenzelm
parents: 12431
diff changeset
    64
   apply (simp (no_asm))
12431
07ec657249e5 converted to Isar
kleing
parents: 12338
diff changeset
    65
   apply force
12600
wenzelm
parents: 12431
diff changeset
    66
  apply (simp (no_asm))
wenzelm
parents: 12431
diff changeset
    67
  apply (rule fix_ind)
wenzelm
parents: 12431
diff changeset
    68
    apply (fast intro!: adm_lemmas adm_chfindom ax_flat)
wenzelm
parents: 12431
diff changeset
    69
   apply (simp (no_asm))
wenzelm
parents: 12431
diff changeset
    70
  apply (simp (no_asm))
wenzelm
parents: 12431
diff changeset
    71
  apply safe
wenzelm
parents: 12431
diff changeset
    72
  apply fast
wenzelm
parents: 12431
diff changeset
    73
  done
12431
07ec657249e5 converted to Isar
kleing
parents: 12338
diff changeset
    74
12600
wenzelm
parents: 12431
diff changeset
    75
theorem D_is_eval: "(D c\<cdot>(Discr s) = (Def t)) = (\<langle>c,s\<rangle> \<longrightarrow>\<^sub>c t)"
wenzelm
parents: 12431
diff changeset
    76
  by (fast elim!: D_implies_eval [rule_format] eval_implies_D)
12431
07ec657249e5 converted to Isar
kleing
parents: 12338
diff changeset
    77
2798
f84be65745b2 The HOLCF-based den. sem. of IMP.
nipkow
parents:
diff changeset
    78
end