PVSのこと(5)

prob10:theory begin

for_a:lemma forall(a:posreal,b:posreal,c:int,m:int,n:int):1 / a + 1 / b = 1 =>
c <= m * a & m * a < c + 1 => c <= n * b & n * b < c + 1 => c = m * a

%|- for_a : PROOF
%|- (then (skeep)
%|-  (spread (case "c < m * a")
%|-   ((spread (case "c/a <m & m<(c+1)/a & c/b<=n & n<(c+1)/b")
%|-     ((then (delete -2 -4 -5 -6 -7) (flatten)
%|-       (spread (case "c*(1/a+1/b)<m+n & m+n<(c+1)*(1/a+1/b)")
%|-        ((then (replace -6 * LR) (grind-reals)) (grind-reals))))
%|-      (grind-reals)))
%|-    (ground))))
%|- QED

for_a_b:lemma forall(a:posreal,b:posreal,c:int,m:int,n:int):1 / a + 1 / b = 1 =>
c <= m * a & m * a < c + 1 => c <= n * b & n * b < c + 1 => c = m * a & c = n * b

%|- for_a_b : PROOF
%|- (then (skeep) (lemma "for_a")
%|-  (spread (split 1)
%|-   ((then (inst -1 "a" "b" "c" "m" "n") (grind))
%|-    (then (inst -1 "b" "a" "c" "n" "m") (grind)))))
%|- QED

prob10:theorem forall (a: posreal, b: posreal, m: int, n: int):
        1 / a + 1 / b = 1 =>
         not (exists (p: rat): a = p) & not (exists (q: rat): b = q) =>
          (m /= 0 or n /= 0) => floor(m * a) /= floor(n * b)

%|- prob10 : PROOF
%|- (then (skeep) (lemma "floor_def" ("x" "m * a"))
%|-  (lemma "floor_def" ("x" "n * b")) (name "c" "floor(n*b)")
%|-  (replace -1 * LR) (replace -6 * LR) (lemma "for_a_b")
%|-  (inst -1 "a" "b" "c" "m" "n")
%|-  (spread (split -6)
%|-   ((then (inst 1 "c/m") (grind-reals))
%|-    (then (inst 2 "c/n") (grind-reals)))))
%|- QED

end prob10