rationals defines the rational numbers as an uninterpreted subtype of real. The basic number operations are redeclared in order to specify that they are closed, e.g. the sum of two rationals is a rational.
rationals
:
THEORY
BEGIN
rational
:
NONEMPTY_TYPE
FROM
real
%%
rational_pred:
[real-
>
boolean]
;
%%
rational_nonempty:
AXIOM
rat
:
NONEMPTY_TYPE
=
rational
rational?((n:number)):
bool
=
real
pred(n)
AND
rational
pred(n);
%%(TCC)
nonzero_rational_TCC1:
OBLIGATION
nonzero
rational
:
NONEMPTY_TYPE
=
{(r:rational)
|
r
/=
0}
CONTAINING
1
nzrat
:
NONEMPTY_TYPE
=
nonzero
rational
nzrat
is
nzreal:
JUDGEMENT
nonzero
rational
SUBTYPE_OF
nonzero
real
closed
plus:
AXIOM
rational
pred(x
+
y)
closed
minus:
AXIOM
rational
pred(x
-
y)
closed
times:
AXIOM
rational
pred(x
*
y)
closed
divides:
AXIOM
rational
pred(x
/
n0z)
closed
neg:
AXIOM
rational
pred(-x)
%%(TCC)
rat_plus_rat_is_rat:
OBLIGATION
rat
plus
rat
is
rat:
JUDGEMENT
+(x,
y)
HAS_TYPE
rat
%%(TCC)
rat_minus_rat_is_rat:
OBLIGATION
rat
minus
rat
is
rat:
JUDGEMENT
-(x,
y)
HAS_TYPE
rat
%%(TCC)
rat_times_rat_is_rat:
OBLIGATION
rat
times
rat
is
rat:
JUDGEMENT
*(x,
y)
HAS_TYPE
rat
%%(TCC)
rat_div_nzrat_is_rat:
OBLIGATION
rat
div
nzrat
is
rat:
JUDGEMENT
/(x,
n0z)
HAS_TYPE
rat
%%(TCC)
minus_rat_is_rat:
OBLIGATION
minus
rat
is
rat:
JUDGEMENT
-(x)
HAS_TYPE
rat
nonneg
rat
:
NONEMPTY_TYPE
=
{(r:rational)
|
r
>
=
0}
CONTAINING
0
nonpos
rat
:
NONEMPTY_TYPE
=
{(r:rational)
|
r
<
=
0}
CONTAINING
0
posrat
:
NONEMPTY_TYPE
=
{(r:nonneg
rat)
|
r
>
0}
CONTAINING
1
negrat
:
NONEMPTY_TYPE
=
{(r:nonpos
rat)
|
r
<
0}
CONTAINING
-1
nnrat
:
NONEMPTY_TYPE
=
nonneg
rat
nprat
:
NONEMPTY_TYPE
=
nonpos
rat
nnx:
VAR
nonneg
rat
nny:
VAR
nonneg
rat
npx:
VAR
nonpos
rat
npy:
VAR
nonpos
rat
nnrat
is
nnreal:
JUDGEMENT
nonneg
rat
SUBTYPE_OF
nonneg
real
nprat
is
npreal:
JUDGEMENT
nonpos
rat
SUBTYPE_OF
nonpos
real
posrat
is
posreal:
JUDGEMENT
posrat
SUBTYPE_OF
posreal
negrat
is
negreal:
JUDGEMENT
negrat
SUBTYPE_OF
negreal
%%(TCC)
posrat_is_nzrat:
OBLIGATION
posrat
is
nzrat:
JUDGEMENT
posrat
SUBTYPE_OF
nzrat
%%(TCC)
negrat_is_nzrat:
OBLIGATION
negrat
is
nzrat:
JUDGEMENT
negrat
SUBTYPE_OF
nzrat
%%(TCC)
nzrat_times_nzrat_is_nzrat:
OBLIGATION
nzrat
times
nzrat
is
nzrat:
JUDGEMENT
*(n0x,
n0y)
HAS_TYPE
nzrat
%%(TCC)
nzrat_div_nzrat_is_nzrat:
OBLIGATION
nzrat
div
nzrat
is
nzrat:
JUDGEMENT
/(n0x,
n0y)
HAS_TYPE
nzrat
%%(TCC)
minus_nzrat_is_nzrat:
OBLIGATION
minus
nzrat
is
nzrat:
JUDGEMENT
-(n0x)
HAS_TYPE
nzrat
%%(TCC)
nnrat_plus_nnrat_is_nnrat:
OBLIGATION
nnrat
plus
nnrat
is
nnrat:
JUDGEMENT
+(nnx,
nny)
HAS_TYPE
nonneg
rat
%%(TCC)
nnrat_times_nnrat_is_nnrat:
OBLIGATION
nnrat
times
nnrat
is
nnrat:
JUDGEMENT
*(nnx,
nny)
HAS_TYPE
nonneg
rat
%%(TCC)
nnrat_div_posrat_is_nnrat:
OBLIGATION
nnrat
div
posrat
is
nnrat:
JUDGEMENT
/(nnx,
py)
HAS_TYPE
nonneg
rat
%%(TCC)
nnrrat_div_negrat_is_nprat:
OBLIGATION
nnrrat
div
negrat
is
nprat:
JUDGEMENT
/(nnx,
ny)
HAS_TYPE
nprat
%%(TCC)
nprat_plus_nprat_is_nprat:
OBLIGATION
nprat
plus
nprat
is
nprat:
JUDGEMENT
+(npx,
npy)
HAS_TYPE
nprat
%%(TCC)
nprat_times_nprat_is_nnrat:
OBLIGATION
nprat
times
nprat
is
nnrat:
JUDGEMENT
*(npx,
npy)
HAS_TYPE
nnrat
%%(TCC)
nprat_div_posrat_is_nprat:
OBLIGATION
nprat
div
posrat
is
nprat:
JUDGEMENT
/(npx,
py)
HAS_TYPE
nprat
%%(TCC)
nprat_div_negrat_is_nnrat:
OBLIGATION
nprat
div
negrat
is
nnrat:
JUDGEMENT
/(npx,
ny)
HAS_TYPE
nnrat
%%(TCC)
posrat_plus_nnrat_is_posrat:
OBLIGATION
posrat
plus
nnrat
is
posrat:
JUDGEMENT
+(px,
nny)
HAS_TYPE
posrat
%%(TCC)
nnrat_plus_posrat_is_posrat:
OBLIGATION
nnrat
plus
posrat
is
posrat:
JUDGEMENT
+(nnx,
py)
HAS_TYPE
posrat
%%(TCC)
posrat_times_posrat_is_posrat:
OBLIGATION
posrat
times
posrat
is
posrat:
JUDGEMENT
*(px,
py)
HAS_TYPE
posrat
%%(TCC)
posrat_div_posrat_is_posrat:
OBLIGATION
posrat
div
posrat
is
posrat:
JUDGEMENT
/(px,
py)
HAS_TYPE
posrat
%%(TCC)
negrat_plus_negrat_is_negrat:
OBLIGATION
negrat
plus
negrat
is
negrat:
JUDGEMENT
+(nx,
ny)
HAS_TYPE
negrat
%%(TCC)
negrat_times_negrat_is_posrat:
OBLIGATION
negrat
times
negrat
is
posrat:
JUDGEMENT
*(nx,
ny)
HAS_TYPE
posrat
%%(TCC)
negrat_div_negrat_is_posrat:
OBLIGATION
negrat
div
negrat
is
posrat:
JUDGEMENT
/(nx,
ny)
HAS_TYPE
posrat
END
rationals