请考虑以下定义definition phi :: "nat ⇒ nat" where "phi n = card {k∈{0<..n}. coprime n k}"
(另请参阅此answer)
我怎样才能证明一个非常基本的事实,比如phi(p)= p-1的素数p?这是引理的一种可能的形式化,虽然我不确定它是最好的:
lemma basic:
assumes "prime_elem (p::nat) = true"
shows "phi p = p-1"
(prime_elem
)中定义了Factorial_Ring.thy
使用try
resp。 try0
无法在任何地方领先。 (虽然手工证明是直接的,因为任何小于p和p之间的GCD是1.但是在各种文件中戳戳并不是非常有用,我想我必须猜测一些聪明的引理我必须给自动证明成功。)
答案 0 :(得分:1)
首先,true
不存在。 Isabelle将其解释为一个自由的布尔变量(正如你可以看到它是蓝色印刷的)。你的意思是True
。另外,写prime_elem p = True
有点单调;只需写下prime_elem p
。
接下来,我建议使用prime p
。它相当于自然界的prime_elem
;对于其他类型,区别在于prime
也要求元素为“规范”,即2 :: int
为素数,但-2 :: int
不是。
所以你的引理看起来像这样:
lemma basic:
assumes "prime_elem (p::nat)"
shows "phi p = p - 1"
proof -
接下来,您应该证明以下内容:
from assms have "{k∈{0<..p}. coprime p k} = {0<..<p}"
如果你向其投掷auto
,你将获得两个子目标,而sledgehammer
可以解决这两个子目标,所以你已经完成了。但是,由此产生的证据有点难看:
apply auto
apply (metis One_nat_def gcd_nat.idem le_less not_prime_1)
by (simp add: prime_nat_iff'')
然后你可以用这个简单地证明你的总体目标:
thus ?thesis by (simp add: phi_def)
这种Isar证明是一种更合理和更健全的方式:
lemma basic:
assumes "prime (p::nat)"
shows "phi p = p - 1"
proof -
have "{k∈{0<..p}. coprime p k} = {0<..<p}"
proof safe
fix x assume "x ∈ {0<..p}" "coprime p x"
with assms show "x ∈ {0<..<p}" by (cases "x = p") auto
next
fix x assume "x ∈ {0<..<p}"
with assms show "coprime p x" by (simp add: prime_nat_iff'')
qed auto
thus ?thesis by (simp add: phi_def)
qed
顺便说一句,我建议按以下方式重构您的定义:
definition rel_primes :: "nat ⇒ nat set" where
"rel_primes n = {k ∈ {0<..n}. coprime k n}"
definition phi :: "nat ⇒ nat" where
"phi n = card (rel_primes n)"
然后你可以为rel_primes
证明很好的辅助引理。 (你需要它们来获得整个函数的更复杂的属性)