language-ats-1.7.0.0: test/data/prf_sqrt2.dats
(*
** Some code used in the book INT2PROGINATS
*)
(* ****** ****** *)
abstype
MOD0(m: int, p: int) // m=p*q
(* ****** ****** *)
//
extern
prfun
lemma_MOD0_intr
{m,p,q:nat | m==p*q}(): MOD0(m, p)
extern
prfun
lemma_MOD0_elim
{m,p:int}
(MOD0(m, p)): [q:nat] EQINT(m, p*q)
//
(* ****** ****** *)
abstype PRIME(p:int)
(* ****** ****** *)
//
extern
prfun
lemma_PRIME_param
{p:int}(pf: PRIME(p)): [p >= 2] void
//
(* ****** ****** *)
//
extern
prfun
mylemma1{n,p:int}
(MOD0(n*n, p), PRIME(p)): MOD0(n, p)
//
(* ****** ****** *)
extern
prfun
mylemma_main
{m,n,p:int | m*m==p*n*n}(PRIME(p)): [m2:nat | n*n==p*m2*m2] void
(* ****** ****** *)
extern
prfun
square_is_nat{m:int}(): [m*m>=0] void
(* ****** ****** *)
primplmnt
mylemma_main
{m,n,p}(pfprm) = let
prval pfeq_mm_pnn =
eqint_make{m*m,p*n*n}()
prval () = square_is_nat{m}()
prval () = square_is_nat{n}()
prval () = lemma_PRIME_param(pfprm)
prval
pfmod1 =
lemma_MOD0_intr{m*m,p,n*n}()
prval
pfmod2 = mylemma1{m,p}(pfmod1, pfprm)
prval
[m2:int]
EQINT() =
lemma_MOD0_elim(pfmod2)
prval EQINT() = pfeq_mm_pnn
prval () =
__assert{p}{p*m2*m2,n*n}() where
{
extern prfun __assert{p:pos}{x,y:int | p*x==p*y}(): [x==y] void
}
in
0
end // end of [mylemma_main]
(* ****** ****** *)
//
extern
prfun
sqrt2_irrat
{m,n:nat |
n >= 1; m*m==2*n*n}((*void*)): [false] void
//
(* ****** ****** *)
primplmnt
sqrt2_irrat
{m,n}((*void*)) = let
prfun
auxmain
{m,n:nat |
n >= 1;
m*m==2*n*n} .<m>.
(
// argless
) : [false] void = let
prval pfprm =
__assert() where
{
extern praxi __assert(): PRIME(2)
}
prval
[m2:int] () = mylemma_main{m,n,2}(pfprm)
prval () =
__assert() where { extern praxi __assert(): [m > n] void }
prval () =
__assert() where { extern praxi __assert(): [m2 >= 1] void }
in
auxmain{n,m2}()
end
in
auxmain{m,n}()
end // end of [sqrt2_irrat]
(* ****** ****** *)
implement main0 () = ()
(* ****** ****** *)
(* end of [sqrt2_irrat.dats] *)