繁体   English   中英

阿格达幂定理

[英]Agda Theorems for Powers

我正在尝试证明以下内容:

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

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

我将pow函数定义如下:

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

当您在1-pow中对n进行模式匹配并发现其zero ,Agda将查看_pow_的定义,并检查其中一个功能子句是否匹配。 第一个这样做,因此它将应用该定义,并且1 pow zero变为1 1显然等于1 ,所以refl将适用于证明。

那当nsuc x时又如何呢? 这里的问题:阿格达不能承诺第二条(因为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 归纳假设(即,对suc x施加1-pow )告诉我们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})

尝试找出原因。 如果您有任何问题,请在评论中让我知道,我们将为您提供帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM