我从Isabelle的Wikipedia页面获得了以下代码:

theorem sqrt2_not_rational:
  "sqrt (real 2) ∉ ℚ"
proof
  assume "sqrt (real 2) ∈ ℚ"
  then obtain m n :: nat where
    n_nonzero: "n ≠ 0" and sqrt_rat: "¦sqrt (real 2)¦ = real m / real n"
    and lowest_terms: "gcd m n = 1" ..
  from n_nonzero and sqrt_rat have "real m = ¦sqrt (real 2)¦ * real n" by simp
  then have "real (m²) = (sqrt (real 2))² * real (n²)" by (auto simp add: power2_eq_square)
  also have "(sqrt (real 2))² = real 2" by simp
  also have "... * real (m²) = real (2 * n²)" by simp
  finally have eq: "m² = 2 * n²" ..
  hence "2 dvd m²" ..
  with two_is_prime have dvd_m: "2 dvd m" by (rule prime_dvd_power_two)
  then obtain k where "m = 2 * k" ..
  with eq have "2 * n² = 2² * k²" by (auto simp add: power2_eq_square mult_ac)
  hence "n² = 2 * k²" by simp
  hence "2 dvd n²" ..
  with two_is_prime have "2 dvd n" by (rule prime_dvd_power_two)
  with dvd_m have "2 dvd gcd m n" by (rule gcd_greatest)
  with lowest_terms have "2 dvd 1" by simp
  thus False by arith
qed

但是,当我将此文本复制到Isabelle实例中时,每行左侧有多个“请勿输入”符号。有人说“在顶层非法使用命令” theorem””,所以我认为您不能简单地在顶层定义一个定理,而Wikipedia页面没有提供完整的初始示例。我将定理包裹在一个理论中,如下所示:
theory Scratch
imports Main
begin

(* Theorem *)

end

Isabelle不再抱怨定理,但是在定理的第二行,它现在说:
Inner lexical error at: ℚ
Failed to parse proposition

它还抱怨证明线:
Illegal application of command "proof" in theory mode

定理中的其余行也有误差。
包装维基百科提供的该定理以便可以在Isabelle中进行检查的正确方法是什么?

最佳答案

我完全同意Manuel的观点,仅导入Main是不够的。如果您对证明不感兴趣,而只是对非理性性进行测试,那么很可能会包含来自形式化证明文件的$AFP/Real_Impl/Real_Impl:这样,非理性性测试将变得非常容易:

theory Test
imports "$AFP/Real_Impl/Real_Impl"
begin

lemma "sqrt 2 ∉ ℚ" by eval
lemma "sqrt 1.21 ∈ ℚ" by eval
lemma "sqrt 3.45 ∉ ℚ" by eval

end

10-06 05:34
查看更多