证明伊莎贝尔的基本身份

时间:2017-02-19 19:23:25

标签: isabelle

请考虑以下定义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.但是在各种文件中戳戳并不是非常有用,我想我必须猜测一些聪明的引理我必须给自动证明成功。)

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证明很好的辅助引理。 (你需要它们来获得整个函数的更复杂的属性)