src/ZF/IMP/Com.thy
author blanchet
Mon, 15 Sep 2014 10:49:07 +0200
changeset 58335 a5a3b576fcfb
parent 40945 b8703f63bfb2
child 58871 c399ae4b836f
permissions -rw-r--r--
generate 'code' attribute only if 'code' plugin is enabled
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1478
2b8c2a7547ab expanded tabs
clasohm
parents: 1401
diff changeset
     1
(*  Title:      ZF/IMP/Com.thy
40945
b8703f63bfb2 recoded latin1 as utf8;
wenzelm
parents: 35762
diff changeset
     2
    Author:     Heiko Loetzbeyer and Robert Sandner, TU München
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
     3
*)
482
3a4e092ba69c Initial revision
nipkow
parents:
diff changeset
     4
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
     5
header {* Arithmetic expressions, boolean expressions, commands *}
482
3a4e092ba69c Initial revision
nipkow
parents:
diff changeset
     6
16417
9bc16273c2d4 migrated theory headers to new format
haftmann
parents: 12610
diff changeset
     7
theory Com imports Main begin
511
b2be4790da7a re-organized using new theory sections
lcp
parents: 482
diff changeset
     8
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
     9
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    10
subsection {* Arithmetic expressions *}
511
b2be4790da7a re-organized using new theory sections
lcp
parents: 482
diff changeset
    11
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    12
consts
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    13
  loc :: i
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    14
  aexp :: i
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    15
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    16
datatype \<subseteq> "univ(loc \<union> (nat -> nat) \<union> ((nat \<times> nat) -> nat))"
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    17
  aexp = N ("n \<in> nat")
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    18
       | X ("x \<in> loc")
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    19
       | Op1 ("f \<in> nat -> nat", "a \<in> aexp")
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    20
       | Op2 ("f \<in> (nat \<times> nat) -> nat", "a0 \<in> aexp", "a1 \<in> aexp")
511
b2be4790da7a re-organized using new theory sections
lcp
parents: 482
diff changeset
    21
b2be4790da7a re-organized using new theory sections
lcp
parents: 482
diff changeset
    22
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    23
consts evala :: i
35068
544867142ea4 modernized translations;
wenzelm
parents: 22808
diff changeset
    24
544867142ea4 modernized translations;
wenzelm
parents: 22808
diff changeset
    25
abbreviation
544867142ea4 modernized translations;
wenzelm
parents: 22808
diff changeset
    26
  evala_syntax :: "[i, i] => o"    (infixl "-a->" 50)
544867142ea4 modernized translations;
wenzelm
parents: 22808
diff changeset
    27
  where "p -a-> n == <p,n> \<in> evala"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    28
511
b2be4790da7a re-organized using new theory sections
lcp
parents: 482
diff changeset
    29
inductive
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    30
  domains "evala" \<subseteq> "(aexp \<times> (loc -> nat)) \<times> nat"
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    31
  intros
12606
cf1715a5f5ec conversion to Isar/ZF
paulson
parents: 11320
diff changeset
    32
    N:   "[| n \<in> nat;  sigma \<in> loc->nat |] ==> <N(n),sigma> -a-> n"
cf1715a5f5ec conversion to Isar/ZF
paulson
parents: 11320
diff changeset
    33
    X:   "[| x \<in> loc;  sigma \<in> loc->nat |] ==> <X(x),sigma> -a-> sigma`x"
cf1715a5f5ec conversion to Isar/ZF
paulson
parents: 11320
diff changeset
    34
    Op1: "[| <e,sigma> -a-> n; f \<in> nat -> nat |] ==> <Op1(f,e),sigma> -a-> f`n"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    35
    Op2: "[| <e0,sigma> -a-> n0;  <e1,sigma>  -a-> n1; f \<in> (nat\<times>nat) -> nat |]
12606
cf1715a5f5ec conversion to Isar/ZF
paulson
parents: 11320
diff changeset
    36
          ==> <Op2(f,e0,e1),sigma> -a-> f`<n0,n1>"
cf1715a5f5ec conversion to Isar/ZF
paulson
parents: 11320
diff changeset
    37
  type_intros aexp.intros apply_funtype
511
b2be4790da7a re-organized using new theory sections
lcp
parents: 482
diff changeset
    38
b2be4790da7a re-organized using new theory sections
lcp
parents: 482
diff changeset
    39
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    40
subsection {* Boolean expressions *}
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    41
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    42
consts bexp :: i
511
b2be4790da7a re-organized using new theory sections
lcp
parents: 482
diff changeset
    43
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    44
datatype \<subseteq> "univ(aexp \<union> ((nat \<times> nat)->bool))"
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    45
  bexp = true
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    46
       | false
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    47
       | ROp  ("f \<in> (nat \<times> nat)->bool", "a0 \<in> aexp", "a1 \<in> aexp")
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    48
       | noti ("b \<in> bexp")
22808
a7daa74e2980 eliminated unnamed infixes, tuned syntax;
wenzelm
parents: 19796
diff changeset
    49
       | andi ("b0 \<in> bexp", "b1 \<in> bexp")      (infixl "andi" 60)
a7daa74e2980 eliminated unnamed infixes, tuned syntax;
wenzelm
parents: 19796
diff changeset
    50
       | ori  ("b0 \<in> bexp", "b1 \<in> bexp")      (infixl "ori" 60)
511
b2be4790da7a re-organized using new theory sections
lcp
parents: 482
diff changeset
    51
b2be4790da7a re-organized using new theory sections
lcp
parents: 482
diff changeset
    52
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    53
consts evalb :: i
35068
544867142ea4 modernized translations;
wenzelm
parents: 22808
diff changeset
    54
544867142ea4 modernized translations;
wenzelm
parents: 22808
diff changeset
    55
abbreviation
544867142ea4 modernized translations;
wenzelm
parents: 22808
diff changeset
    56
  evalb_syntax :: "[i,i] => o"    (infixl "-b->" 50)
544867142ea4 modernized translations;
wenzelm
parents: 22808
diff changeset
    57
  where "p -b-> b == <p,b> \<in> evalb"
511
b2be4790da7a re-organized using new theory sections
lcp
parents: 482
diff changeset
    58
b2be4790da7a re-organized using new theory sections
lcp
parents: 482
diff changeset
    59
inductive
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    60
  domains "evalb" \<subseteq> "(bexp \<times> (loc -> nat)) \<times> bool"
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    61
  intros
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    62
    true:  "[| sigma \<in> loc -> nat |] ==> <true,sigma> -b-> 1"
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    63
    false: "[| sigma \<in> loc -> nat |] ==> <false,sigma> -b-> 0"
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    64
    ROp:   "[| <a0,sigma> -a-> n0; <a1,sigma> -a-> n1; f \<in> (nat*nat)->bool |]
1478
2b8c2a7547ab expanded tabs
clasohm
parents: 1401
diff changeset
    65
           ==> <ROp(f,a0,a1),sigma> -b-> f`<n0,n1> "
12606
cf1715a5f5ec conversion to Isar/ZF
paulson
parents: 11320
diff changeset
    66
    noti:  "[| <b,sigma> -b-> w |] ==> <noti(b),sigma> -b-> not(w)"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    67
    andi:  "[| <b0,sigma> -b-> w0; <b1,sigma> -b-> w1 |]
1155
928a16e02f9f removed \...\ inside strings
clasohm
parents: 810
diff changeset
    68
          ==> <b0 andi b1,sigma> -b-> (w0 and w1)"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    69
    ori:   "[| <b0,sigma> -b-> w0; <b1,sigma> -b-> w1 |]
1478
2b8c2a7547ab expanded tabs
clasohm
parents: 1401
diff changeset
    70
            ==> <b0 ori b1,sigma> -b-> (w0 or w1)"
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    71
  type_intros  bexp.intros
12606
cf1715a5f5ec conversion to Isar/ZF
paulson
parents: 11320
diff changeset
    72
               apply_funtype and_type or_type bool_1I bool_0I not_type
cf1715a5f5ec conversion to Isar/ZF
paulson
parents: 11320
diff changeset
    73
  type_elims   evala.dom_subset [THEN subsetD, elim_format]
511
b2be4790da7a re-organized using new theory sections
lcp
parents: 482
diff changeset
    74
b2be4790da7a re-organized using new theory sections
lcp
parents: 482
diff changeset
    75
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    76
subsection {* Commands *}
511
b2be4790da7a re-organized using new theory sections
lcp
parents: 482
diff changeset
    77
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    78
consts com :: i
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    79
datatype com =
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    80
    skip                                  ("\<SKIP>" [])
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    81
  | assignment ("x \<in> loc", "a \<in> aexp")       (infixl "\<ASSN>" 60)
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    82
  | semicolon ("c0 \<in> com", "c1 \<in> com")       ("_\<SEQ> _"  [60, 60] 10)
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    83
  | while ("b \<in> bexp", "c \<in> com")            ("\<WHILE> _ \<DO> _"  60)
19796
d86e7b1fc472 quoted "if";
wenzelm
parents: 16417
diff changeset
    84
  | "if" ("b \<in> bexp", "c0 \<in> com", "c1 \<in> com")    ("\<IF> _ \<THEN> _ \<ELSE> _" 60)
511
b2be4790da7a re-organized using new theory sections
lcp
parents: 482
diff changeset
    85
b2be4790da7a re-organized using new theory sections
lcp
parents: 482
diff changeset
    86
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    87
consts evalc :: i
35068
544867142ea4 modernized translations;
wenzelm
parents: 22808
diff changeset
    88
544867142ea4 modernized translations;
wenzelm
parents: 22808
diff changeset
    89
abbreviation
544867142ea4 modernized translations;
wenzelm
parents: 22808
diff changeset
    90
  evalc_syntax :: "[i, i] => o"    (infixl "-c->" 50)
544867142ea4 modernized translations;
wenzelm
parents: 22808
diff changeset
    91
  where "p -c-> s == <p,s> \<in> evalc"
511
b2be4790da7a re-organized using new theory sections
lcp
parents: 482
diff changeset
    92
b2be4790da7a re-organized using new theory sections
lcp
parents: 482
diff changeset
    93
inductive
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    94
  domains "evalc" \<subseteq> "(com \<times> (loc -> nat)) \<times> (loc -> nat)"
12606
cf1715a5f5ec conversion to Isar/ZF
paulson
parents: 11320
diff changeset
    95
  intros
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    96
    skip:    "[| sigma \<in> loc -> nat |] ==> <\<SKIP>,sigma> -c-> sigma"
12606
cf1715a5f5ec conversion to Isar/ZF
paulson
parents: 11320
diff changeset
    97
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    98
    assign:  "[| m \<in> nat; x \<in> loc; <a,sigma> -a-> m |]
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
    99
              ==> <x \<ASSN> a,sigma> -c-> sigma(x:=m)"
511
b2be4790da7a re-organized using new theory sections
lcp
parents: 482
diff changeset
   100
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
   101
    semi:    "[| <c0,sigma> -c-> sigma2; <c1,sigma2> -c-> sigma1 |]
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
   102
              ==> <c0\<SEQ> c1, sigma> -c-> sigma1"
12606
cf1715a5f5ec conversion to Isar/ZF
paulson
parents: 11320
diff changeset
   103
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
   104
    if1:     "[| b \<in> bexp; c1 \<in> com; sigma \<in> loc->nat;
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
   105
                 <b,sigma> -b-> 1; <c0,sigma> -c-> sigma1 |]
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
   106
              ==> <\<IF> b \<THEN> c0 \<ELSE> c1, sigma> -c-> sigma1"
511
b2be4790da7a re-organized using new theory sections
lcp
parents: 482
diff changeset
   107
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
   108
    if0:     "[| b \<in> bexp; c0 \<in> com; sigma \<in> loc->nat;
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
   109
                 <b,sigma> -b-> 0; <c1,sigma> -c-> sigma1 |]
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
   110
               ==> <\<IF> b \<THEN> c0 \<ELSE> c1, sigma> -c-> sigma1"
12606
cf1715a5f5ec conversion to Isar/ZF
paulson
parents: 11320
diff changeset
   111
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
   112
    while0:   "[| c \<in> com; <b, sigma> -b-> 0 |]
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
   113
               ==> <\<WHILE> b \<DO> c,sigma> -c-> sigma"
511
b2be4790da7a re-organized using new theory sections
lcp
parents: 482
diff changeset
   114
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
   115
    while1:   "[| c \<in> com; <b,sigma> -b-> 1; <c,sigma> -c-> sigma2;
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
   116
                  <\<WHILE> b \<DO> c, sigma2> -c-> sigma1 |]
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
   117
               ==> <\<WHILE> b \<DO> c, sigma> -c-> sigma1"
12606
cf1715a5f5ec conversion to Isar/ZF
paulson
parents: 11320
diff changeset
   118
cf1715a5f5ec conversion to Isar/ZF
paulson
parents: 11320
diff changeset
   119
  type_intros  com.intros update_type
cf1715a5f5ec conversion to Isar/ZF
paulson
parents: 11320
diff changeset
   120
  type_elims   evala.dom_subset [THEN subsetD, elim_format]
cf1715a5f5ec conversion to Isar/ZF
paulson
parents: 11320
diff changeset
   121
               evalb.dom_subset [THEN subsetD, elim_format]
cf1715a5f5ec conversion to Isar/ZF
paulson
parents: 11320
diff changeset
   122
cf1715a5f5ec conversion to Isar/ZF
paulson
parents: 11320
diff changeset
   123
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
   124
subsection {* Misc lemmas *}
511
b2be4790da7a re-organized using new theory sections
lcp
parents: 482
diff changeset
   125
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
   126
lemmas evala_1 [simp] = evala.dom_subset [THEN subsetD, THEN SigmaD1, THEN SigmaD1]
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
   127
  and evala_2 [simp] = evala.dom_subset [THEN subsetD, THEN SigmaD1, THEN SigmaD2]
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
   128
  and evala_3 [simp] = evala.dom_subset [THEN subsetD, THEN SigmaD2]
511
b2be4790da7a re-organized using new theory sections
lcp
parents: 482
diff changeset
   129
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
   130
lemmas evalb_1 [simp] = evalb.dom_subset [THEN subsetD, THEN SigmaD1, THEN SigmaD1]
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
   131
  and evalb_2 [simp] = evalb.dom_subset [THEN subsetD, THEN SigmaD1, THEN SigmaD2]
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
   132
  and evalb_3 [simp] = evalb.dom_subset [THEN subsetD, THEN SigmaD2]
511
b2be4790da7a re-organized using new theory sections
lcp
parents: 482
diff changeset
   133
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
   134
lemmas evalc_1 [simp] = evalc.dom_subset [THEN subsetD, THEN SigmaD1, THEN SigmaD1]
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
   135
  and evalc_2 [simp] = evalc.dom_subset [THEN subsetD, THEN SigmaD1, THEN SigmaD2]
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
   136
  and evalc_3 [simp] = evalc.dom_subset [THEN subsetD, THEN SigmaD2]
511
b2be4790da7a re-organized using new theory sections
lcp
parents: 482
diff changeset
   137
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
   138
inductive_cases
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
   139
    evala_N_E [elim!]: "<N(n),sigma> -a-> i"
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
   140
  and evala_X_E [elim!]: "<X(x),sigma> -a-> i"
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
   141
  and evala_Op1_E [elim!]: "<Op1(f,e),sigma> -a-> i"
8b9845807f77 tuned document sources;
wenzelm
parents: 12606
diff changeset
   142
  and evala_Op2_E [elim!]: "<Op2(f,a1,a2),sigma>  -a-> i"
511
b2be4790da7a re-organized using new theory sections
lcp
parents: 482
diff changeset
   143
b2be4790da7a re-organized using new theory sections
lcp
parents: 482
diff changeset
   144
end