|
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(); |