为什么在 Agda 中模式匹配有时 "essential"?

Why is pattern matching sometimes "essential" in Agda?

为什么模式匹配有时在 Agda 中 "essential"?

我要从 Programming Language Foundations in Agda 中取出这个。

当不进行模式匹配时,Agda 给出不允许 refl 在洞中:

η-× : ∀ {A B : Set} (w : A × B) → ⟨ proj₁ w , proj₂ w ⟩ ≡ w
η-× x = ?

它报告了这个目标和假设:

Goal: ⟨ proj₁ x , proj₂ x ⟩ ≡ x
————————————————————————————————————————————————————————————
x : A × B

但是如果我告诉它进行大小写拆分,Agda 可以弄清楚发生了什么(ctrl-c ctrl-c x Ret)

η-× : ∀ {A B : Set} (w : A × B) → ⟨ proj₁ w , proj₂ w ⟩ ≡ w
η-× ⟨ x , x₁ ⟩ = ?
Goal: ⟨ x , x₁ ⟩ ≡ ⟨ x , x₁ ⟩

然后 Agda 让我用 refl 填空。

这是怎么回事?模式匹配如何为 Agda 提供更多信息?

PLFA 文字说:

The pattern matching on the left-hand side is essential, since replacing w by ⟨ x , y ⟩ allows both sides of the propositional equality to simplify to the same term.

但这并没有说明为什么模式匹配有助于简化,或者我们什么时候可以期望看到这种效果。

这样构造的等式的意义可以看作是两个函数存在的证明:∀ {A B : Set} (w : A × B) → ⟨ proj₁ w , proj₂ w ⟩∀ {A B : Set} (w : A × B) → w,必须证明它们对相同的输入产生相等的输出。

在第一种情况下,该陈述需要证明\ w -> ⟨ proj₁ w , proj₂ w ⟩ ≡ \ w -> w。 Agda 告诉你没有定义的等式可以得出结论。有人可能会争辩说,对于单一构造函数类型,它可以自动计算出来,但你可以看到这通常不是那么简单。

在第二种情况下,鉴于模式匹配证明w ≡ ⟨ x , x₁ ⟩,你只需要证明proj₁ ≡ \ ⟨ x , x₁ ⟩ -> xproj₂ ≡ \ ⟨ x , x₁ ⟩ -> x₁,它们是定义上的等式。