src/HOL/Hoare/Examples.ML
changeset 10700 b18f417d0b62
parent 10123 9469c039ff57
child 10962 cda180b1e2e0
equal deleted inserted replaced
10699:f0c3da8477e9 10700:b18f417d0b62
    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 1);
    92 by (hoare_tac (asm_full_simp_tac (simpset() addsplits [nat_diff_split])) 1);
    93 by (Clarify_tac 1);
    93 by Auto_tac;  
    94 by (case_tac "a" 1);
       
    95 by  (ALLGOALS (asm_simp_tac
       
    96      (simpset() addsimps [add_mult_distrib,add_mult_distrib2,mult_assoc])));
       
    97 qed "factorial";
    94 qed "factorial";
    98 
    95 
    99 (** Square root **)
    96 (** Square root **)
   100 
    97 
   101 (* the easy way: *)
    98 (* the easy way: *)
   197 \ {leq A u & (!k. u<k & k<l --> A!k = pivot) & geq A l}";
   194 \ {leq A u & (!k. u<k & k<l --> A!k = pivot) & geq A l}";
   198 (* expand and delete abbreviations first *)
   195 (* expand and delete abbreviations first *)
   199 by (asm_simp_tac HOL_basic_ss 1);
   196 by (asm_simp_tac HOL_basic_ss 1);
   200 by (REPEAT (etac thin_rl 1));
   197 by (REPEAT (etac thin_rl 1));
   201 by (hoare_tac Asm_full_simp_tac 1);
   198 by (hoare_tac Asm_full_simp_tac 1);
   202     by (SELECT_GOAL (auto_tac (claset(), simpset() addsimps [neq_Nil_conv])) 1);
   199     by (force_tac (claset(), simpset() addsimps [neq_Nil_conv]) 1);
   203    by (blast_tac (claset() addSEs [less_SucE] addIs [Suc_leI]) 1);
   200    by (blast_tac (claset() addSEs [less_SucE] addIs [Suc_leI]) 1);
   204   by (blast_tac (claset() addSEs [less_SucE] addIs [less_imp_diff_less]
   201   by (blast_tac (claset() addSEs [less_SucE] addIs [less_imp_diff_less]
   205                           addDs [pred_less_imp_le RS le_imp_less_Suc] ) 1);
   202                           addDs [pred_less_imp_le RS le_imp_less_Suc] ) 1);
   206  by (SELECT_GOAL (auto_tac (claset(), simpset() addsimps [nth_list_update])) 1);
   203  by (force_tac (claset(), simpset() addsimps [nth_list_update]) 1);
   207 by (SELECT_GOAL (auto_tac (claset() addIs [order_antisym], simpset())) 1);
   204 by (auto_tac (claset() addIs [order_antisym], simpset()));
   208 qed "Partition";
   205 qed "Partition";