author | nipkow |
Wed, 31 Aug 1994 16:25:19 +0200 | |
changeset 132 | 47be9d22a0d6 |
parent 109 | c53c19fb22cb |
child 145 | a9f7ff3a464c |
permissions | -rw-r--r-- |
0 | 1 |
(* Title: HOL/nat |
2 |
ID: $Id$ |
|
3 |
Author: Tobias Nipkow, Cambridge University Computer Laboratory |
|
4 |
Copyright 1991 University of Cambridge |
|
5 |
||
6 |
Definition of types ind and nat. |
|
7 |
||
8 |
Type nat is defined as a set Nat over type ind. |
|
9 |
*) |
|
10 |
||
11 |
Nat = WF + |
|
51 | 12 |
|
13 |
types |
|
14 |
ind |
|
15 |
nat |
|
16 |
||
17 |
arities |
|
18 |
ind,nat :: term |
|
19 |
nat :: ord |
|
0 | 20 |
|
21 |
consts |
|
22 |
Zero_Rep :: "ind" |
|
23 |
Suc_Rep :: "ind => ind" |
|
24 |
Nat :: "ind set" |
|
25 |
Rep_Nat :: "nat => ind" |
|
26 |
Abs_Nat :: "ind => nat" |
|
27 |
Suc :: "nat => nat" |
|
109
c53c19fb22cb
HOL/Nat: rotated arguments of nat_case; added translation for case macro
lcp
parents:
94
diff
changeset
|
28 |
nat_case :: "['a, nat=>'a, nat] =>'a" |
0 | 29 |
pred_nat :: "(nat*nat) set" |
30 |
nat_rec :: "[nat, 'a, [nat, 'a]=>'a] => 'a" |
|
31 |
"0" :: "nat" ("0") |
|
32 |
||
109
c53c19fb22cb
HOL/Nat: rotated arguments of nat_case; added translation for case macro
lcp
parents:
94
diff
changeset
|
33 |
translations |
c53c19fb22cb
HOL/Nat: rotated arguments of nat_case; added translation for case macro
lcp
parents:
94
diff
changeset
|
34 |
"case p of 0 => a | Suc(y) => b" == "nat_case(a, %y.b, p)" |
c53c19fb22cb
HOL/Nat: rotated arguments of nat_case; added translation for case macro
lcp
parents:
94
diff
changeset
|
35 |
|
0 | 36 |
rules |
37 |
(*the axiom of infinity in 2 parts*) |
|
38 |
inj_Suc_Rep "inj(Suc_Rep)" |
|
39 |
Suc_Rep_not_Zero_Rep "~(Suc_Rep(x) = Zero_Rep)" |
|
40 |
Nat_def "Nat == lfp(%X. {Zero_Rep} Un (Suc_Rep``X))" |
|
41 |
(*faking a type definition...*) |
|
42 |
Rep_Nat "Rep_Nat(n): Nat" |
|
43 |
Rep_Nat_inverse "Abs_Nat(Rep_Nat(n)) = n" |
|
44 |
Abs_Nat_inverse "i: Nat ==> Rep_Nat(Abs_Nat(i)) = i" |
|
45 |
(*defining the abstract constants*) |
|
46 |
Zero_def "0 == Abs_Nat(Zero_Rep)" |
|
47 |
Suc_def "Suc == (%n. Abs_Nat(Suc_Rep(Rep_Nat(n))))" |
|
48 |
(*nat operations and recursion*) |
|
109
c53c19fb22cb
HOL/Nat: rotated arguments of nat_case; added translation for case macro
lcp
parents:
94
diff
changeset
|
49 |
nat_case_def "nat_case(a,f,n) == @z. (n=0 --> z=a) \ |
c53c19fb22cb
HOL/Nat: rotated arguments of nat_case; added translation for case macro
lcp
parents:
94
diff
changeset
|
50 |
\ & (!x. n=Suc(x) --> z=f(x))" |
0 | 51 |
pred_nat_def "pred_nat == {p. ? n. p = <n, Suc(n)>}" |
52 |
||
53 |
less_def "m<n == <m,n>:trancl(pred_nat)" |
|
54 |
||
90
5c7a69cef18b
added parentheses made necessary by change of constrain's precedence
clasohm
parents:
51
diff
changeset
|
55 |
le_def "m<=(n::nat) == ~(n<m)" |
0 | 56 |
|
57 |
nat_rec_def "nat_rec(n,c,d) == wfrec(pred_nat, n, \ |
|
109
c53c19fb22cb
HOL/Nat: rotated arguments of nat_case; added translation for case macro
lcp
parents:
94
diff
changeset
|
58 |
\ nat_case(%g.c, %m g. d(m,g(m))))" |
0 | 59 |
end |