阿格达:为什么我无法在refl上进行模式匹配?

时间:2013-12-19 12:39:01

标签: pattern-matching agda

我试图证明关于整数的可分性问题。首先,我试图证明可分性是反思性的。

∣-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 - ba + (neg b)
  • 定义
  • 我已经证明n-n≡0 : (n : ℤ) → n - n ≡ zero

1 个答案:

答案 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 ∣ n0∣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