src/HOL/Hoare/Examples.ML
author nipkow
Wed, 14 Oct 1998 15:26:31 +0200
changeset 5646 7c2ddbaf8b8c
parent 5591 fbb4e1ac234d
child 5655 afd75136b236
permissions -rw-r--r--
New many-sorted version.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1465
5d7a7e439cec expanded tabs
clasohm
parents: 1335
diff changeset
     1
(*  Title:      HOL/Hoare/Examples.thy
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
     2
    ID:         $Id$
5646
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
     3
    Author:     Norbert Galm & Tobias Nipkow
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
     4
    Copyright   1998 TUM
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
     5
*)
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
     6
5646
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
     7
(*** ARITHMETIC ***)
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
     8
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
     9
(*** multiplication by successive addition ***)
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    10
5646
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    11
Goal "|- VARS m s. \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    12
\  {m=0 & s=0} \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    13
\  WHILE m~=a \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    14
\  INV {s=m*b} \  
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    15
\  DO s := s+b; m := m+1 OD \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    16
\  {s = a*b}";
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    17
by(hoare_tac (Asm_full_simp_tac) 1);
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    18
qed "multiply_by_add";
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    19
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    20
(*** Euclid's algorithm for GCD ***)
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    21
5646
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    22
Goal "|- VARS a b. \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    23
\ {0<A & 0<B & a=A & b=B} \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    24
\ WHILE  a~=b  \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    25
\ INV {0<a & 0<b & gcd A B = gcd a b} \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    26
\ DO IF a<b THEN b := b-a ELSE a := a-b FI OD \
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    27
\ {a = gcd A B}";
5646
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    28
by (hoare_tac (K all_tac) 1);
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    29
3372
6e472c8f0011 Replacement of "divides" by "dvd" from Divides.thy, and updating of proofs
paulson
parents: 2031
diff changeset
    30
(*Now prove the verification conditions*)
5338
9f999cf852e0 Tidied, removing uses of less_imp_diff_positive
paulson
parents: 5183
diff changeset
    31
by Auto_tac;
9f999cf852e0 Tidied, removing uses of less_imp_diff_positive
paulson
parents: 5183
diff changeset
    32
by (etac gcd_nnn 4);
9f999cf852e0 Tidied, removing uses of less_imp_diff_positive
paulson
parents: 5183
diff changeset
    33
by (asm_full_simp_tac (simpset() addsimps [not_less_iff_le, gcd_diff_l]) 3);
9f999cf852e0 Tidied, removing uses of less_imp_diff_positive
paulson
parents: 5183
diff changeset
    34
by (force_tac (claset(),
5646
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    35
               simpset() addsimps [not_less_iff_le, le_eq_less_or_eq]) 2);
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    36
by (asm_simp_tac (simpset() addsimps [gcd_diff_r,less_imp_le]) 1);
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    37
qed "Euclid_GCD";
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    38
5646
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    39
(*** Power by iterated squaring and multiplication ***)
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    40
5646
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    41
Goal "|- VARS a b c. \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    42
\ {a=A & b=B} \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    43
\ c := 1; \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    44
\ WHILE b ~= 0 \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    45
\ INV {A^B = c * a^b} \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    46
\ DO  WHILE b mod 2 = 0 \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    47
\     INV {A^B = c * a^b} \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    48
\     DO  a := a*a; b := b div 2 OD; \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    49
\     c := c*a; b := b-1 \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    50
\ OD \
4359
6f2986464280 Simplified proofs.
nipkow
parents: 4356
diff changeset
    51
\ {c = A^B}";
5646
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    52
by(hoare_tac (Asm_full_simp_tac) 1);
5183
89f162de39cf Adapted to new datatype package.
berghofe
parents: 5069
diff changeset
    53
by (exhaust_tac "b" 1);
4356
0dfd34f0d33d Replaced n ~= 0 by 0 < n
nipkow
parents: 4153
diff changeset
    54
by (hyp_subst_tac 1);
0dfd34f0d33d Replaced n ~= 0 by 0 < n
nipkow
parents: 4153
diff changeset
    55
by (asm_full_simp_tac (simpset() addsimps [mod_less]) 1);
4359
6f2986464280 Simplified proofs.
nipkow
parents: 4356
diff changeset
    56
by (asm_simp_tac (simpset() addsimps [mult_assoc]) 1);
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    57
qed "power_by_mult";
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    58
5646
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    59
Goal "|- VARS a b. \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    60
\ {a=A} \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    61
\ b := 1; \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    62
\ WHILE a ~= 0 \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    63
\ INV {fac A = b * fac a} \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    64
\ DO b := b*a; a := a-1 OD \
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    65
\ {b = fac A}";
5646
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    66
by (hoare_tac Asm_full_simp_tac 1);
4153
e534c4c32d54 Ran expandshort, especially to introduce Safe_tac
paulson
parents: 4089
diff changeset
    67
by Safe_tac;
5183
89f162de39cf Adapted to new datatype package.
berghofe
parents: 5069
diff changeset
    68
by (exhaust_tac "a" 1);
1798
c055505f36d1 Explicitly included add_mult_distrib & add_mult_distrib2
paulson
parents: 1465
diff changeset
    69
by (ALLGOALS
c055505f36d1 Explicitly included add_mult_distrib & add_mult_distrib2
paulson
parents: 1465
diff changeset
    70
    (asm_simp_tac
4089
96fba19bcbe2 isatool fixclasimp;
wenzelm
parents: 3372
diff changeset
    71
     (simpset() addsimps [add_mult_distrib,add_mult_distrib2,mult_assoc])));
1875
54c0462f8fb2 Classical tactics now use default claset.
berghofe
parents: 1798
diff changeset
    72
by (Fast_tac 1);
5646
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    73
qed"factorial";
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    74
5646
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    75
(*** LISTS ***)
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    76
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    77
Goal "|- VARS y x. \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    78
\ {x=X} \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    79
\ y:=[]; \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    80
\ WHILE x ~= [] \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    81
\ INV {rev(x)@y = rev(X)} \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    82
\ DO y := (hd x # y); x := tl x OD \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    83
\ {y=rev(X)}";
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    84
by (hoare_tac Asm_full_simp_tac 1);
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    85
by (asm_full_simp_tac (simpset() addsimps [neq_Nil_conv]) 1);
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    86
by Safe_tac;
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    87
by (ALLGOALS(Asm_full_simp_tac ));
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    88
qed "imperative_reverse";
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    89
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    90
Goal
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    91
"|- VARS x y. \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    92
\ {x=X & y=Y} \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    93
\ x := rev(x); \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    94
\ WHILE x~=[] \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    95
\ INV {rev(x)@y = X@Y} \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    96
\ DO y := (hd x # y); \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    97
\    x := tl x \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    98
\ OD \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
    99
\ {y = X@Y}";
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   100
by (hoare_tac Asm_full_simp_tac 1);
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   101
by (asm_full_simp_tac (simpset() addsimps [neq_Nil_conv]) 1);
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   102
by Safe_tac;
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   103
by (ALLGOALS(Asm_full_simp_tac));
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   104
qed "imperative_append";
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   105
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   106
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   107
(*** ARRAYS ***)
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   108
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   109
(* Search for 0 *)
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   110
Goal
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   111
"|- VARS A i. \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   112
\ {True} \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   113
\ i := 0; \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   114
\ WHILE i < length A & A!i ~= 0 \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   115
\ INV {!j. j<i --> A!j ~= 0} \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   116
\ DO i := i+1 OD \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   117
\ {(i < length A --> A!i = 0) & \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   118
\  (i = length A --> (!j. j < length A --> A!j ~= 0))}";
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   119
by (hoare_tac Asm_full_simp_tac 1);
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   120
by(blast_tac (claset() addSEs [less_SucE]) 1);
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   121
qed "zero_search";
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   122
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   123
(* 
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   124
The `partition' procedure for quicksort.
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   125
`A' is the array to be sorted (modelled as a list).
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   126
Elements of A must be of class order to infer at the end
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   127
that the elements between u and l are equal to pivot.
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   128
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   129
Ambiguity warnings of parser are due to := being used
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   130
both for assignment and list update.
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   131
*)
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   132
Goal
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   133
"[| leq == %A i. !k. k<i --> A!k <= pivot; \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   134
\   geq == %A i. !k. i<k & k<length A --> pivot <= A!k |] ==> \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   135
\ |- VARS A u l.\
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   136
\ {0 < length(A::('a::order)list)} \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   137
\ l := 0; u := length A - 1; \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   138
\ WHILE l <= u \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   139
\  INV {leq A l & geq A u & u<length A & l<=length A} \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   140
\  DO WHILE l < length A & A!l <= pivot \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   141
\      INV {leq A l & geq A u & u<length A & l<=length A} \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   142
\      DO l := l+1 OD; \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   143
\     WHILE 0 < u & pivot <= A!u \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   144
\      INV {leq A l & geq A u  & u<length A & l<=length A} \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   145
\      DO u := u-1 OD; \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   146
\     IF l <= u THEN A := A[l := A!u, u := A!l] ELSE SKIP FI \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   147
\  OD \
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   148
\ {leq A u & (!k. u<k & k<l --> A!k = pivot) & geq A l}";
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   149
(* expand and delete abbreviations first *)
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   150
by(asm_simp_tac HOL_basic_ss 1);
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   151
by(REPEAT(etac thin_rl 1));
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   152
by (hoare_tac Asm_full_simp_tac 1);
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   153
    by(asm_full_simp_tac (simpset() addsimps [neq_Nil_conv]) 1);
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   154
    by(Clarify_tac 1);
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   155
    by(asm_full_simp_tac (simpset() addsimps [nth_list_update]
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   156
                                    addSolver cut_trans_tac) 1);
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   157
   by(blast_tac (claset() addSEs [less_SucE] addIs [Suc_leI]) 1);
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   158
  br conjI 1;
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   159
   by(Clarify_tac 1);
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   160
   bd (pred_less_imp_le RS le_imp_less_Suc) 1;
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   161
   by(blast_tac (claset() addSEs [less_SucE]) 1);
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   162
  br less_imp_diff_less 1;
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   163
  by(Blast_tac 1);
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   164
 by(Clarify_tac 1);
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   165
 by(asm_simp_tac (simpset() addsimps [nth_list_update]
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   166
                            addSolver cut_trans_tac) 1);
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   167
 by(Clarify_tac 1);
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   168
 by(trans_tac 1);
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   169
by(Clarify_tac 1);
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   170
by(asm_simp_tac (simpset() addSolver cut_trans_tac) 1);
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   171
br conjI 1;
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   172
 by(Clarify_tac 1);
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   173
 br order_antisym 1;
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   174
  by(asm_simp_tac (simpset() addSolver cut_trans_tac) 1);
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   175
 by(asm_simp_tac (simpset() addSolver cut_trans_tac) 1);
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   176
by(Clarify_tac 1);
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   177
by(asm_simp_tac (simpset() addSolver cut_trans_tac) 1);
7c2ddbaf8b8c New many-sorted version.
nipkow
parents: 5591
diff changeset
   178
qed "Partition";