src/HOL/NanoJava/Example.thy
author wenzelm
Sat, 07 Apr 2012 16:41:59 +0200
changeset 47389 e8552cba702d
parent 44375 dfc2e722fe47
child 58889 5b7a9633cfa8
permissions -rw-r--r--
explicit checks stable_finished_theory/stable_command allow parallel asynchronous command transactions; tuned;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
     1
(*  Title:      HOL/NanoJava/Example.thy
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
     2
    Author:     David von Oheimb
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
     3
    Copyright   2001 Technische Universitaet Muenchen
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
     4
*)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
     5
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
     6
header "Example"
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
     7
39758
b8a53e3a0ee2 modernized primrecs
haftmann
parents: 35102
diff changeset
     8
theory Example
b8a53e3a0ee2 modernized primrecs
haftmann
parents: 35102
diff changeset
     9
imports Equivalence
b8a53e3a0ee2 modernized primrecs
haftmann
parents: 35102
diff changeset
    10
begin
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    11
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    12
text {*
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    13
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    14
\begin{verbatim}
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    15
class Nat {
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    16
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    17
  Nat pred;
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    18
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    19
  Nat suc() 
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    20
    { Nat n = new Nat(); n.pred = this; return n; }
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    21
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    22
  Nat eq(Nat n)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    23
    { if (this.pred != null) if (n.pred != null) return this.pred.eq(n.pred);
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    24
                             else return n.pred; // false
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    25
      else if (n.pred != null) return this.pred; // false
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    26
           else return this.suc(); // true
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    27
    }
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    28
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    29
  Nat add(Nat n)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    30
    { if (this.pred != null) return this.pred.add(n.suc()); else return n; }
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    31
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    32
  public static void main(String[] args) // test x+1=1+x
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    33
    {
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 21020
diff changeset
    34
        Nat one = new Nat().suc();
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 21020
diff changeset
    35
        Nat x   = new Nat().suc().suc().suc().suc();
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 21020
diff changeset
    36
        Nat ok = x.suc().eq(x.add(one));
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    37
        System.out.println(ok != null);
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    38
    }
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    39
}
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    40
\end{verbatim}
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    41
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    42
*}
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    43
44375
dfc2e722fe47 modernized specifications
krauss
parents: 39758
diff changeset
    44
axiomatization where
dfc2e722fe47 modernized specifications
krauss
parents: 39758
diff changeset
    45
  This_neq_Par [simp]: "This \<noteq> Par" and
dfc2e722fe47 modernized specifications
krauss
parents: 39758
diff changeset
    46
  Res_neq_This [simp]: "Res  \<noteq> This"
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    47
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    48
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    49
subsection "Program representation"
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    50
44375
dfc2e722fe47 modernized specifications
krauss
parents: 39758
diff changeset
    51
axiomatization 
dfc2e722fe47 modernized specifications
krauss
parents: 39758
diff changeset
    52
  N    :: cname ("Nat") (* with mixfix because of clash with NatDef.Nat *)
dfc2e722fe47 modernized specifications
krauss
parents: 39758
diff changeset
    53
  and pred :: fname
dfc2e722fe47 modernized specifications
krauss
parents: 39758
diff changeset
    54
  and suc add :: mname
dfc2e722fe47 modernized specifications
krauss
parents: 39758
diff changeset
    55
  and any  :: vname
35102
cc7a0b9f938c modernized translations;
wenzelm
parents: 32960
diff changeset
    56
cc7a0b9f938c modernized translations;
wenzelm
parents: 32960
diff changeset
    57
abbreviation
cc7a0b9f938c modernized translations;
wenzelm
parents: 32960
diff changeset
    58
  dummy :: expr ("<>")
cc7a0b9f938c modernized translations;
wenzelm
parents: 32960
diff changeset
    59
  where "<> == LAcc any"
cc7a0b9f938c modernized translations;
wenzelm
parents: 32960
diff changeset
    60
cc7a0b9f938c modernized translations;
wenzelm
parents: 32960
diff changeset
    61
abbreviation
cc7a0b9f938c modernized translations;
wenzelm
parents: 32960
diff changeset
    62
  one :: expr
cc7a0b9f938c modernized translations;
wenzelm
parents: 32960
diff changeset
    63
  where "one == {Nat}new Nat..suc(<>)"
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    64
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    65
text {* The following properties could be derived from a more complete
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    66
        program model, which we leave out for laziness. *}
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    67
44375
dfc2e722fe47 modernized specifications
krauss
parents: 39758
diff changeset
    68
axiomatization where Nat_no_subclasses [simp]: "D \<preceq>C Nat = (D=Nat)"
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    69
44375
dfc2e722fe47 modernized specifications
krauss
parents: 39758
diff changeset
    70
axiomatization where method_Nat_add [simp]: "method Nat add = Some 
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    71
  \<lparr> par=Class Nat, res=Class Nat, lcl=[], 
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    72
   bdy= If((LAcc This..pred)) 
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    73
          (Res :== {Nat}(LAcc This..pred)..add({Nat}LAcc Par..suc(<>))) 
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    74
        Else Res :== LAcc Par \<rparr>"
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    75
44375
dfc2e722fe47 modernized specifications
krauss
parents: 39758
diff changeset
    76
axiomatization where method_Nat_suc [simp]: "method Nat suc = Some 
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    77
  \<lparr> par=NT, res=Class Nat, lcl=[], 
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    78
   bdy= Res :== new Nat;; LAcc Res..pred :== LAcc This \<rparr>"
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    79
44375
dfc2e722fe47 modernized specifications
krauss
parents: 39758
diff changeset
    80
axiomatization where field_Nat [simp]: "field Nat = empty(pred\<mapsto>Class Nat)"
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    81
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    82
lemma init_locs_Nat_add [simp]: "init_locs Nat add s = s"
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    83
by (simp add: init_locs_def init_vars_def)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    84
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    85
lemma init_locs_Nat_suc [simp]: "init_locs Nat suc s = s"
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    86
by (simp add: init_locs_def init_vars_def)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    87
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    88
lemma upd_obj_new_obj_Nat [simp]: 
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    89
  "upd_obj a pred v (new_obj a Nat s) = hupd(a\<mapsto>(Nat, empty(pred\<mapsto>v))) s"
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    90
by (simp add: new_obj_def init_vars_def upd_obj_def Let_def)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    91
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    92
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    93
subsection "``atleast'' relation for interpretation of Nat ``values''"
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    94
39758
b8a53e3a0ee2 modernized primrecs
haftmann
parents: 35102
diff changeset
    95
primrec Nat_atleast :: "state \<Rightarrow> val \<Rightarrow> nat \<Rightarrow> bool" ("_:_ \<ge> _" [51, 51, 51] 50) where
b8a53e3a0ee2 modernized primrecs
haftmann
parents: 35102
diff changeset
    96
  "s:x\<ge>0     = (x\<noteq>Null)"
b8a53e3a0ee2 modernized primrecs
haftmann
parents: 35102
diff changeset
    97
| "s:x\<ge>Suc n = (\<exists>a. x=Addr a \<and> heap s a \<noteq> None \<and> s:get_field s a pred\<ge>n)"
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    98
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    99
lemma Nat_atleast_lupd [rule_format, simp]: 
21020
9af9ceb16d58 Adapted to changes in FixedPoint theory.
berghofe
parents: 16417
diff changeset
   100
 "\<forall>s v::val. lupd(x\<mapsto>y) s:v \<ge> n = (s:v \<ge> n)"
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   101
apply (induct n)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   102
by  auto
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   103
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   104
lemma Nat_atleast_set_locs [rule_format, simp]: 
21020
9af9ceb16d58 Adapted to changes in FixedPoint theory.
berghofe
parents: 16417
diff changeset
   105
 "\<forall>s v::val. set_locs l s:v \<ge> n = (s:v \<ge> n)"
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   106
apply (induct n)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   107
by auto
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   108
11772
cf618fe8facd renamed reset_locs to del_locs
oheimb
parents: 11565
diff changeset
   109
lemma Nat_atleast_del_locs [rule_format, simp]: 
21020
9af9ceb16d58 Adapted to changes in FixedPoint theory.
berghofe
parents: 16417
diff changeset
   110
 "\<forall>s v::val. del_locs s:v \<ge> n = (s:v \<ge> n)"
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   111
apply (induct n)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   112
by auto
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   113
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   114
lemma Nat_atleast_NullD [rule_format]: "s:Null \<ge> n \<longrightarrow> False"
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   115
apply (induct n)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   116
by auto
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   117
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   118
lemma Nat_atleast_pred_NullD [rule_format]: 
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   119
"Null = get_field s a pred \<Longrightarrow> s:Addr a \<ge> n \<longrightarrow> n = 0"
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   120
apply (induct n)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   121
by (auto dest: Nat_atleast_NullD)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   122
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   123
lemma Nat_atleast_mono [rule_format]: 
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   124
"\<forall>a. s:get_field s a pred \<ge> n \<longrightarrow> heap s a \<noteq> None \<longrightarrow> s:Addr a \<ge> n"
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   125
apply (induct n)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   126
by auto
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   127
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   128
lemma Nat_atleast_newC [rule_format]: 
21020
9af9ceb16d58 Adapted to changes in FixedPoint theory.
berghofe
parents: 16417
diff changeset
   129
  "heap s aa = None \<Longrightarrow> \<forall>v::val. s:v \<ge> n \<longrightarrow> hupd(aa\<mapsto>obj) s:v \<ge> n"
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   130
apply (induct n)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   131
apply  auto
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   132
apply  (case_tac "aa=a")
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   133
apply   auto
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   134
apply (tactic "smp_tac 1 1")
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   135
apply (case_tac "aa=a")
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   136
apply  auto
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   137
done
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   138
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   139
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   140
subsection "Proof(s) using the Hoare logic"
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   141
12742
83cd2140977d cosmetics
oheimb
parents: 11772
diff changeset
   142
theorem add_homomorph_lb: 
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   143
  "{} \<turnstile> {\<lambda>s. s:s<This> \<ge> X \<and> s:s<Par> \<ge> Y} Meth(Nat,add) {\<lambda>s. s:s<Res> \<ge> X+Y}"
12742
83cd2140977d cosmetics
oheimb
parents: 11772
diff changeset
   144
apply (rule hoare_ehoare.Meth) (* 1 *)
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   145
apply clarsimp
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   146
apply (rule_tac P'= "\<lambda>Z s. (s:s<This> \<ge> fst Z \<and> s:s<Par> \<ge> snd Z) \<and> D=Nat" and 
12934
6003b4f916c0 Clarification wrt. use of polymorphic variants of Hoare logic rules
oheimb
parents: 12742
diff changeset
   147
        Q'= "\<lambda>Z s. s:s<Res> \<ge> fst Z+snd Z" in AxSem.Conseq)
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   148
prefer 2
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   149
apply  (clarsimp simp add: init_locs_def init_vars_def)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   150
apply rule
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   151
apply (case_tac "D = Nat", simp_all, rule_tac [2] cFalse)
12934
6003b4f916c0 Clarification wrt. use of polymorphic variants of Hoare logic rules
oheimb
parents: 12742
diff changeset
   152
apply (rule_tac P = "\<lambda>Z Cm s. s:s<This> \<ge> fst Z \<and> s:s<Par> \<ge> snd Z" in AxSem.Impl1)
12742
83cd2140977d cosmetics
oheimb
parents: 11772
diff changeset
   153
apply (clarsimp simp add: body_def)  (* 4 *)
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   154
apply (rename_tac n m)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   155
apply (rule_tac Q = "\<lambda>v s. (s:s<This> \<ge> n \<and> s:s<Par> \<ge> m) \<and> 
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   156
        (\<exists>a. s<This> = Addr a \<and> v = get_field s a pred)" in hoare_ehoare.Cond)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   157
apply  (rule hoare_ehoare.FAcc)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   158
apply  (rule eConseq1)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   159
apply   (rule hoare_ehoare.LAcc)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   160
apply  fast
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   161
apply auto
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   162
prefer 2
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   163
apply  (rule hoare_ehoare.LAss)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   164
apply  (rule eConseq1)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   165
apply   (rule hoare_ehoare.LAcc)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   166
apply  (auto dest: Nat_atleast_pred_NullD)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   167
apply (rule hoare_ehoare.LAss)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   168
apply (rule_tac 
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   169
    Q = "\<lambda>v   s. (\<forall>m. n = Suc m \<longrightarrow> s:v \<ge> m) \<and> s:s<Par> \<ge> m" and 
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   170
    R = "\<lambda>T P s. (\<forall>m. n = Suc m \<longrightarrow> s:T \<ge> m) \<and> s:P  \<ge> Suc m" 
12742
83cd2140977d cosmetics
oheimb
parents: 11772
diff changeset
   171
    in hoare_ehoare.Call) (* 13 *)
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   172
apply   (rule hoare_ehoare.FAcc)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   173
apply   (rule eConseq1)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   174
apply    (rule hoare_ehoare.LAcc)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   175
apply   clarify
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   176
apply   (drule sym, rotate_tac -1, frule (1) trans)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   177
apply   simp
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   178
prefer 2
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   179
apply  clarsimp
12742
83cd2140977d cosmetics
oheimb
parents: 11772
diff changeset
   180
apply  (rule hoare_ehoare.Meth) (* 17 *)
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   181
apply  clarsimp
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   182
apply  (case_tac "D = Nat", simp_all, rule_tac [2] cFalse)
12934
6003b4f916c0 Clarification wrt. use of polymorphic variants of Hoare logic rules
oheimb
parents: 12742
diff changeset
   183
apply  (rule AxSem.Conseq)
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   184
apply   rule
12742
83cd2140977d cosmetics
oheimb
parents: 11772
diff changeset
   185
apply   (rule hoare_ehoare.Asm) (* 20 *)
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   186
apply   (rule_tac a = "((case n of 0 \<Rightarrow> 0 | Suc m \<Rightarrow> m),m+1)" in UN_I, rule+)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   187
apply  (clarsimp split add: nat.split_asm dest!: Nat_atleast_mono)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   188
apply rule
12742
83cd2140977d cosmetics
oheimb
parents: 11772
diff changeset
   189
apply (rule hoare_ehoare.Call) (* 21 *)
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   190
apply   (rule hoare_ehoare.LAcc)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   191
apply  rule
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   192
apply  (rule hoare_ehoare.LAcc)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   193
apply clarify
12742
83cd2140977d cosmetics
oheimb
parents: 11772
diff changeset
   194
apply (rule hoare_ehoare.Meth) (* 24 *)
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   195
apply clarsimp
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   196
apply  (case_tac "D = Nat", simp_all, rule_tac [2] cFalse)
12934
6003b4f916c0 Clarification wrt. use of polymorphic variants of Hoare logic rules
oheimb
parents: 12742
diff changeset
   197
apply (rule AxSem.Impl1)
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   198
apply (clarsimp simp add: body_def)
12742
83cd2140977d cosmetics
oheimb
parents: 11772
diff changeset
   199
apply (rule hoare_ehoare.Comp) (* 26 *)
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   200
prefer 2
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   201
apply  (rule hoare_ehoare.FAss)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   202
prefer 2
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   203
apply   rule
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   204
apply   (rule hoare_ehoare.LAcc)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   205
apply  (rule hoare_ehoare.LAcc)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   206
apply (rule hoare_ehoare.LAss)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   207
apply (rule eConseq1)
12742
83cd2140977d cosmetics
oheimb
parents: 11772
diff changeset
   208
apply  (rule hoare_ehoare.NewC) (* 32 *)
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   209
apply (auto dest!: new_AddrD elim: Nat_atleast_newC)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   210
done
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   211
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   212
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   213
end