| author | clasohm |
| Mon, 29 May 1995 14:12:48 +0200 | |
| changeset 1133 | 28e312a18946 |
| parent 1110 | 756aa2e81f6e |
| child 1155 | 928a16e02f9f |
| permissions | -rw-r--r-- |
| 0 | 1 |
(* Title: ZF/ex/integ.thy |
2 |
ID: $Id$ |
|
3 |
Author: Lawrence C Paulson, Cambridge University Computer Laboratory |
|
4 |
Copyright 1993 University of Cambridge |
|
5 |
||
6 |
The integers as equivalence classes over nat*nat. |
|
7 |
*) |
|
8 |
||
|
532
851df239ac8b
ZF/Makefile,ROOT.ML, ZF/ex/Integ.thy: updated for EquivClass
lcp
parents:
29
diff
changeset
|
9 |
Integ = EquivClass + Arith + |
| 0 | 10 |
consts |
11 |
intrel,integ:: "i" |
|
12 |
znat :: "i=>i" ("$# _" [80] 80)
|
|
13 |
zminus :: "i=>i" ("$~ _" [80] 80)
|
|
14 |
znegative :: "i=>o" |
|
15 |
zmagnitude :: "i=>i" |
|
16 |
"$*" :: "[i,i]=>i" (infixl 70) |
|
17 |
"$'/" :: "[i,i]=>i" (infixl 70) |
|
18 |
"$'/'/" :: "[i,i]=>i" (infixl 70) |
|
19 |
"$+" :: "[i,i]=>i" (infixl 65) |
|
20 |
"$-" :: "[i,i]=>i" (infixl 65) |
|
21 |
"$<" :: "[i,i]=>o" (infixl 50) |
|
22 |
||
| 753 | 23 |
defs |
| 0 | 24 |
|
25 |
intrel_def |
|
26 |
"intrel == {p:(nat*nat)*(nat*nat). \
|
|
27 |
\ EX x1 y1 x2 y2. p=<<x1,y1>,<x2,y2>> & x1#+y2 = x2#+y1}" |
|
28 |
||
29 |
integ_def "integ == (nat*nat)/intrel" |
|
30 |
||
31 |
znat_def "$# m == intrel `` {<m,0>}"
|
|
32 |
||
|
1110
756aa2e81f6e
Changed some definitions and proofs to use pattern-matching.
lcp
parents:
753
diff
changeset
|
33 |
zminus_def "$~ Z == UN <x,y>:Z. intrel``{<y,x>}"
|
| 0 | 34 |
|
35 |
znegative_def |
|
|
29
4ec9b266ccd1
Modification of examples for the new operators, < and le.
lcp
parents:
0
diff
changeset
|
36 |
"znegative(Z) == EX x y. x<y & y:nat & <x,y>:Z" |
| 0 | 37 |
|
38 |
zmagnitude_def |
|
|
1110
756aa2e81f6e
Changed some definitions and proofs to use pattern-matching.
lcp
parents:
753
diff
changeset
|
39 |
"zmagnitude(Z) == UN <x,y>:Z. (y#-x) #+ (x#-y)" |
| 0 | 40 |
|
|
1110
756aa2e81f6e
Changed some definitions and proofs to use pattern-matching.
lcp
parents:
753
diff
changeset
|
41 |
(*Cannot use UN<x1,y2> here or in zmult because of the form of congruent2. |
|
756aa2e81f6e
Changed some definitions and proofs to use pattern-matching.
lcp
parents:
753
diff
changeset
|
42 |
Perhaps a "curried" or even polymorphic congruent predicate would be |
|
756aa2e81f6e
Changed some definitions and proofs to use pattern-matching.
lcp
parents:
753
diff
changeset
|
43 |
better.*) |
| 0 | 44 |
zadd_def |
45 |
"Z1 $+ Z2 == \ |
|
|
1110
756aa2e81f6e
Changed some definitions and proofs to use pattern-matching.
lcp
parents:
753
diff
changeset
|
46 |
\ UN z1:Z1. UN z2:Z2. let <x1,y1>=z1; <x2,y2>=z2 \ |
|
756aa2e81f6e
Changed some definitions and proofs to use pattern-matching.
lcp
parents:
753
diff
changeset
|
47 |
\ in intrel``{<x1#+x2, y1#+y2>}"
|
| 0 | 48 |
|
49 |
zdiff_def "Z1 $- Z2 == Z1 $+ zminus(Z2)" |
|
50 |
zless_def "Z1 $< Z2 == znegative(Z1 $- Z2)" |
|
51 |
||
|
1110
756aa2e81f6e
Changed some definitions and proofs to use pattern-matching.
lcp
parents:
753
diff
changeset
|
52 |
(*This illustrates the primitive form of definitions (no patterns)*) |
| 0 | 53 |
zmult_def |
54 |
"Z1 $* Z2 == \ |
|
|
1110
756aa2e81f6e
Changed some definitions and proofs to use pattern-matching.
lcp
parents:
753
diff
changeset
|
55 |
\ UN p1:Z1. UN p2:Z2. split(%x1 y1. split(%x2 y2. \ |
| 0 | 56 |
\ intrel``{<x1#*x2 #+ y1#*y2, x1#*y2 #+ y1#*x2>}, p2), p1)"
|
57 |
||
58 |
end |