为什么模式匹配有时在 Agda 中是“必不可少的”?

马克斯·海伯

为什么模式匹配有时在 Agda 中是“必不可少的”?

我正在从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 文本说:

左侧的模式匹配是必不可少的,因为替换w⟨ x , y ⟩允许命题等式的两边都简化为相同的项。

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

萨萨 NF

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么同一包有时是必不可少的,而又不是必不可少的?

库清单中的`android:supportsRtl =“ true”`是否必不可少?有时会导致错误

Agda中的已知模式匹配

Aquamacs中的Agda模式

代码GetAsyncKeyState(VK_SHIFT)和0x8000中的这些数字是什么?它们是必不可少的吗?

在应用程序包中包含所有可绘制文件夹的图标是否必不可少?

在Node中,为什么“需要”分配有时需要大括号?

为什么F#中允许使用可变项?什么时候必不可少?

为什么 Agda 中的 Haskell 类型类以“Raw”开头?

为什么有时在匹配中取消引用变量?

了解Agda中的unquoteDecl

我完全删除了libsqlite3-0,所有必不可少的东西也都删除了。如何还原ubuntu?

Akka Play必不可少的

辅助副本在Service Fabric中是否必不可少

通常,Java或编程中的break语句是必不可少的吗?

为什么函数组成和应用程序在Agda中具有依赖的实现?

有限多集作为Cubical Agda中的HIT

Scala中的模式匹配有多快

如何在Idris / Agda / Coq中对多个值进行模式匹配?

在agda中合并排序

Agda中的非平凡否定

在Agda中模拟ST monad

Agda 证明中的替换术语

为什么有时在Java代码中实现Singleton模式被认为是Java模式中的反模式?

类型类是必不可少的吗?

Laravel Homestead是必不可少的吗?

为什么 Agda 拒绝 Set₁ → Set₁?

Agda如何确定类型是不可能的

为什么当直接匹配有效时,这种负前瞻 Unicode 正则表达式在 JavaScript 中不起作用?