我试图证明关于整数的可分性问题。首先,我试图证明可分性是反思性的。
∣-refl : ∀{n} → n ∣ n
因为我根据减法定义了可分性......
data _∣_ : ℤ → ℤ → Set where
0∣d : ∀{d} → zero ∣ d
n-d∣d : ∀{n d} → (n - d) ∣ d → n ∣ d
......如果我使用n-n=0
:
∣-refl {n} with n-n≡0 n
... | refl = n-d∣d 0∣d
但是Agda拒绝在refl上进行模式匹配。即使没有其他正常形式的n-n=0 n
。我用其他功能证明了这一点。我只需要使用n-n=0
。
C:\Users\ebolnme\Desktop\agda\Integers.agda:118,7-11
n + neg n != zero of type ℤ
when checking that the pattern refl has type n + neg n ≡ zero
注意:
a - b
由a + (neg b)
n-n≡0 : (n : ℤ) → n - n ≡ zero
答案 0 :(得分:6)
平等证明没有什么可谈的。在构造函数上进行模式匹配时,它可以细化其他参数(及其类型)。在你的情况下,n-n≡0 n
应该优化n - n
,但是没有这样的表达式,Agda会给你这个(有点令人费解的)错误信息。
您可以通过在with
中引入表达式来解决这个问题:
∣-refl : ∀ {n} → n ∣ n
∣-refl {n} with n - n | n-n≡0 n
... | ._ | refl = ?
我们可以更清楚地了解左侧,这很好地展示了如何进行细化:
∣-refl {n} with n - n | n-n≡0 n
∣-refl {n} | .zero | refl = ?
但是,当您尝试填写定义的其余部分时:
∣-refl {n} with n - n | n-n≡0 n
∣-refl {n} | .zero | refl = n-d∣d 0∣d
类型检查器再次不同意。为什么会这样? n-d∣d
类型应为(n - n) ∣ n → n ∣ n
,0∣d
类型为0 ∣ n
。可是等等!我们是否只是表明n - n
实际上是0
?
模式匹配的事情和它引起的精炼是它只发生一次,右边不会受它影响(顺便说一下,这是我们拥有{的原因之一{1}}机械)。我们如何处理它?</ p>
有一个名为inspect
的函数,它采用subst
类型的内容,证明P a
并给我们a ≡ b
。请注意,如果我们将P b
替换为λ x → x ∣ n
,将P
替换为zero
而将a
替换为n - n
,我们将获得一个{{1}的函数并且给我们b
(当然是为了合适的证据)。
确实:
zero ∣ n
接受此定义:n - n ∣ n
的类型为∣-refl {n} = n-d∣d (subst (λ x → x ∣ n) (sym (n-n≡0 n)) 0∣d)
,适用于subst ... 0∣d
。请注意,我们还需要n - n ∣ n
的证明,但我们有n-d∣d
- 这里我们使用zero ≡ n - n
是对称的事实(n - n ≡ zero
)。
为了完整起见,这里是≡
:
sym