src/HOL/IMP/Def_Init_Big.thy
author haftmann
Fri, 01 Nov 2013 18:51:14 +0100
changeset 54230 b1d955791529
parent 53015 a1119cf551e8
child 67406 23307fd33906
permissions -rw-r--r--
more simplification rules on unary and binary minus
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
43158
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
     1
(* Author: Tobias Nipkow *)
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
     2
50161
4fc4237488ab tuned names
nipkow
parents: 47818
diff changeset
     3
theory Def_Init_Big
52726
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
     4
imports Def_Init_Exp Def_Init
43158
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
     5
begin
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
     6
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
     7
subsection "Initialization-Sensitive Big Step Semantics"
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
     8
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
     9
inductive
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    10
  big_step :: "(com \<times> state option) \<Rightarrow> state option \<Rightarrow> bool" (infix "\<Rightarrow>" 55)
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    11
where
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    12
None: "(c,None) \<Rightarrow> None" |
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    13
Skip: "(SKIP,s) \<Rightarrow> s" |
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    14
AssignNone: "aval a s = None \<Longrightarrow> (x ::= a, Some s) \<Rightarrow> None" |
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    15
Assign: "aval a s = Some i \<Longrightarrow> (x ::= a, Some s) \<Rightarrow> Some(s(x := Some i))" |
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 52726
diff changeset
    16
Seq:    "(c\<^sub>1,s\<^sub>1) \<Rightarrow> s\<^sub>2 \<Longrightarrow> (c\<^sub>2,s\<^sub>2) \<Rightarrow> s\<^sub>3 \<Longrightarrow> (c\<^sub>1;;c\<^sub>2,s\<^sub>1) \<Rightarrow> s\<^sub>3" |
43158
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    17
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 52726
diff changeset
    18
IfNone:  "bval b s = None \<Longrightarrow> (IF b THEN c\<^sub>1 ELSE c\<^sub>2,Some s) \<Rightarrow> None" |
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 52726
diff changeset
    19
IfTrue:  "\<lbrakk> bval b s = Some True;  (c\<^sub>1,Some s) \<Rightarrow> s' \<rbrakk> \<Longrightarrow>
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 52726
diff changeset
    20
  (IF b THEN c\<^sub>1 ELSE c\<^sub>2,Some s) \<Rightarrow> s'" |
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 52726
diff changeset
    21
IfFalse: "\<lbrakk> bval b s = Some False;  (c\<^sub>2,Some s) \<Rightarrow> s' \<rbrakk> \<Longrightarrow>
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 52726
diff changeset
    22
  (IF b THEN c\<^sub>1 ELSE c\<^sub>2,Some s) \<Rightarrow> s'" |
43158
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    23
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    24
WhileNone: "bval b s = None \<Longrightarrow> (WHILE b DO c,Some s) \<Rightarrow> None" |
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    25
WhileFalse: "bval b s = Some False \<Longrightarrow> (WHILE b DO c,Some s) \<Rightarrow> Some s" |
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    26
WhileTrue:
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    27
  "\<lbrakk> bval b s = Some True;  (c,Some s) \<Rightarrow> s';  (WHILE b DO c,s') \<Rightarrow> s'' \<rbrakk> \<Longrightarrow>
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    28
  (WHILE b DO c,Some s) \<Rightarrow> s''"
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    29
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    30
lemmas big_step_induct = big_step.induct[split_format(complete)]
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    31
52726
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    32
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    33
subsection "Soundness wrt Big Steps"
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    34
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    35
text{* Note the special form of the induction because one of the arguments
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    36
of the inductive predicate is not a variable but the term @{term"Some s"}: *}
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    37
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    38
theorem Sound:
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    39
  "\<lbrakk> (c,Some s) \<Rightarrow> s';  D A c A';  A \<subseteq> dom s \<rbrakk>
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    40
  \<Longrightarrow> \<exists> t. s' = Some t \<and> A' \<subseteq> dom t"
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    41
proof (induction c "Some s" s' arbitrary: s A A' rule:big_step_induct)
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    42
  case AssignNone thus ?case
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    43
    by auto (metis aval_Some option.simps(3) subset_trans)
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    44
next
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    45
  case Seq thus ?case by auto metis
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    46
next
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    47
  case IfTrue thus ?case by auto blast
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    48
next
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    49
  case IfFalse thus ?case by auto blast
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    50
next
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    51
  case IfNone thus ?case
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    52
    by auto (metis bval_Some option.simps(3) order_trans)
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    53
next
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    54
  case WhileNone thus ?case
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    55
    by auto (metis bval_Some option.simps(3) order_trans)
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    56
next
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    57
  case (WhileTrue b s c s' s'')
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    58
  from `D A (WHILE b DO c) A'` obtain A' where "D A c A'" by blast
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    59
  then obtain t' where "s' = Some t'" "A \<subseteq> dom t'"
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    60
    by (metis D_incr WhileTrue(3,7) subset_trans)
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    61
  from WhileTrue(5)[OF this(1) WhileTrue(6) this(2)] show ?case .
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    62
qed auto
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    63
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    64
corollary sound: "\<lbrakk>  D (dom s) c A';  (c,Some s) \<Rightarrow> s' \<rbrakk> \<Longrightarrow> s' \<noteq> None"
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    65
by (metis Sound not_Some_eq subset_refl)
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    66
43158
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    67
end
52726
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    68