src/CCL/ex/nat.ML
changeset 0 a5a9c433f639
child 8 c3d2c6dcf3f0
equal deleted inserted replaced
-1:000000000000 0:a5a9c433f639
       
     1 (*  Title: 	CCL/ex/nat
       
     2     ID:         $Id$
       
     3     Author: 	Martin Coen, Cambridge University Computer Laboratory
       
     4     Copyright   1993  University of Cambridge
       
     5 
       
     6 For nat.thy.
       
     7 *)
       
     8 
       
     9 open Nat;
       
    10 
       
    11 val nat_defs = [not_def,add_def,mult_def,sub_def,le_def,lt_def,ack_def,napply_def];
       
    12 
       
    13 val natBs = map (fn s=>prove_goalw Nat.thy nat_defs s (fn _ => [SIMP_TAC term_ss 1]))
       
    14      ["not(true) = false",
       
    15       "not(false) = true",
       
    16       "zero #+ n = n",
       
    17       "succ(n) #+ m = succ(n #+ m)",
       
    18       "zero #* n = zero",
       
    19       "succ(n) #* m = m #+ (n #* m)",
       
    20       "f^zero`a = a",
       
    21       "f^succ(n)`a = f(f^n`a)"];
       
    22 
       
    23 val nat_congs  = ccl_mk_congs Nat.thy ["not","op #+","op #*","op #-","op ##",
       
    24                                      "op #<","op #<=","ackermann","napply"];
       
    25 
       
    26 val nat_ss = term_ss addrews natBs addcongs nat_congs;
       
    27 
       
    28 (*** Lemma for napply ***)
       
    29 
       
    30 val [prem] = goal Nat.thy "n:Nat ==> f^n`f(a) = f^succ(n)`a";
       
    31 br (prem RS Nat_ind) 1;
       
    32 by (ALLGOALS (ASM_SIMP_TAC (nat_ss addcongs [read_instantiate [("f","f")] arg_cong])));
       
    33 val napply_f = result();
       
    34 
       
    35 (****)
       
    36 
       
    37 val prems = goalw Nat.thy [add_def] "[| a:Nat;  b:Nat |] ==> a #+ b : Nat";
       
    38 by (typechk_tac prems 1);
       
    39 val addT = result();
       
    40 
       
    41 val prems = goalw Nat.thy [mult_def] "[| a:Nat;  b:Nat |] ==> a #* b : Nat";
       
    42 by (typechk_tac (addT::prems) 1);
       
    43 val multT = result();
       
    44 
       
    45 (* Defined to return zero if a<b *)
       
    46 val prems = goalw Nat.thy [sub_def] "[| a:Nat;  b:Nat |] ==> a #- b : Nat";
       
    47 by (typechk_tac (prems) 1);
       
    48 by clean_ccs_tac;
       
    49 be (NatPRI RS wfstI RS (NatPR_wf RS wmap_wf RS wfI)) 1;
       
    50 val subT = result();
       
    51 
       
    52 val prems = goalw Nat.thy [le_def] "[| a:Nat;  b:Nat |] ==> a #<= b : Bool";
       
    53 by (typechk_tac (prems) 1);
       
    54 by clean_ccs_tac;
       
    55 be (NatPRI RS wfstI RS (NatPR_wf RS wmap_wf RS wfI)) 1;
       
    56 val leT = result();
       
    57 
       
    58 val prems = goalw Nat.thy [not_def,lt_def] "[| a:Nat;  b:Nat |] ==> a #< b : Bool";
       
    59 by (typechk_tac (prems@[leT]) 1);
       
    60 val ltT = result();
       
    61 
       
    62 (* Correctness conditions for subtractive division **)
       
    63 
       
    64 val prems = goalw Nat.thy [div_def] 
       
    65     "[| a:Nat;  b:{x:Nat.~x=zero} |] ==> a ## b : {x:Nat. DIV(a,b,x)}";
       
    66 by (gen_ccs_tac (prems@[ltT,subT]) 1);
       
    67 
       
    68 (* Termination Conditions for Ackermann's Function *)
       
    69 
       
    70 val prems = goalw Nat.thy [ack_def]
       
    71     "[| a:Nat;  b:Nat |] ==> ackermann(a,b) : Nat";
       
    72 by (gen_ccs_tac prems 1);
       
    73 val relI = NatPR_wf RS (NatPR_wf RS lex_wf RS wfI);
       
    74 by (REPEAT (eresolve_tac [NatPRI RS (lexI1 RS relI),NatPRI RS (lexI2 RS relI)] 1));
       
    75 result();