用不相关的术语来证明不相关的事情
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
这一事实来证明这一点。 (如果 pr1
和 pr2
都相关,我可以对它们进行匹配以证明 a = T = b
;但是我需要 Streicher 的 K 来给我 Thing.pr
条款。)
既然Thing.pr
是不相关的,我当然需要处于不相关的上下文中才能希望使用它。我以为我已经通过在其声明中 eq
的名称前面放置 .
来实现这一目标;但是当我尝试在洞中使用 pr1
时,我仍然收到通常的 "Variable pr1
is declared irrelevant, so it cannot be used here" 消息。
我可以在这里做我想做的事吗?我能否使 eq
变得足够无关紧要,以至于我可以在其定义中使用 pr1
和 pr2
? Using irrelevant fields 上的答案表明我可以,但就我的生活而言,我不明白为什么 Agda 不接受我得到的东西。
您可以简单地在 a
和 b
上进行模式匹配。 Agda 会意识到唯一的
可能的情况是 a = T
和 b = T
一个,然后你就可以放电了
refl
.
的目标
顺便说一下,eq
不需要声明无关。
在 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
这一事实来证明这一点。 (如果 pr1
和 pr2
都相关,我可以对它们进行匹配以证明 a = T = b
;但是我需要 Streicher 的 K 来给我 Thing.pr
条款。)
既然Thing.pr
是不相关的,我当然需要处于不相关的上下文中才能希望使用它。我以为我已经通过在其声明中 eq
的名称前面放置 .
来实现这一目标;但是当我尝试在洞中使用 pr1
时,我仍然收到通常的 "Variable pr1
is declared irrelevant, so it cannot be used here" 消息。
我可以在这里做我想做的事吗?我能否使 eq
变得足够无关紧要,以至于我可以在其定义中使用 pr1
和 pr2
? Using irrelevant fields 上的答案表明我可以,但就我的生活而言,我不明白为什么 Agda 不接受我得到的东西。
您可以简单地在 a
和 b
上进行模式匹配。 Agda 会意识到唯一的
可能的情况是 a = T
和 b = T
一个,然后你就可以放电了
refl
.
顺便说一下,eq
不需要声明无关。