| 
1465
 | 
     1  | 
(*  Title:      HOL/Ord.ML
  | 
| 
923
 | 
     2  | 
    ID:         $Id$
  | 
| 
1465
 | 
     3  | 
    Author:     Tobias Nipkow, Cambridge University Computer Laboratory
  | 
| 
923
 | 
     4  | 
    Copyright   1993  University of Cambridge
  | 
| 
 | 
     5  | 
  | 
| 
 | 
     6  | 
The type class for ordered types
  | 
| 
 | 
     7  | 
*)
  | 
| 
 | 
     8  | 
  | 
| 
2608
 | 
     9  | 
(** mono **)
  | 
| 
923
 | 
    10  | 
  | 
| 
 | 
    11  | 
val [prem] = goalw Ord.thy [mono_def]
  | 
| 
 | 
    12  | 
    "[| !!A B. A <= B ==> f(A) <= f(B) |] ==> mono(f)";
  | 
| 
 | 
    13  | 
by (REPEAT (ares_tac [allI, impI, prem] 1));
  | 
| 
 | 
    14  | 
qed "monoI";
  | 
| 
 | 
    15  | 
  | 
| 
 | 
    16  | 
val [major,minor] = goalw Ord.thy [mono_def]
  | 
| 
 | 
    17  | 
    "[| mono(f);  A <= B |] ==> f(A) <= f(B)";
  | 
| 
 | 
    18  | 
by (rtac (major RS spec RS spec RS mp) 1);
  | 
| 
 | 
    19  | 
by (rtac minor 1);
  | 
| 
 | 
    20  | 
qed "monoD";
  | 
| 
 | 
    21  | 
  | 
| 
2608
 | 
    22  | 
  | 
| 
 | 
    23  | 
section "Orders";
  | 
| 
 | 
    24  | 
  | 
| 
 | 
    25  | 
AddIffs [order_refl];
  | 
| 
 | 
    26  | 
  | 
| 
 | 
    27  | 
goal Ord.thy "~ x < (x::'a::order)";
  | 
| 
2935
 | 
    28  | 
by (simp_tac (!simpset addsimps [order_less_le]) 1);
  | 
| 
2608
 | 
    29  | 
qed "order_less_irrefl";
  | 
| 
 | 
    30  | 
AddIffs [order_less_irrefl];
  | 
| 
 | 
    31  | 
  | 
| 
 | 
    32  | 
goal thy "(x::'a::order) <= y = (x < y | x = y)";
  | 
| 
2935
 | 
    33  | 
by (simp_tac (!simpset addsimps [order_less_le]) 1);
  | 
| 
 | 
    34  | 
by (Blast_tac 1);
  | 
| 
2608
 | 
    35  | 
qed "order_le_less";
  | 
| 
 | 
    36  | 
  | 
| 
 | 
    37  | 
(** min **)
  | 
| 
 | 
    38  | 
  | 
| 
 | 
    39  | 
goalw thy [min_def] "!!least. (!!x. least <= x) ==> min least x = least";
  | 
| 
2935
 | 
    40  | 
by (split_tac [expand_if] 1);
  | 
| 
 | 
    41  | 
by (Asm_simp_tac 1);
  | 
| 
2608
 | 
    42  | 
qed "min_leastL";
  | 
| 
 | 
    43  | 
  | 
| 
 | 
    44  | 
val prems = goalw thy [min_def]
  | 
| 
 | 
    45  | 
 "(!!x::'a::order. least <= x) ==> min x least = least";
  | 
| 
2935
 | 
    46  | 
by (cut_facts_tac prems 1);
  | 
| 
 | 
    47  | 
by (split_tac [expand_if] 1);
  | 
| 
 | 
    48  | 
by (Asm_simp_tac 1);
  | 
| 
 | 
    49  | 
by (blast_tac (!claset addIs [order_antisym]) 1);
  | 
| 
2608
 | 
    50  | 
qed "min_leastR";
  |