src/HOL/Hoare/Examples.thy
changeset 67613 ce654b0e6d69
parent 67410 64d928bacddd
child 72990 db8f94656024
equal deleted inserted replaced
67610:4939494ed791 67613:ce654b0e6d69
    10 section \<open>ARITHMETIC\<close>
    10 section \<open>ARITHMETIC\<close>
    11 
    11 
    12 subsection \<open>multiplication by successive addition\<close>
    12 subsection \<open>multiplication by successive addition\<close>
    13 
    13 
    14 lemma multiply_by_add: "VARS m s a b
    14 lemma multiply_by_add: "VARS m s a b
    15   {a=A & b=B}
    15   {a=A \<and> b=B}
    16   m := 0; s := 0;
    16   m := 0; s := 0;
    17   WHILE m~=a
    17   WHILE m\<noteq>a
    18   INV {s=m*b & a=A & b=B}
    18   INV {s=m*b \<and> a=A \<and> b=B}
    19   DO s := s+b; m := m+(1::nat) OD
    19   DO s := s+b; m := m+(1::nat) OD
    20   {s = A*B}"
    20   {s = A*B}"
    21 by vcg_simp
    21 by vcg_simp
    22 
    22 
    23 lemma multiply_by_add_time: "VARS m s a b t
    23 lemma multiply_by_add_time: "VARS m s a b t
    24   {a=A & b=B & t=0}
    24   {a=A \<and> b=B \<and> t=0}
    25   m := 0; t := t+1; s := 0; t := t+1;
    25   m := 0; t := t+1; s := 0; t := t+1;
    26   WHILE m~=a
    26   WHILE m\<noteq>a
    27   INV {s=m*b & a=A & b=B & t = 2*m + 2}
    27   INV {s=m*b \<and> a=A \<and> b=B \<and> t = 2*m + 2}
    28   DO s := s+b; t := t+1; m := m+(1::nat); t := t+1 OD
    28   DO s := s+b; t := t+1; m := m+(1::nat); t := t+1 OD
    29   {s = A*B \<and> t = 2*A + 2}"
    29   {s = A*B \<and> t = 2*A + 2}"
    30 by vcg_simp
    30 by vcg_simp
    31 
    31 
    32 lemma multiply_by_add2: "VARS M N P :: int
    32 lemma multiply_by_add2: "VARS M N P :: int
    33  {m=M & n=N}
    33  {m=M \<and> n=N}
    34  IF M < 0 THEN M := -M; N := -N ELSE SKIP FI;
    34  IF M < 0 THEN M := -M; N := -N ELSE SKIP FI;
    35  P := 0;
    35  P := 0;
    36  WHILE 0 < M
    36  WHILE 0 < M
    37  INV {0 <= M & (EX p. p = (if m<0 then -m else m) & p*N = m*n & P = (p-M)*N)}
    37  INV {0 \<le> M \<and> (\<exists>p. p = (if m<0 then -m else m) & p*N = m*n & P = (p-M)*N)}
    38  DO P := P+N; M := M - 1 OD
    38  DO P := P+N; M := M - 1 OD
    39  {P = m*n}"
    39  {P = m*n}"
    40 apply vcg_simp
    40 apply vcg_simp
    41  apply (auto simp add:int_distrib)
    41  apply (auto simp add:int_distrib)
    42 done
    42 done
    43 
    43 
    44 lemma multiply_by_add2_time: "VARS M N P t :: int
    44 lemma multiply_by_add2_time: "VARS M N P t :: int
    45  {m=M & n=N & t=0}
    45  {m=M \<and> n=N \<and> t=0}
    46  IF M < 0 THEN M := -M; t := t+1; N := -N; t := t+1 ELSE SKIP FI;
    46  IF M < 0 THEN M := -M; t := t+1; N := -N; t := t+1 ELSE SKIP FI;
    47  P := 0; t := t+1;
    47  P := 0; t := t+1;
    48  WHILE 0 < M
    48  WHILE 0 < M
    49  INV {0 \<le> M & (EX p. p = (if m<0 then -m else m) & p*N = m*n & P = (p-M)*N & t \<ge> 0 & t \<le> 2*(p-M)+3)}
    49  INV {0 \<le> M & (\<exists>p. p = (if m<0 then -m else m) & p*N = m*n & P = (p-M)*N & t \<ge> 0 & t \<le> 2*(p-M)+3)}
    50  DO P := P+N; t := t+1; M := M - 1; t := t+1 OD
    50  DO P := P+N; t := t+1; M := M - 1; t := t+1 OD
    51  {P = m*n & t \<le> 2*abs m + 3}"
    51  {P = m*n & t \<le> 2*abs m + 3}"
    52 apply vcg_simp
    52 apply vcg_simp
    53  apply (auto simp add:int_distrib)
    53  apply (auto simp add:int_distrib)
    54 done
    54 done
   281 subsection \<open>Search for a key\<close>
   281 subsection \<open>Search for a key\<close>
   282 
   282 
   283 lemma zero_search: "VARS A i
   283 lemma zero_search: "VARS A i
   284  {True}
   284  {True}
   285  i := 0;
   285  i := 0;
   286  WHILE i < length A & A!i ~= key
   286  WHILE i < length A & A!i \<noteq> key
   287  INV {!j. j<i --> A!j ~= key}
   287  INV {\<forall>j. j<i --> A!j \<noteq> key}
   288  DO i := i+1 OD
   288  DO i := i+1 OD
   289  {(i < length A --> A!i = key) &
   289  {(i < length A --> A!i = key) &
   290   (i = length A --> (!j. j < length A --> A!j ~= key))}"
   290   (i = length A --> (\<forall>j. j < length A \<longrightarrow> A!j \<noteq> key))}"
   291 apply vcg_simp
   291 apply vcg_simp
   292 apply(blast elim!: less_SucE)
   292 apply(blast elim!: less_SucE)
   293 done
   293 done
   294 
   294 
   295 lemma zero_search_time: "VARS A i t
   295 lemma zero_search_time: "VARS A i t
   296  {t=0}
   296  {t=0}
   297  i := 0; t := t+1;
   297  i := 0; t := t+1;
   298  WHILE i < length A & A!i ~= key
   298  WHILE i < length A \<and> A!i \<noteq> key
   299  INV {(\<forall>j. j<i --> A!j ~= key) & i \<le> length A & t = i+1}
   299  INV {(\<forall>j. j<i \<longrightarrow> A!j \<noteq> key) \<and> i \<le> length A \<and> t = i+1}
   300  DO i := i+1; t := t+1 OD
   300  DO i := i+1; t := t+1 OD
   301  {(i < length A --> A!i = key) &
   301  {(i < length A \<longrightarrow> A!i = key) \<and>
   302   (i = length A --> (!j. j < length A --> A!j ~= key)) & t \<le> length A + 1}"
   302   (i = length A \<longrightarrow> (\<forall>j. j < length A --> A!j \<noteq> key)) \<and> t \<le> length A + 1}"
   303 apply vcg_simp
   303 apply vcg_simp
   304 apply(blast elim!: less_SucE)
   304 apply(blast elim!: less_SucE)
   305 done
   305 done
   306 
   306 
   307 text \<open>
   307 text \<open>
   316 lemma lem: "m - Suc 0 < n ==> m < Suc n"
   316 lemma lem: "m - Suc 0 < n ==> m < Suc n"
   317 by arith
   317 by arith
   318 
   318 
   319 
   319 
   320 lemma Partition:
   320 lemma Partition:
   321 "[| leq == %A i. !k. k<i --> A!k <= pivot;
   321 "[| leq == \<lambda>A i. \<forall>k. k<i \<longrightarrow> A!k \<le> pivot;
   322     geq == %A i. !k. i<k & k<length A --> pivot <= A!k |] ==>
   322     geq == \<lambda>A i. \<forall>k. i<k \<and> k<length A \<longrightarrow> pivot \<le> A!k |] ==>
   323  VARS A u l
   323  VARS A u l
   324  {0 < length(A::('a::order)list)}
   324  {0 < length(A::('a::order)list)}
   325  l := 0; u := length A - Suc 0;
   325  l := 0; u := length A - Suc 0;
   326  WHILE l <= u
   326  WHILE l \<le> u
   327   INV {leq A l & geq A u & u<length A & l<=length A}
   327   INV {leq A l \<and> geq A u \<and> u<length A \<and> l\<le>length A}
   328   DO WHILE l < length A & A!l <= pivot
   328   DO WHILE l < length A \<and> A!l \<le> pivot
   329      INV {leq A l & geq A u & u<length A & l<=length A}
   329      INV {leq A l & geq A u \<and> u<length A \<and> l\<le>length A}
   330      DO l := l+1 OD;
   330      DO l := l+1 OD;
   331      WHILE 0 < u & pivot <= A!u
   331      WHILE 0 < u & pivot \<le> A!u
   332      INV {leq A l & geq A u  & u<length A & l<=length A}
   332      INV {leq A l & geq A u  \<and> u<length A \<and> l\<le>length A}
   333      DO u := u - 1 OD;
   333      DO u := u - 1 OD;
   334      IF l <= u THEN A := A[l := A!u, u := A!l] ELSE SKIP FI
   334      IF l \<le> u THEN A := A[l := A!u, u := A!l] ELSE SKIP FI
   335   OD
   335   OD
   336  {leq A u & (!k. u<k & k<l --> A!k = pivot) & geq A l}"
   336  {leq A u & (\<forall>k. u<k \<and> k<l --> A!k = pivot) \<and> geq A l}"
   337 \<comment> \<open>expand and delete abbreviations first\<close>
   337 \<comment> \<open>expand and delete abbreviations first\<close>
   338 apply (simp)
   338 apply (simp)
   339 apply (erule thin_rl)+
   339 apply (erule thin_rl)+
   340 apply vcg_simp
   340 apply vcg_simp
   341    apply (force simp: neq_Nil_conv)
   341    apply (force simp: neq_Nil_conv)