在平等证明中代替平等

时间:2017-01-26 13:19:52

标签: agda

我有以下定义

open import Relation.Binary.PropositionalEquality

data _≅_ (A B : Set) : Set where
  mkBij : (f : A → B) (g : B → A)
          → (∀ a → a ≡ g (f a))
          → (∀ b → b ≡ f (g b))
          → A ≅ B

我试图表现出传递性。我有我需要的东西,但我不知道如何将它们组合起来得到我想要的证明对象。这是迄今为止的证据。

transtv : ∀ {A B C} → A ≅ B → B ≅ C → A ≅ C
transtv (mkBij f₁ g₁ x y) (mkBij f₂ g₂ w z) =
  mkBij (λ x₁ → f₂ (f₁ x₁)) (λ z₁ → g₁ (g₂ z₁))
        (λ a → let xa = x a
                   wb = w (f₁ a)
               in {!!})
        (λ c → let zc = z c
                   yb = y (g₂ c)
               in {!!})

在第一洞,我有这些:(第二洞是相同的)

Goal: a ≡ g₁ (g₂ (f₂ (f₁ a)))
wb : f₁ a ≡ g₂ (f₂ (f₁ a))
xa : a ≡ g₁ (f₁ a)

现在,显而易见的是,如果我在f₁ a中将g₂ (f₂ (f₁ a))替换为xa,我就会达到目标。但我不知道如何在agda中进行替换。我需要做什么样的功能或语言构造?

2 个答案:

答案 0 :(得分:3)

你可以把它写成非常紧凑的

trans xa (cong g₁ wb)

或者,使用Function._⟨_⟩_

xa ⟨ trans ⟩ (cong g₁ wb)

答案 1 :(得分:1)

我用以下方式用等式推理解决了它:

transtv : ∀ {A B C} → A ≅ B → B ≅ C → A ≅ C
transtv (mkBij f₁ g₁ x y) (mkBij f₂ g₂ w z) =
  mkBij (λ x₁ → f₂ (f₁ x₁)) (λ z₁ → g₁ (g₂ z₁))
        (λ a → let xa = x a
                   wb = w (f₁ a)
               in begin
                     a
                   ≡⟨ xa ⟩
                     g₁ (f₁ a)
                   ≡⟨ cong g₁ wb ⟩
                     g₁ (g₂ (f₂ (f₁ a)))
                   ∎)
        (λ c → let zc = z c
                   yb = y (g₂ c)
               in begin
                    c
                  ≡⟨ zc ⟩
                    f₂ (g₂ c)
                  ≡⟨ cong f₂ yb ⟩
                    f₂ (f₁ (g₁ (g₂ c)))
                  ∎)