假设我有一个传递关系~
,其中包含两个endomaps f
和g
。
假设f
和g
在所有地方都达成一致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
?感谢任何帮助。
答案 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 ≅ y
和x
具有非统一类型时,最初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
上进行模式匹配,首先需要将n
与m
统一起来
OK : ∀ {n m} {i : Fin n} {j : Fin m} -> n ≡ m -> i ≅ j -> ...
OK refl refl = ...
这是异质平等的主要缺点:你需要提供各地索引相等的证明。通常cong
和subst
是非索引的,因此您还必须提供它们的索引版本(或使用更烦人的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 i
与A j
统一起来,而是明确地携带[_]_≅_
类型的索引,这使得它们可用于统一。当索引统一时,两种类型都变得相同A i
,并且可以像命题相等一样继续进行。
修改强>
异构平等的另一个问题是,它不是完全异构的:x : A, y : B, x ≅ y
A
和B
必须位于同一个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))