[英]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
将适用于证明。
那当n
是suc 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 ≡ n
和1 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.