似乎要证明记录类型的两个项是等价的,我需要编写一个帮助程序来获取组件明智的证据并应用它们。 一个例子:
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
。
感谢您的协助!
答案 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₃ _#_#_
然而,在你的案例中,命题和异质等同的混合使一切变得复杂。