使用不相关的字段

时间:2016-01-04 06:46:28

标签: agda

是否可以声明记录中的字段不相关但仍然在某处使用它们?

假设我有

postulate f : ℕ → ℕ
record Silly x : Set where
  field
    n : ℕ
    s : f n ≡ x

open Silly

然后,我可以

same-silly : ∀{x} {p q : Silly x} → f (n p) ≡ f(n q)
same-silly {x} {p} {q} = ≡-trans (s p) (≡-sym (s q))

但如果我使用虚线字段,

record Silly x : Set where
  field
    n : ℕ
    .s : f n ≡ x  -- note the dot

然后same-silly再也无法证明了 - 至少不是我。 当我尝试使用s时,如上面的定义,Agda通知我Identifier s is declared irrelevant, so it cannot be used here

据我所知,我通过点击它来声明s无关紧要,但我仍然希望能够对它进行一些访问:足以定义same-silly。有没有办法让这一点但不完全访问?我的意思是我在考虑s作为一种相干条件,我想在蓝月亮中使用一次,但不是很重要,所以点。也许忽略这一段。

是否可以形成same-silly并点缀s

除此之外:虚线图案意味着命题平等与关系

一致
_~_ : ∀{x} (p q : Silly x) → Set
p ~ q = n p ≡ n q

?特别是,通过添加到记录constructor _#_,我可以显示

eq : ∀{m x}{p q : f m ≡ x} → (m # p) ≡ (m # q) 
eq = ≡-refl

但我还不确定点域是否意味着定义相等会忽略虚线字段。

我正在浏览http://wiki.portal.chalmers.se/agda/agda.php?n=ForkedReferenceManual.Records#Irrelevantfields;这表示有虚线字段的投影,但似乎我不能在任何地方使用它们。

感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

您可以使用不相关的投影,但仅限于您在不相关的上下文中工作时。进入不相关背景的一种方法是使证明本身无关紧要:

.same-silly : ∀{x} {p q : Silly x} → f (n p) ≡ f(n q)
same-silly {x} {p} {q} = ≡-trans (s p) (≡-sym (s q))

这意味着您只能在不相关的环境中使用相同的愚蠢证据。

关于你的第二个问题,答案是肯定的:你可以证明以下内容:

silly-equality : ∀ {n} {x y : Silly n} → x ~ y → x ≡ y
silly-equality refl = refl

因此,第一个投影的平等(你的关系)确实对应于命题平等。