Agda中的记录平等

时间:2016-01-07 03:31:13

标签: record equality agda

似乎要证明记录类型的两个项是等价的,我需要编写一个帮助程序来获取组件明智的证据并应用它们。 一个例子:

postulate P : ℕ → Set

record Silly : Set (ℓsuc ℓ₀) where
 constructor _#_#_
 field
  n : ℕ
  pn : P n
  f : Set → ℕ

open Silly

SillyEq : ∀ s t → n s ≡ n t → pn s ≅ pn t → f s ≡ f t → s ≡ t
SillyEq (n # pn # f) (.n # .pn # .f) ≡-refl ≅-refl ≡-refl = ≡-refl

我觉得SillyEq应该以某种方式提供给我,我不需要自己写 - 或者我错了。

另外,如果没有声明构造函数然后在其上进行模式匹配,我无法证明SillyEq

感谢您的协助!

1 个答案:

答案 0 :(得分:3)

具有

SillyEq' : ∀ {n₁ n₂ pn₁ pn₂ f₁ f₂}
         → n₁ ≡ n₂ → pn₁ ≅ pn₂ → f₁ ≡ f₂ → (n₁ # pn₁ # f₁) ≡ (n₂ # pn₂ # f₂)

您可以将SillyEq证明为

SillyEq : ∀ s t → n s ≡ n t → pn s ≅ pn t → f s ≡ f t → s ≡ t
SillyEq _ _ = SillyEq'

由于Silly的η规则。因此,如果你有cong的arity-generic版本,那么你可以证明SillyEq为(注意到各处的异构平等)

SillyEq : ∀ s t → n s ≅ n t → pn s ≅ pn t → f s ≅ f t → s ≅ t
SillyEq _ _ = gcong 3 _#_#_

我不知道gcong是否可以通过反射轻松表达,但我想它可以使用通常的arity-generic编程内容(如here)编写,但解决方案胜出'是短暂的。

这是一个临时证明:

cong₃ : ∀ {α β γ δ} {A : Set α} {B : A -> Set β} {C : ∀ {x} -> B x -> Set γ}
          {D : ∀ {x} {y : B x} -> C y -> Set δ} {x y v w s t}
      -> (f : ∀ x -> (y : B x) -> (z : C y) -> D z)
      -> x ≅ y -> v ≅ w -> s ≅ t -> f x v s ≅ f y w t
cong₃ f refl refl refl = refl

SillyEq : ∀ s t → n s ≅ n t → pn s ≅ pn t → f s ≅ f t → s ≅ t
SillyEq _ _ = cong₃ _#_#_

然而,在你的案例中,命题和异质等同的混合使一切变得复杂。