用与Agda无关的证明等效关系重写吗?

时间:2019-04-12 07:31:25

标签: agda

我对类型理论和依赖类型编程非常陌生,最近正在尝试使用Agda的各种功能。以下是我编写的记录类型C的一个非常简化的示例,其中包含多个组件记录和一些可以证明事实的约束。

open import Relation.Binary.PropositionalEquality 

module Sample (α : Set) where
  record A (type : α) : Set where

  record B : Set where
    field
      type : α

  record C : Set where
    field
      b₁ : B
      b₂ : B
      eq : B.type b₁ ≡ B.type b₂

    conv : A (B.type b₁) → A (B.type b₂)
    conv a rewrite eq = a

对我来说似乎很吸引人的是,应该通过在前面添加eq : B.type b₁ ≡ B.type b₂来声明约束.不相关(或者在最新的dev版本2.6.0中,用的等价关系代替排序Prop,例如

data _≡_ {ℓ} {α : Set ℓ} (x : α) : α → Prop ℓ where
  refl : x ≡ x

),因此可以通过C直接统一具有相同组件的两个类型refl的实例,而不必考虑eq的不同证明。但是,无论哪种方式,程序都会停止编译,因为我无法在不相关的值/ Prop上进行模式匹配。

我想知道是否有可能以某种方式在Agda中实现相同的功能,或者总的来说,为什么在Agda中不可能用与证明无关的等效关系重写(技术支持困难,或者打破了阿格达的类型理论的某些部分,等等?

1 个答案:

答案 0 :(得分:1)

由于技术限制,目前在Agda中尚无法实现:'rewrite'只是用于refl上模式匹配的语法糖,并且当前不允许对无关参数进行模式匹配。在我们的paper at POPL '19中,我们描述了一个准则,Prop中的数据类型是“自然”的,因此可以对其进行模式匹配。我希望在2.6.1发行版之前将此标准添加到Agda中,但是我不能做出任何承诺(总是欢迎对Agda开发的帮助)。