如何将J公理转换为固定参数形式?

时间:2019-01-26 13:28:28

标签: agda

我试图证明true ≡ false -> Empty假设J公理。定义为:

J : Type
J = forall 
  {A : Set} 
  {C : (x y : A) → (x ≡ y) → Set} → 
  (c : ∀ x → C x x refl) → 
  (x y : A) → 
  (p : x ≡ y) → 
  C x y p

我的尝试是这样的:

bad : J → true ≡ false -> Empty
bad j e = j Bool (λ { true _ _ => Unit; false _ _ => Empty }) _

现在,要进行证明,我需要一个术语c : ∀ x -> C x x refl。自从我实例化C以来,它变成了c : ∀ x -> (λ { true _ _ => Unit; false _ _ => Empty } x x refl。然后我被卡住了。 c无法进一步减少,因为我们不知道x的价值。我无法完成此证明。但是J有另一种版本:

J' : Type
J' = forall 
  {A : Set} 
  {x : A}
  {C : (y : A) → (x ≡ y) → Set} → 
  (c : C x refl) → 
  (y : A) → 
  (p : x ≡ y) → 
  C y p

有了这个,就解决了这个问题,因为t可以固定为true。这使c参数减少为Unit,我们可以提供。我的问题是:我们可以将以前的版本转换为以后的版本吗?也就是说,我们可以建立术语fix_x : J → J'吗?总体而言是否成立(即索引可以转换为参数)吗?

1 个答案:

答案 0 :(得分:2)

首先,关于true ≡ false -> Empty:如果只能用Set0消除到J中,这是无法证明的,因此您需要Universe多态或大定义。我在这里写一些预告片:

{-# OPTIONS --without-K #-}

open import Relation.Binary.PropositionalEquality
open import Level

data Bool : Set where true false : Bool
data Empty : Set where
record Unit : Set where
  constructor tt

JTy : ∀ {i j} → Set _
JTy {i}{j} =
  {A   : Set i}
  (P   : (x y : A) → (x ≡ y) → Set j) →
  (pr  : ∀ x → P x x refl) →
  {x y : A} →
  (p   : x ≡ y) →
  P x y p

J : ∀ {i}{j} → JTy {i}{j}
J P pr {x} refl = pr x

J₀ = J {zero}{zero}

现在,transportsubsttrue ≡ false -> Empty唯一需要的东西:

transp : ∀ {i j}{A : Set i}(P : A → Set j){x y} → x ≡ y → P x → P y
transp P = J (λ x y _ → P x -> P y) (λ _ px → px)

true≢false : true ≡ false → Empty
true≢false e = transp (λ {true → Unit; false → Empty}) e tt

现在考虑从J'证明有针对性的J,我知道三种解决方案,每种解决方案都使用与环境理论不同的功能。

最简单的方法是使用宇宙对归纳动机进行抽象:

JTy' : ∀ {i j} → Set _
JTy' {i}{j} =
  {A  : Set i}
  {x  : A}
  (P  : ∀ y → x ≡ y → Set j)
  (pr : P x refl)
  {y  : A}
  (p  : x ≡ y)
  → P y p

JTy→JTy' : (∀ {i j} → JTy {i}{j}) → ∀ {i}{j} → JTy' {i}{j}
JTy→JTy' J {i} {j} {A} {x} P pr {y} e =
  J (λ x y e → (P : ∀ y → x ≡ y → Set j) → P x refl → P y e)
     (λ x P pr → pr) e P pr

如果我们只想使用固定的Universe级别,则要复杂一些。以下解决方案有时称为“可收缩的单例”,需要Σ类型,但不需要其他类型:

open import Data.Product

JTy→JTy'withΣ : JTy {zero}{zero} → JTy' {zero}{zero}
JTy→JTy'withΣ J {A} {x} P pr {y} e =
  J (λ {(x , r) (y , e) _ → P x r → P y e})
    (λ _ px → px)
    (J (λ x y e → (x , refl) ≡ (y , e))
       (λ _ → refl)
       e)
    pr

有一种解决方案甚至不需要Σ -s,但是需要J的beta规则,即J P pr {x} refl = pr x。这条规则是否在定义上成立还是作为命题相等都没有关系,但是在定义上持有时,构造会更简单,所以让我们来做。请注意,除Set0外,我不使用任何其他Universe。

transp₀ = transp {zero}{zero}

transp2 : ∀ {A : Set}{B : A → Set}(C : ∀ a → B a → Set)
        {x y : A}(e : x ≡ y){b} → C x b → C y (transp₀ B e b)
transp2 {A}{B} C {x}{y} e {b} cxb =
  J₀ (λ x y e → ∀ b → C x b → C y (transp₀ B e b)) (λ _ _ cxb → cxb) e b cxb

JTy→JTy'noΣU : JTy' {zero}{zero}
JTy→JTy'noΣU {A} {x} P pr {y} e =
    transp₀ (P y) (J₀ (λ x y e → transp₀ (x ≡_) e refl ≡ e) (λ _ → refl) e)
      (transp2 {A} {λ y → x ≡ y} P e pr)

从哲学上讲,第三个版本是最“保守的”,因为它仅假设J。 Beta规则的添加实际上并不是多余的事情,因为始终假定_≡_持有(定义上或命题上)。

  

可以将索引转换为参数吗?

如果具有命题相等性,那么所有索引都可以转换为参数,并使用相等性证明在构造函数中固定。