2016-01-07 36 views
1

看來,要證明記錄類型的兩個項目是等價的,我需要編寫一個幫助程序,它需要組件明智的證明並應用它們。 一個例子: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應該以某種方式提供給我的,我不需要寫自己--or是我錯了。

此外,我不能證明SillyEq沒有聲明一個構造函數,然後模式匹配就可以了。

感謝您的協助!

回答

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元數泛型版本,那麼你就可以證明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₃ _#_#_ 

然而,像你的情況命題和異構平等的混合複雜的一切。

+0

也許這兩種形式的平等混合並不是最好的,但是僅僅使用異質平等的主要缺點是什麼? 也就是說,就你所知,證明記錄類型的平等性的唯一方法是使用cong的變體? –

+3

@Musa Al-hassy,只需使用異構平等即可。當'x≅y'中的'x'和'y'具有相同的類型時,'_≅_'的作用與'_≡_'相同並且沒有問題,您只需要稍微更明確的類型。但是當'x:A i'和'y:j''你失去了在'x≅y'上使用標準'cong','subst'和類似的東西的能力。我更喜歡定義一個包裝器(類似於[this](http://dlicata.web.wesleyan.edu/pubs/lb15cubicalsynth/lb15cubicalsynth.pdf)中的'PathOver'文件,其中包含'indeq:i≡j'和'valeq :x≅y'並定義新的'cong'和'subst'填充它。 – user3237465

+1

@Musa Al-hassy,某些記錄在定義上與'all-eq:{xy:⊤} - > x≡y'相等或'記錄R:設置字段.n:ℕ; all-eq₂:{rs:R} - > r≡s',但其他需要證明。你怎麼知道兩個元組相等而不知道它們的投影是相等的?或者你想保留什麼? – user3237465