src/HOL/Hyperreal/fuf.ML
author paulson
Tue, 16 Dec 2003 15:38:09 +0100
changeset 14297 7c84fd26add1
parent 10751 a81ea5d3dd41
child 14299 0b5c0b0a3eba
permissions -rw-r--r--
converted Hyperreal/HyperOrd to new-style theory
     1 (*  Title       : HOL/Real/Hyperreal/fuf.ML
     2     ID          : $Id$
     3     Author      : Jacques D. Fleuriot
     4     Copyright   : 1998  University of Cambridge
     5                   1999  University of Edinburgh
     6 
     7 Simple tactics to help proofs involving our free ultrafilter
     8 (FreeUltrafilterNat). We rely on the fact that filters satisfy the
     9 finite intersection property.
    10 *)
    11 
    12 local
    13 
    14 exception FUFempty;
    15 
    16 fun get_fuf_hyps [] zs = zs
    17 |   get_fuf_hyps (x::xs) zs =
    18         case (concl_of x) of
    19         (_ $ (Const ("Not",_) $ (Const ("op :",_) $ _ $
    20              Const ("HyperDef.FreeUltrafilterNat",_)))) =>  get_fuf_hyps xs
    21                                               ((x RS FreeUltrafilterNat_Compl_mem)::zs)
    22        |(_ $ (Const ("op :",_) $ _ $
    23              Const ("HyperDef.FreeUltrafilterNat",_)))  =>  get_fuf_hyps xs (x::zs)
    24        | _ => get_fuf_hyps xs zs;
    25 
    26 fun inter_prems [] = raise FUFempty
    27 |   inter_prems [x] = x
    28 |   inter_prems (x::y::ys) =
    29       inter_prems (([x,y] MRS FreeUltrafilterNat_Int) :: ys);
    30 
    31 in
    32 
    33 (*---------------------------------------------------------------
    34    solves goals of the form
    35     [| A1: FUF; A2: FUF; ...; An: FUF |] ==> B : FUF
    36    where A1 Int A2 Int ... Int An <= B
    37  ---------------------------------------------------------------*)
    38 
    39 fun fuf_tac css i = METAHYPS(fn prems =>
    40                     (rtac ((inter_prems (get_fuf_hyps prems [])) RS
    41                            FreeUltrafilterNat_subset) 1) THEN
    42                     auto_tac css) i;
    43 
    44 fun Fuf_tac i = fuf_tac (clasimpset ()) i;
    45 
    46 
    47 (*---------------------------------------------------------------
    48    solves goals of the form
    49     [| A1: FUF; A2: FUF; ...; An: FUF |] ==> P
    50    where A1 Int A2 Int ... Int An <= {} since {} ~: FUF
    51    (i.e. uses fact that FUF is a proper filter)
    52  ---------------------------------------------------------------*)
    53 
    54 fun fuf_empty_tac css i = METAHYPS (fn prems =>
    55   rtac ((inter_prems (get_fuf_hyps prems [])) RS
    56     (FreeUltrafilterNat_subset RS (FreeUltrafilterNat_empty RS notE))) 1
    57                      THEN auto_tac css) i;
    58 
    59 fun Fuf_empty_tac i = fuf_empty_tac (clasimpset ()) i;
    60 
    61 
    62 (*---------------------------------------------------------------
    63    In fact could make this the only tactic: just need to
    64    use contraposition and then look for empty set.
    65  ---------------------------------------------------------------*)
    66 
    67 fun ultra_tac css i = rtac ccontr i THEN fuf_empty_tac css i;
    68 fun Ultra_tac i = ultra_tac (clasimpset ()) i;
    69 
    70 end;