src/HOL/NanoJava/Example.thy
author wenzelm
Mon, 25 Feb 2002 20:48:14 +0100
changeset 12937 0c4fd7529467
parent 12934 6003b4f916c0
child 16417 9bc16273c2d4
permissions -rw-r--r--
clarified syntax of ``long'' statements: fixes/assumes/shows;
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
    ID:         $Id$
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
     3
    Author:     David von Oheimb
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
     4
    Copyright   2001 Technische Universitaet Muenchen
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
     5
*)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
     6
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
     7
header "Example"
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
     8
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
     9
theory Example = Equivalence:
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    10
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    11
text {*
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    12
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    13
\begin{verbatim}
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    14
class Nat {
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    15
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    16
  Nat pred;
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    17
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    18
  Nat suc() 
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    19
    { Nat n = new Nat(); n.pred = this; return n; }
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    20
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    21
  Nat eq(Nat n)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    22
    { if (this.pred != null) if (n.pred != null) return this.pred.eq(n.pred);
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    23
                             else return n.pred; // false
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    24
      else if (n.pred != null) return this.pred; // false
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    25
           else return this.suc(); // true
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    26
    }
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    27
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    28
  Nat add(Nat n)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    29
    { if (this.pred != null) return this.pred.add(n.suc()); else return n; }
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    30
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    31
  public static void main(String[] args) // test x+1=1+x
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    32
    {
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    33
	Nat one = new Nat().suc();
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    34
	Nat x   = new Nat().suc().suc().suc().suc();
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    35
	Nat ok = x.suc().eq(x.add(one));
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    36
        System.out.println(ok != null);
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    37
    }
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    38
}
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    39
\end{verbatim}
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    40
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
axioms This_neq_Par [simp]: "This \<noteq> Par"
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    44
       Res_neq_This [simp]: "Res  \<noteq> This"
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    45
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    46
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    47
subsection "Program representation"
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    48
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    49
consts N    :: cname ("Nat") (* with mixfix because of clash with NatDef.Nat *)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    50
consts pred :: fname
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    51
consts suc  :: mname
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    52
       add  :: mname
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    53
consts any  :: vname
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    54
syntax dummy:: expr ("<>")
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    55
       one  :: expr
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    56
translations 
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    57
      "<>"  == "LAcc any"
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    58
      "one" == "{Nat}new Nat..suc(<>)"
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    59
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    60
text {* The following properties could be derived from a more complete
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    61
        program model, which we leave out for laziness. *}
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    62
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    63
axioms Nat_no_subclasses [simp]: "D \<preceq>C Nat = (D=Nat)"
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    64
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    65
axioms method_Nat_add [simp]: "method Nat add = Some 
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    66
  \<lparr> par=Class Nat, res=Class Nat, lcl=[], 
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    67
   bdy= If((LAcc This..pred)) 
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    68
          (Res :== {Nat}(LAcc This..pred)..add({Nat}LAcc Par..suc(<>))) 
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    69
        Else Res :== LAcc Par \<rparr>"
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    70
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    71
axioms method_Nat_suc [simp]: "method Nat suc = Some 
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    72
  \<lparr> par=NT, res=Class Nat, lcl=[], 
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    73
   bdy= Res :== new Nat;; LAcc Res..pred :== LAcc This \<rparr>"
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    74
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    75
axioms field_Nat [simp]: "field Nat = empty(pred\<mapsto>Class Nat)"
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    76
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    77
lemma init_locs_Nat_add [simp]: "init_locs Nat add s = s"
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    78
by (simp add: init_locs_def init_vars_def)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    79
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    80
lemma init_locs_Nat_suc [simp]: "init_locs Nat suc s = s"
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    81
by (simp add: init_locs_def init_vars_def)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    82
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    83
lemma upd_obj_new_obj_Nat [simp]: 
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    84
  "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
    85
by (simp add: new_obj_def init_vars_def upd_obj_def Let_def)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    86
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    87
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    88
subsection "``atleast'' relation for interpretation of Nat ``values''"
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    89
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    90
consts Nat_atleast :: "state \<Rightarrow> val \<Rightarrow> nat \<Rightarrow> bool" ("_:_ \<ge> _" [51, 51, 51] 50)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    91
primrec "s:x\<ge>0     = (x\<noteq>Null)"
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    92
        "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)"
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    93
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    94
lemma Nat_atleast_lupd [rule_format, simp]: 
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    95
 "\<forall>s v. lupd(x\<mapsto>y) s:v \<ge> n = (s:v \<ge> n)"
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    96
apply (induct n)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    97
by  auto
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    98
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
    99
lemma Nat_atleast_set_locs [rule_format, simp]: 
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   100
 "\<forall>s v. set_locs l s:v \<ge> n = (s:v \<ge> n)"
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
11772
cf618fe8facd renamed reset_locs to del_locs
oheimb
parents: 11565
diff changeset
   104
lemma Nat_atleast_del_locs [rule_format, simp]: 
cf618fe8facd renamed reset_locs to del_locs
oheimb
parents: 11565
diff changeset
   105
 "\<forall>s v. del_locs 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
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   109
lemma Nat_atleast_NullD [rule_format]: "s:Null \<ge> n \<longrightarrow> False"
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   110
apply (induct n)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   111
by auto
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   112
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   113
lemma Nat_atleast_pred_NullD [rule_format]: 
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   114
"Null = get_field s a pred \<Longrightarrow> s:Addr a \<ge> n \<longrightarrow> n = 0"
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 dest: Nat_atleast_NullD)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   117
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   118
lemma Nat_atleast_mono [rule_format]: 
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   119
"\<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
   120
apply (induct n)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   121
by auto
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   122
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   123
lemma Nat_atleast_newC [rule_format]: 
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   124
  "heap s aa = None \<Longrightarrow> \<forall>v. s:v \<ge> n \<longrightarrow> hupd(aa\<mapsto>obj) s:v \<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
apply  auto
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   127
apply  (case_tac "aa=a")
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   128
apply   auto
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   129
apply (tactic "smp_tac 1 1")
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   130
apply (case_tac "aa=a")
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   131
apply  auto
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   132
done
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   133
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   134
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   135
subsection "Proof(s) using the Hoare logic"
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   136
12742
83cd2140977d cosmetics
oheimb
parents: 11772
diff changeset
   137
theorem add_homomorph_lb: 
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   138
  "{} \<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
   139
apply (rule hoare_ehoare.Meth) (* 1 *)
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   140
apply clarsimp
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   141
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
   142
        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
   143
prefer 2
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   144
apply  (clarsimp simp add: init_locs_def init_vars_def)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   145
apply rule
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   146
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
   147
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
   148
apply (clarsimp simp add: body_def)  (* 4 *)
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   149
apply (rename_tac n m)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   150
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
   151
        (\<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
   152
apply  (rule hoare_ehoare.FAcc)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   153
apply  (rule eConseq1)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   154
apply   (rule hoare_ehoare.LAcc)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   155
apply  fast
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   156
apply auto
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   157
prefer 2
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   158
apply  (rule hoare_ehoare.LAss)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   159
apply  (rule eConseq1)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   160
apply   (rule hoare_ehoare.LAcc)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   161
apply  (auto dest: Nat_atleast_pred_NullD)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   162
apply (rule hoare_ehoare.LAss)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   163
apply (rule_tac 
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   164
    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
   165
    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
   166
    in hoare_ehoare.Call) (* 13 *)
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   167
apply   (rule hoare_ehoare.FAcc)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   168
apply   (rule eConseq1)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   169
apply    (rule hoare_ehoare.LAcc)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   170
apply   clarify
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   171
apply   (drule sym, rotate_tac -1, frule (1) trans)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   172
apply   simp
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   173
prefer 2
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   174
apply  clarsimp
12742
83cd2140977d cosmetics
oheimb
parents: 11772
diff changeset
   175
apply  (rule hoare_ehoare.Meth) (* 17 *)
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   176
apply  clarsimp
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   177
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
   178
apply  (rule AxSem.Conseq)
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   179
apply   rule
12742
83cd2140977d cosmetics
oheimb
parents: 11772
diff changeset
   180
apply   (rule hoare_ehoare.Asm) (* 20 *)
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   181
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
   182
apply  (clarsimp split add: nat.split_asm dest!: Nat_atleast_mono)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   183
apply rule
12742
83cd2140977d cosmetics
oheimb
parents: 11772
diff changeset
   184
apply (rule hoare_ehoare.Call) (* 21 *)
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   185
apply   (rule hoare_ehoare.LAcc)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   186
apply  rule
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   187
apply  (rule hoare_ehoare.LAcc)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   188
apply clarify
12742
83cd2140977d cosmetics
oheimb
parents: 11772
diff changeset
   189
apply (rule hoare_ehoare.Meth) (* 24 *)
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   190
apply clarsimp
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   191
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
   192
apply (rule AxSem.Impl1)
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   193
apply (clarsimp simp add: body_def)
12742
83cd2140977d cosmetics
oheimb
parents: 11772
diff changeset
   194
apply (rule hoare_ehoare.Comp) (* 26 *)
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   195
prefer 2
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   196
apply  (rule hoare_ehoare.FAss)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   197
prefer 2
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   198
apply   rule
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   199
apply   (rule hoare_ehoare.LAcc)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   200
apply  (rule hoare_ehoare.LAcc)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   201
apply (rule hoare_ehoare.LAss)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   202
apply (rule eConseq1)
12742
83cd2140977d cosmetics
oheimb
parents: 11772
diff changeset
   203
apply  (rule hoare_ehoare.NewC) (* 32 *)
11565
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   204
apply (auto dest!: new_AddrD elim: Nat_atleast_newC)
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   205
done
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   206
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   207
ab004c0ecc63 Minor improvements, added Example
oheimb
parents:
diff changeset
   208
end