PVSのこと(7)

sqrtp:theory begin
importing ints@primes, ints@gcd, reals@sqrt

lem1:lemma forall(p:int): prime?(p) => (exists(n:posint): p = n * n) => False

%|- lem1 : PROOF
%|- (then (skeep*)
%|-  (spread (case "divides (n,p)")
%|-   ((then (expand "prime?" -2) (flatten) (inst -2 "n") (assert)
%|-     (flatten) (replace -2 -4 LR) (cancel-by -4 "p"))
%|-    (then (expand "divides") (inst?)))))
%|- QED

lem2:lemma forall(p:int,n,d:posint): rel_prime (n,d) => n * n = p * d * d => d = 1

%|- lem2 : PROOF
%|- (then (skeep*) (use "rel_prime_lem") (assert) (skeep*)
%|-  (spread (case "1=m*m*(n*n)+2*m*n*n_1*d+n_1*n_1*d*d")
%|-   ((then (replace -4 -1 LR)
%|-     (spread (case "1=(m*m*d*p+2*m*n*n_1+n_1*n_1*d)*d")
%|-      ((then (use "product_one") (assert)) (grind))))
%|-    (grind))))
%|- QED

lem3:lemma forall(p:int): prime?(p) =>
 (exists(n,d:posint): n / d = sqrt(p) & rel_prime (n,d)) => False

%|- lem3 : PROOF
%|- (then (skeep*) (mult-by -2 "d") (field -1)
%|-  (spread (case "n * n = p * d * d")
%|-   ((then (use* "lem2") (simplify -1) (replace -5 * LR)
%|-     (replace -1 -2 LR) (simplify -2) (use* "lem1") (assert) (inst?)
%|-     (grind))
%|-    (grind))))
%|- QED

end sqrtp