为什么在 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₁ ⟩ -> x
和proj₂ ≡ \ ⟨ x , x₁ ⟩ -> x₁
,它们是定义上的等式。
为什么模式匹配有时在 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₁ ⟩ -> x
和proj₂ ≡ \ ⟨ x , x₁ ⟩ -> x₁
,它们是定义上的等式。