依赖记录类型的平等

时间:2016-05-27 16:13:01

标签: agda dependent-type

我一直在抨击这个问题一段时间:我有记录类型,有依赖字段,我想证明记录转换的平等性。我试图将我的问题的症结提炼成一个小例子。请考虑以下记录类型Rec,它在字段之间具有依赖关系:

module Bar where
open import Data.Nat
open import Relation.Binary.PropositionalEquality as PE
open import Relation.Binary.HeterogeneousEquality as HE

record Rec : Set where
  field val : ℕ
        inc : {n : ℕ} -> ℕ
        succ : inc {0} ≡ val

open Rec

succ属性说明了其他两个字段之间的关系:inc {0}返回val。以下函数incR定义了一个Rec变换器,它将值和增量值递增一个固定值m,从而保留了它们的交互:

succPrf : {x : Rec} {m : ℕ} -> (inc x {0} + m) ≡ val x + m
succPrf {x} {m} rewrite (PE.cong (\x -> x + m) (succ x)) = refl

incR : Rec -> ℕ -> Rec
incR x m = record {
            val = val x + m
          ; inc = λ{n} -> inc x {n} + m
          ; succ = succPrf {x} {m} }

此处succPrf提供了inc / val关系成立的证明。

现在,我想证明以下内容:

incR0 : forall {x : Rec} -> incR x 0 ≡ x
incR0 {x} = {!!}

然而,由于记录中的依赖性,这变得相当困难。

我尝试将其分解为各个领域的平等,目的是使用一致性将它重新组合在一起:而且似乎我可以走得很远:

postulate
  ext : {A : Set} {B : Set}
        {f g : {a : A} -> B} -> 
        (forall {n : A} -> f {n} ≡ g {n})
     -> (λ {n : A} -> f {n}) ≡ (λ {n : A} -> g {n})

  -- Trivial, but for tersity just postulated
  runit : {n : ℕ} -> n + 0 ≡ n

incRVal : forall {x : Rec} -> val (incR x 0) ≡ val x
incRVal {x} rewrite runit {val x} = refl

incRinc : forall {x : Rec} -> (λ{n : ℕ} -> inc (incR x 0) {n}) ≡ (λ{n : ℕ} -> inc x {n})
incRinc {x} rewrite ext (λ{n : ℕ} -> runit {inc x {n}}) = refl

succ字段上,我们不得不诉诸异类平等

succIncR : {x : Rec} -> (inc (incR x 0) {0} ≡ val (incR x 0) + 0) 
               ≡ (inc x {0} ≡ val x)
succIncR {x} rewrite runit {inc x {0}} | runit {val x} | incRVal {x}     
  = refl

incRsucc : forall {x : Rec} -> succ (incR x 0) ≅ succ x
incRsucc {x} rewrite succIncR {x} | succ x | runit {val x}
  = HE.reflexive refl

但我正在努力将这些结合起来。我真的需要Pi类型的某种一致性,以便我可以一次性插入incRincincRsucc,但我没有建立它。我正处于无法看到树木的地方,所以虽然我会看到SO的想法。我在这里错过了一些简单的技巧吗?

2 个答案:

答案 0 :(得分:4)

一般来说,西格玛的平等等同于平等的西格玛:

Σ-≡-intro :
  ∀ {α β}{A : Set α}{B : A → Set β}{a a' : A}{b : B a}{b' : B a'}
  → (Σ (a ≡ a') λ p → subst B p b ≡ b') → (a , b) ≡ (a' , b')
Σ-≡-intro (refl , refl) = refl

Σ-≡-elim :
  ∀ {α β}{A : Set α}{B : A → Set β}{a a' : A}{b : B a}{b' : B a'}
  → (a , b) ≡ (a' , b') → Σ (a ≡ a') λ p → subst B p b ≡ b'
Σ-≡-elim refl = refl , refl

我们可以将引入规则专门化并使其适应Rec,并且还可以用它来替换实际的依赖项(我使定义更加明确和压缩,因为我的孔类型更加清晰) :

open import Data.Nat
open import Relation.Binary.PropositionalEquality

record Rec : Set where
  constructor rec
  field val : ℕ
        inc : ℕ -> ℕ
        succ : inc 0 ≡ val
open Rec

incR : Rec -> ℕ -> Rec
incR x m = rec (val x + m) (λ n → inc x n + m) (cong (_+ m) (succ x))

Rec-≡-intro :
  ∀ {v v' : ℕ} {i i' : ℕ → ℕ}{s : i 0 ≡ v}{s' : i' 0 ≡ v'}(p : v ≡ v')(q : i ≡ i')
  → subst₂ (λ v i → i 0 ≡ v) p q s ≡ s'
  → rec v i s ≡ rec v' i' s'
Rec-≡-intro refl refl refl = refl

postulate
  ext : ∀ {α β} → Extensionality α β -- comes from PropositionalEquality
  runit : {n : ℕ} -> n + 0 ≡ n 

我们可以使用Rec-≡-intro来证明Rec上的平等:

incR0 : ∀ x -> incR x 0 ≡ x
incR0 x = Rec-≡-intro
  (runit {val x})
  (ext (λ n → runit {inc x n}))
  ?

剩下的洞有一个非常讨厌的类型,但我们基本上可以忽略它,因为的等式证明是命题,i。即相同值之间的所有相等证明都是相等的。换句话说,是一个集合:

ℕ-set : {n m : ℕ}(p p' : n ≡ m) → p ≡ p'
ℕ-set refl refl = refl

incR0 : ∀ x -> incR x 0 ≡ x
incR0 x = Rec-≡-intro
  (runit {val x})
  (ext (λ n → runit {inc x n}))
  (ℕ-set _ _)

我相信这里的所有证据最终都必须使用一些等同于ℕ-set的声明(或公理K;事实上,dorchard的解决方案仅适用于启用公理K),因为如果我们试图通常证明漏洞义务,在没有提及的情况下,我们需要一个在强烈的Martin-Löf类型理论中无法证明的引理:

lem :
  ∀ {A : Set}{z : A}{f i : A → A}(q₁ : f (i z) ≡ (i z))(q₂ : (λ x → f (i x)) ≡ i)
  → subst₂ (λ v i → i z ≡ v) q₁ q₂ refl ≡ refl
lem q₁ q₂ = {!!}

我在MLTT中似乎无法证明,因为我们可以在HoTT中找到反例。

如果我们假设公理K,我们有证据不相关,可以在这里使用:

proof-irrelevance : ∀ {a} {A : Set a} {x y : A} (p q : x ≡ y) → p ≡ q
proof-irrelevance refl refl = refl

lem :
  ∀ {A : Set}{z : A}{f i : A → A}(q₁ : f (i z) ≡ (i z))(q₂ : (λ x → f (i x)) ≡ i)
  → subst₂ (λ v i → i z ≡ v) q₁ q₂ refl ≡ refl
lem q₁ q₂ = proof-irrelevance _ _

但这有点傻,因为现在我们不妨填补我们原来的洞:

incR0 : ∀ x -> incR x 0 ≡ x
incR0 x = Rec-≡-intro
  (runit {val x})
  (ext (λ n → runit {inc x n}))
  (proof-irrelevance _ _)

答案 1 :(得分:1)

道歉自我答案,但我破解了它。我不知道这是否是最优雅的方式,但我得到了依赖同余的想法,将正常和异质的平等混合在一起:

Rec-cong : {x y : Rec}
    -> (val x ≡ val y)
    -> ((λ {n} -> inc x {n}) ≡ (λ{n} -> inc y {n}))
    -> (succ x ≅ succ y)
    -> x ≡ y
Rec-cong {x} {y}  prf1 prf2 prf3 with prf1 | prf2 | prf3
Rec-cong {x} {.x} prf1 prf2 prf3      refl | refl | refl = refl

incR0 : forall {x : Rec} -> incR x 0 ≡ x
incR0 {x} = Rec-cong {incR x 0} {x} (incRVal {x}) (incRinc {x}) (incRsucc {x})

我欢迎更好的解决方案!