我从Isabelle的维基百科页面获得了以下代码:
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实例时,每行左侧有多个“不输入”符号。有人说“非法应用命令”定理“在顶层”,所以我假设你不能简单地在顶层定义一个定理,并且维基百科页面没有提供一个完整的初始例子。我把理论包含在理论中如下:
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中进行检查?
答案 0 :(得分:2)
你猜你必须用你所做的方式将“定理”命令包装在理论中是正确的。但是,您需要更多的导入,imports Main
甚至不会加载包含sqrt,有理数和素数的理论。
此外,维基百科上的证据有点过时了。伊莎贝尔是一个非常有活力的系统;它的维护者在每个版本中移植库中的所有证据和Archive of Formal Proofs,但是某些地方(例如维基百科)的代码片段在一段时间后会变得过时,我认为这个特定的版本是古老的。
对于几乎相同的最新证据,正确地嵌入到具有正确导入的理论中,请看这里: http://isabelle.in.tum.de/repos/isabelle/file/4546c9fdd8a7/src/HOL/ex/Sqrt.thy
请注意,这是针对Isabelle的开发版本;它可能不适用于您的版本。在任何情况下,您应该在下载的Isabelle发行版中使用与src / HOL / ex / Sqrt.thy相同版本的相同文件。
答案 1 :(得分:2)
我完全同意Manuel,仅导入Main
是不够的。如果你对证据不感兴趣,而只是测试非理性,那么很有可能包括来自Formal Proofs存档的$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
答案 2 :(得分:1)
可能你遇到了一些编码困难 - 这是我的问题(我得到了同样的错误)。
Isabelle使用所谓的'Isabelle符号'来表示unicode字符(见三 (参考手册)[来自第307页的{http://isabelle.in.tum.de/doc/isar-ref.pdf])。
如果使用随jEdit
分发的Isabelle 2014
IDE,则-->
看起来与\<longrightarrow>
(Isabelle符号)相同。第一个无法解析,第二个是正确的。如果您复制并粘贴维基代码,这就是它破坏的原因。
您还可以查看<yourIsabelleInstallFolder/src/HOL/Isar_Examples.thy
中的示例,以进一步使用isabelle符号和使用Isar语言编写的一般结构证据。