language-ats-1.6.0.0: test/data/prf_sqrt2.out
(*
** 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 } () :
[false] void
//
(* ****** ****** *)
primplmnt sqrt2_irrat {m,n} () =
let
prfun auxmain { m, n : nat | n >= 1; m*m == 2*n*n } .<m>. () :
[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] *)