src/HOL/Hoare/Examples.ML
changeset 11701 3d51fbf81c17
parent 11464 ddea204de5bc
child 11704 3c50a2cd6f00
equal deleted inserted replaced
11700:a0e6bda62b7b 11701:3d51fbf81c17
    11 Goal "|- VARS m s a b. \
    11 Goal "|- VARS m s a b. \
    12 \  {a=A & b=B} \
    12 \  {a=A & b=B} \
    13 \  m := 0; s := 0; \
    13 \  m := 0; s := 0; \
    14 \  WHILE m~=a \
    14 \  WHILE m~=a \
    15 \  INV {s=m*b & a=A & b=B} \  
    15 \  INV {s=m*b & a=A & b=B} \  
    16 \  DO s := s+b; m := m+1 OD \
    16 \  DO s := s+b; m := m+(1::nat) OD \
    17 \  {s = A*B}"; 
    17 \  {s = A*B}"; 
    18 by (hoare_tac (Asm_full_simp_tac) 1);
    18 by (hoare_tac (Asm_full_simp_tac) 1);
    19 qed "multiply_by_add";
    19 qed "multiply_by_add";
    20 
    20 
    21 (** Euclid's algorithm for GCD **)
    21 (** Euclid's algorithm for GCD **)
    48   [diff_mult_distrib,diff_mult_distrib2,add_mult_distrib,add_mult_distrib2];
    48   [diff_mult_distrib,diff_mult_distrib2,add_mult_distrib,add_mult_distrib2];
    49 
    49 
    50 Goal "|- VARS a b x y. \
    50 Goal "|- VARS a b x y. \
    51 \ {0<A & 0<B & a=A & b=B & x=B & y=A} \
    51 \ {0<A & 0<B & a=A & b=B & x=B & y=A} \
    52 \ WHILE  a ~= b  \
    52 \ WHILE  a ~= b  \
    53 \ INV {0<a & 0<b & gcd A B = gcd a b & #2*A*B = a*x + b*y} \
    53 \ INV {0<a & 0<b & gcd A B = gcd a b & # 2*A*B = a*x + b*y} \
    54 \ DO IF a<b THEN (b := b-a; x := x+y) ELSE (a := a-b; y := y+x) FI OD \
    54 \ DO IF a<b THEN (b := b-a; x := x+y) ELSE (a := a-b; y := y+x) FI OD \
    55 \ {a = gcd A B & #2*A*B = a*(x+y)}";
    55 \ {a = gcd A B & # 2*A*B = a*(x+y)}";
    56 by (hoare_tac (K all_tac) 1);
    56 by (hoare_tac (K all_tac) 1);
    57 by(Asm_simp_tac 1);
    57 by(Asm_simp_tac 1);
    58 by(asm_simp_tac (simpset() addsimps
    58 by(asm_simp_tac (simpset() addsimps
    59     (distribs @ [gcd_diff_r,not_less_iff_le, gcd_diff_l])) 1);
    59     (distribs @ [gcd_diff_r,not_less_iff_le, gcd_diff_l])) 1);
    60 by(arith_tac 1);
    60 by(arith_tac 1);
    63 
    63 
    64 (** Power by iterated squaring and multiplication **)
    64 (** Power by iterated squaring and multiplication **)
    65 
    65 
    66 Goal "|- VARS a b c. \
    66 Goal "|- VARS a b c. \
    67 \ {a=A & b=B} \
    67 \ {a=A & b=B} \
    68 \ c := 1; \
    68 \ c := (1::nat); \
    69 \ WHILE b ~= 0 \
    69 \ WHILE b ~= 0 \
    70 \ INV {A^B = c * a^b} \
    70 \ INV {A^B = c * a^b} \
    71 \ DO  WHILE b mod #2 = 0 \
    71 \ DO  WHILE b mod # 2 = 0 \
    72 \     INV {A^B = c * a^b} \
    72 \     INV {A^B = c * a^b} \
    73 \     DO  a := a*a; b := b div #2 OD; \
    73 \     DO  a := a*a; b := b div # 2 OD; \
    74 \     c := c*a; b := b-1 \
    74 \     c := c*a; b := b - 1 \
    75 \ OD \
    75 \ OD \
    76 \ {c = A^B}";
    76 \ {c = A^B}";
    77 by (hoare_tac (Asm_full_simp_tac) 1);
    77 by (hoare_tac (Asm_full_simp_tac) 1);
    78 by (case_tac "b" 1);
    78 by (case_tac "b" 1);
    79 by  (asm_full_simp_tac (simpset() addsimps [mod_less]) 1);
    79 by  (asm_full_simp_tac (simpset() addsimps [mod_less]) 1);
    85 Goal "|- VARS a b. \
    85 Goal "|- VARS a b. \
    86 \ {a=A} \
    86 \ {a=A} \
    87 \ b := 1; \
    87 \ b := 1; \
    88 \ WHILE a ~= 0 \
    88 \ WHILE a ~= 0 \
    89 \ INV {fac A = b * fac a} \
    89 \ INV {fac A = b * fac a} \
    90 \ DO b := b*a; a := a-1 OD \
    90 \ DO b := b*a; a := a - 1 OD \
    91 \ {b = fac A}";
    91 \ {b = fac A}";
    92 by (hoare_tac (asm_full_simp_tac (simpset() addsplits [nat_diff_split])) 1);
    92 by (hoare_tac (asm_full_simp_tac (simpset() addsplits [nat_diff_split])) 1);
    93 by Auto_tac;  
    93 by Auto_tac;  
    94 qed "factorial";
    94 qed "factorial";
    95 
    95 
    97 
    97 
    98 (* the easy way: *)
    98 (* the easy way: *)
    99 
    99 
   100 Goal "|- VARS r x. \
   100 Goal "|- VARS r x. \
   101 \ {True} \
   101 \ {True} \
   102 \ x := X; r := 0; \
   102 \ x := X; r := (0::nat); \
   103 \ WHILE (r+1)*(r+1) <= x \
   103 \ WHILE (r+1)*(r+1) <= x \
   104 \ INV {r*r <= x & x=X} \
   104 \ INV {r*r <= x & x=X} \
   105 \ DO r := r+1 OD \
   105 \ DO r := r+1 OD \
   106 \ {r*r <= X & X < (r+1)*(r+1)}";
   106 \ {r*r <= X & X < (r+1)*(r+1)}";
   107 by (hoare_tac (SELECT_GOAL Auto_tac) 1);
   107 by (hoare_tac (SELECT_GOAL Auto_tac) 1);
   109 
   109 
   110 (* without multiplication *)
   110 (* without multiplication *)
   111 
   111 
   112 Goal "|- VARS u w r x. \
   112 Goal "|- VARS u w r x. \
   113 \ {True} \
   113 \ {True} \
   114 \ x := X; u := 1; w := 1; r := 0; \
   114 \ x := X; u := 1; w := 1; r := (0::nat); \
   115 \ WHILE w <= x \
   115 \ WHILE w <= x \
   116 \ INV {u = r+r+1 & w = (r+1)*(r+1) & r*r <= x & x=X} \
   116 \ INV {u = r+r+1 & w = (r+1)*(r+1) & r*r <= x & x=X} \
   117 \ DO r := r+1; w := w+u+2; u := u+2 OD \
   117 \ DO r := r + 1; w := w + u + # 2; u := u + # 2 OD \
   118 \ {r*r <= X & X < (r+1)*(r+1)}";
   118 \ {r*r <= X & X < (r+1)*(r+1)}";
   119 by (hoare_tac (SELECT_GOAL Auto_tac) 1);
   119 by (hoare_tac (SELECT_GOAL Auto_tac) 1);
   120 qed "sqrt_without_multiplication";
   120 qed "sqrt_without_multiplication";
   121 
   121 
   122 
   122 
   173 that the elements between u and l are equal to pivot.
   173 that the elements between u and l are equal to pivot.
   174 
   174 
   175 Ambiguity warnings of parser are due to := being used
   175 Ambiguity warnings of parser are due to := being used
   176 both for assignment and list update.
   176 both for assignment and list update.
   177 *)
   177 *)
   178 Goal "m - 1' < n ==> m < Suc n";
   178 Goal "m - Suc 0 < n ==> m < Suc n";
   179 by (arith_tac 1);
   179 by (arith_tac 1);
   180 qed "lemma";
   180 qed "lemma";
   181 
   181 
   182 Goal
   182 Goal
   183 "[| leq == %A i. !k. k<i --> A!k <= pivot; \
   183 "[| leq == %A i. !k. k<i --> A!k <= pivot; \
   184 \   geq == %A i. !k. i<k & k<length A --> pivot <= A!k |] ==> \
   184 \   geq == %A i. !k. i<k & k<length A --> pivot <= A!k |] ==> \
   185 \ |- VARS A u l.\
   185 \ |- VARS A u l.\
   186 \ {0 < length(A::('a::order)list)} \
   186 \ {0 < length(A::('a::order)list)} \
   187 \ l := 0; u := length A - 1'; \
   187 \ l := 0; u := length A - Suc 0; \
   188 \ WHILE l <= u \
   188 \ WHILE l <= u \
   189 \  INV {leq A l & geq A u & u<length A & l<=length A} \
   189 \  INV {leq A l & geq A u & u<length A & l<=length A} \
   190 \  DO WHILE l < length A & A!l <= pivot \
   190 \  DO WHILE l < length A & A!l <= pivot \
   191 \      INV {leq A l & geq A u & u<length A & l<=length A} \
   191 \      INV {leq A l & geq A u & u<length A & l<=length A} \
   192 \      DO l := l+1 OD; \
   192 \      DO l := l+1 OD; \
   193 \     WHILE 0 < u & pivot <= A!u \
   193 \     WHILE 0 < u & pivot <= A!u \
   194 \      INV {leq A l & geq A u  & u<length A & l<=length A} \
   194 \      INV {leq A l & geq A u  & u<length A & l<=length A} \
   195 \      DO u := u-1 OD; \
   195 \      DO u := u - 1 OD; \
   196 \     IF l <= u THEN A := A[l := A!u, u := A!l] ELSE SKIP FI \
   196 \     IF l <= u THEN A := A[l := A!u, u := A!l] ELSE SKIP FI \
   197 \  OD \
   197 \  OD \
   198 \ {leq A u & (!k. u<k & k<l --> A!k = pivot) & geq A l}";
   198 \ {leq A u & (!k. u<k & k<l --> A!k = pivot) & geq A l}";
   199 (* expand and delete abbreviations first *)
   199 (* expand and delete abbreviations first *)
   200 by (asm_simp_tac HOL_basic_ss 1);
   200 by (asm_simp_tac HOL_basic_ss 1);