用不相关的术语来证明不相关的事情

Using irrelevant terms to prove irrelevant things

在 Agda 2.6.0.1 中,我想在一条记录中使用不相关的证明项,然后仅根据它们的数据项证明其中两条记录相等。

data Bools : Set where
  T : Bools
  F : Bools

record Thing : Set where
  field
    val : Bools
    .pr : val == T

.eq : (a b : Thing) -> a == b
eq record { val = a ; pr = pr1 } record { val = b ; pr = pr2 } = ?

我觉得我应该能够通过每个 Thing 知道它的 val 等于 T 这一事实来证明这一点。 (如果 pr1pr2 都相关,我可以对它们进行匹配以证明 a = T = b;但是我需要 Streicher 的 K 来给我 Thing.pr条款。)

既然Thing.pr是不相关的,我当然需要处于不相关的上下文中才能希望使用它。我以为我已经通过在其声明中 eq 的名称前面放置 . 来实现这一目标;但是当我尝试在洞中使用 pr1 时,我仍然收到通常的 "Variable pr1 is declared irrelevant, so it cannot be used here" 消息。

我可以在这里做我想做的事吗?我能否使 eq 变得足够无关紧要,以至于我可以在其定义中使用 pr1pr2Using irrelevant fields 上的答案表明我可以,但就我的生活而言,我不明白为什么 Agda 不接受我得到的东西。

您可以简单地在 ab 上进行模式匹配。 Agda 会意识到唯一的 可能的情况是 a = Tb = T 一个,然后你就可以放电了 refl.

的目标

顺便说一下,eq不需要声明无关。