metis からの挑戦

 定理自体はともかく,an_am_coprime の "0" の証明に even_zero_int 等を持ち出さないあたり,さすが metis といったところでしょう.

theory prob01 imports Complex_Main "~~/src/HOL/Number_Theory/Primes" begin

fun a :: "nat => int" where
  "a 0 = 3" | "a (Suc n) = a n * a n - 2"

lemma an_odd: "odd (a n)" by (induct n, auto)

lemma an_am_gcd [rule_format]:
  "∀m. m < n --> (∃d. a n = d * a m - 2 ∨ a n = d * a m + 2)"
proof (induct n)
  case 0 thus ?case by auto
next
  case (Suc n)
 {fix m assume 0: "m < Suc n"
  have "∃d. a (Suc n) = d * a m - 2 ∨ a (Suc n) = d * a m + 2"
  proof (cases "m = n")
    case True thus "?thesis" by auto
  next
    case False hence "m < n" using 0 by auto
    with Suc.hyps obtain "d" where "a n = d * a m - 2 ∨ a n = d * a m + 2" by auto
    moreover have "a (Suc n) = (a n + 2) * (a n - 2) + 2" by simp algebra
    ultimately show "?thesis" by auto
  qed}
  thus ?case by auto
qed

theorem an_am_coprime:
  assumes "m < n" shows "coprime (a m) (a n)"
proof -
  let ?g = "gcd (a m) (a n)"
  have 0: "odd (?g)"
    using an_odd even_product gcd_coprime_exists_int gcd_zero_int
    by metis
  obtain "d" where "a n = d * a m - 2 ∨ a n = d * a m + 2"
    using assms an_am_gcd
    by auto
  moreover obtain "p" "q" where "a m = p * ?g ∧ a n = q * ?g"
    using 0 even_zero_int gcd_coprime_exists_int
    by metis
  ultimately have "(d * p - q) * ?g = 2 ∨ (q - d * p) * ?g = 2"
    by algebra
  thus "?g = 1"
    using two_is_prime_int prime_int_altdef 0 dvd_triv_right even_numeral_int gcd_ge_0_int
    by metis
qed

end