阿格达权力定理

时间:2014-02-10 03:59:12

标签: function numbers agda

我正在努力证明以下内容:

1-pow : ∀ {n : ℕ} → 1 pow n ≡ 1
1-pow {zero} = refl
1-pow {suc x} = {!!}  

我是Adga的新手,甚至不知道从哪里开始。有什么建议或指导吗?显然很容易在纸上证明,但我不确定该告诉Agda。

我将pow功能定义如下:

_pow_ : ℕ → ℕ → ℕ
x pow zero = 1
x pow (suc zero) = x
x pow (suc y) = x * (x pow y)

1 个答案:

答案 0 :(得分:5)

当您在n的{​​{1}}上进行模式匹配并发现它是1-pow时,Agda会查看zero的定义并检查是否有其中一个_pow_函数子句匹配。第一个是,所以它将应用该定义,1 pow zero变为11显然等于1,因此refl将适用于证明。

n suc x时的情况怎么样?问题在于:Agda无法提交第二个子句(因为x可能是zero),也不能提交第三个子句(因为x对于某些suc y可能是y })。因此,您必须更进一步确保Agda应用_pow_的定义:

1-pow : ∀ {n : ℕ} → 1 pow n ≡ 1
1-pow {zero}        = refl
1-pow {suc zero}    = {!!}
1-pow {suc (suc x)} = {!!}

让我们看看第一洞的类型是什么。 Agda告诉我们它是1 ≡ 1,因此我们可以再次使用refl。最后一个有点棘手,我们应该生成1 * 1 pow (suc x) ≡ 1类型的东西。假设您正在使用_*_的标准定义(即左侧参数的递归和左侧的重复添加,例如标准库中的重复添加),这应该减少到1 pow (suc x) + 0 ≡ 1。归纳假设(即1-pow应用于suc x)告诉我们1 pow (suc x) ≡ 1

所以我们差不多了,但我们不知道n + 0 ≡ n(因为加法是由左参数的递归定义的,所以我们不能简化这个表达式)。一种选择是证明这一事实,我将其留作练习。不过,这里有一个提示:你可能会觉得这个功能很有用。

cong : ∀ {a b} {A : Set a} {B : Set b}
       (f : A → B) {x y} → x ≡ y → f x ≡ f y
cong f refl = refl

它已经是Relation.Binary.PropositionalEquality模块的一部分,因此您无需自己定义它。

所以,回顾一下:我们知道n + 0 ≡ n1 pow (suc x) ≡ 1,我们需要1 pow (suc x) + 0 ≡ 1。这两个事实很好地融合在一起 - 平等是可传递的,所以我们应该能够将1 pow (suc x) + 0 ≡ 1 pow (suc x)1 pow (suc x) ≡ 1合并到一个证明中,事实上,情况确实如此:

1-pow {suc (suc x)} = trans (+0 (1 pow suc x)) (1-pow {suc x})

就是这样!


我想提一下其他方法。

整个证据也可以使用1 * x ≡ x的证明来完成,尽管这与我们以前的证据几乎没有什么不同。

您可以将_pow_简化为:

_pow_ : ℕ → ℕ → ℕ
x pow zero    = 1
x pow (suc y) = x * (x pow y)

使用起来稍微方便一些。证据将相应地改变(即它不具有原始证据的第二个条款)。

最后,你可以这样做:

1-pow : ∀ {n : ℕ} → 1 pow n ≡ 1
1-pow {zero}        = refl
1-pow {suc zero}    = refl
1-pow {suc (suc x)} = cong (λ x → x + 0) (1-pow {suc x})

试着找出原因为何!如果您有任何问题,请在评论中告诉我,我会帮助您。

相关问题