“subst”的分布

时间:2016-01-18 01:34:03

标签: equality agda dependent-type

假设我有一个传递关系~,其中包含两个endomaps fg。 假设fg在所有地方都达成一致f a ~ f b ~ f c 然后有两种方式来显示g a ~ g c: 通过给定的等式将每个f转换为g然后应用 传递性, 或者应用传递性然后沿着平等变换。 结果证明是否相同?显然是这样,

open import Relation.Binary.PropositionalEquality

postulate A : Set
postulate _~_  : A → A → Set
postulate _⟨~~⟩_ : ∀{a b c} → a ~ b → b ~ c → a ~ c
postulate f g : A → A

subst-dist : ∀{a b c}{ef : f a ~ f b}{psf : f b ~ f c} → (eq : ∀ {z} → f z ≡ g z)
     → 
         subst₂ _~_ eq eq ef ⟨~~⟩ subst₂ _~_ eq eq psf 
       ≡ subst₂ _~_ eq eq (ef ⟨~~⟩ psf)

subst-dist {a} {b} {c} {ef} {psf} eq rewrite eq {a} | eq {b} | eq {c} = refl

我刚刚了解了rewrite关键字并认为它可能对此有所帮助;显然它确实如此。但是,老实说,我不明白这里发生了什么。我有其他时间使用rewrite,理解。但是,所有这些subst让我感到困惑。

我想知道

  • 是否有更简单的方法来获取subst-dist?也许在图书馆里有类似的东西?
  • rewrite
  • 的这种特殊用法正在发生什么
  • subst-dist的替代证明,不使用重写(最重要)
  • 是否有另一种方法可以在不使用g a ~ g c的情况下获取subst
  • 使用异构平等的一些缺点是什么,似乎并不像大多数人喜欢它。 (也很重要)

感谢任何帮助。

1 个答案:

答案 0 :(得分:5)

rewrite只是一个加糖的with,它只是加糖的“顶级”模式匹配。见Agda’s documentation

  

使用异构平等的一些缺点是什么呢   好像大多数人都不喜欢它。 (也很重要)

这没关系

types-equal : ∀ {α} {A B : Set α} {x : A} {y : B} -> x ≅ y -> A ≡ B
types-equal refl = refl

这也没关系

A-is-Bool : {A : Set} {x : A} -> x ≅ true -> A ≡ Bool
A-is-Bool refl = refl

这是一个错误

fail : ∀ {n m} {i : Fin n} {j : Fin m} -> i ≅ j -> n ≡ m
fail refl = {!!}

-- n != m of type ℕ
-- when checking that the pattern refl has type i ≅ j

因为Fin n ≡ Fin m并未立即暗示n ≡ m(您可以通过启用--injective-type-constructors来实现此目的,但makes Agda anti-classical)(Fin n ≡ Fin m -> n ≡ m为{{} 3}}虽然)。

x ≅ yx具有非统一类型时,最初Agda允许在y上进行模式匹配,但这允许编写奇怪的内容,例如(引自provable线程)

  P : Set -> Set
  P S = Σ S (\s → s ≅ true)

  pbool : P Bool
  pbool = true , refl

  ¬pfin : ¬ P (Fin 2)
  ¬pfin ( zero , () )
  ¬pfin ( suc zero , () )
  ¬pfin ( suc (suc ()) , () )

  tada : ¬ (Bool ≡ Fin 2)
  tada eq = ⊥-elim ( ¬pfin (subst (\ S → P S) eq pbool ) )
  

Saizan或者它只是忽略了类型并比较了构造函数名称?

     

pigworker Saizan:这正是我认为正在发生的事情

     

Andread Abel:

     
      
  • 如果我轻轻修改代码,我可以证明Bool不等Bool2,其中true2,false2:Bool2(参见文件..22.agda)
  •   
  • 但是,如果我将构造函数重命名为true,false:Bool2,那么我突然无法证明Bool不再等于Bool2了(参见   其他文件)。所以,目前Agda2比较了苹果和橘子   某些情况。 ; - )
  •   

因此,为了在i ≅ j i : Fin n, j : Fin m上进行模式匹配,首先需要将nm统一起来

OK : ∀ {n m} {i : Fin n} {j : Fin m} -> n ≡ m -> i ≅ j -> ...
OK refl refl = ...

这是异质平等的主要缺点:你需要提供各地索引相等的证明。通常congsubst是非索引的,因此您还必须提供它们的索引版本(或使用更烦人的cong₂subst₂)。

“heterindexed”没有这样的问题(我不知道它是否有正确的名称)平等

data [_]_≅_ {ι α} {I : Set ι} {i} (A : I -> Set α) (x : A i) : ∀ {j} -> A j -> Set where
  refl : [ A ] x ≅ x

e.g。

OK : ∀ {n m} {i : Fin n} {j : Fin m} -> [ Fin ] i ≅ j -> n ≡ m
OK refl = refl

更一般地说,只要您拥有x : A i, y : A j, p : [ A ] x ≅ y,就可以在p上进行模式匹配,j将与i统一,因此您无需携带n ≡ m的其他证明。

在Agda中呈现的异构平等也是this

修改

x : A, y : B, x ≅ y上的模式匹配等于A ≡ B上的模式匹配,然后将上下文中的每个y更改为x。所以当你写

fail : ∀ {n m} {i : Fin n} {j : Fin m} -> i ≅ j -> n ≡ m
fail refl = {!!}

相同
fail' : ∀ {n m} {i : Fin n} {j : Fin m} -> Fin n ≡ Fin m -> i ≅ j -> n ≡ m
fail' refl refl = {!!}

但您无法在Fin n ≡ Fin m

上进行模式匹配
fail-coerce : ∀ {n m} -> Fin n ≡ Fin m -> Fin n -> Fin m
fail-coerce refl = {!!}

-- n != m of type ℕ
-- when checking that the pattern refl has type Fin n ≡ Fin m

就像你不能模式匹配

fail'' : ∀ {n m} -> Nat.pred n ≡ Nat.pred m -> n ≡ m
fail'' refl = {!!}

-- n != m of type ℕ
-- when checking that the pattern refl has type Nat.pred n ≡ Nat.pred m

一般

f-inj : ∀ {n m} -> f n ≡ f m -> ...
f-inj refl = ...

仅在f显然是单射的情况下才有效。即如果f是一系列构造函数(例如suc (suc n) ≡ suc (suc m))或计算它(例如2 + n ≡ 2 + m)。类型构造函数(Fin是)不是单射的,因为这会使Agda反经典,因此除非启用Fin n ≡ Fin m,否则无法在--injective-type-constructors上进行模式化。

指数统一为

data [_]_≅_ {ι α} {I : Set ι} {i} (A : I -> Set α) (x : A i) : ∀ {j} -> A j -> Set where
  refl : [ A ] x ≅ x

因为您没有尝试将A iA j统一起来,而是明确地携带[_]_≅_类型的索引,这使得它们可用于统一。当索引统一时,两种类型都变得相同A i,并且可以像命题相等一样继续进行。

修改

异构平等的另一个问题是,它不是完全异构的:x : A, y : B, x ≅ y AB必须位于同一个Universe中。 data定义中对Universe级别的处理最近已经改变,现在我们可以定义完全异构的等式:

data _≅_ {α} {A : Set α} (x : A) : ∀ {β} {B : Set β} -> B -> Set where
  refl : x ≅ x

但这不起作用

levels-equal : ∀ {α β} -> Set α ≅ Set β -> α ≅ β
levels-equal refl = refl

-- Refuse to solve heterogeneous constraint Set α : Set (suc α) =?=
-- Set β : Set (suc β)

因为Agda认为suc不是单射的

suc-inj : {α β : Level} -> suc α ≅ suc β -> α ≅ β
suc-inj refl = refl

-- α != β of type Level
-- when checking that the pattern refl has type suc α ≅ suc β

如果我们假设它,那么我们可以证明levels-equal

hcong : ∀ {α β δ} {A : Set α} {B : Set β} {D : Set δ} {x : A} {y : B}
      -> (f : ∀ {γ} {C : Set γ} -> C -> D) -> x ≅ y -> f x ≅ f y
hcong f refl = refl

levelOf : ∀ {α} {A : Set α} -> A -> Level
levelOf {α} _ = α

postulate
  suc-inj : {α β : Level} -> suc α ≅ suc β -> α ≅ β

levels-equal : ∀ {α β} -> Set α ≅ Set β -> α ≅ β
levels-equal p = suc-inj (suc-inj (hcong levelOf p))