这是Getting path induction to work in Agda
的后续问题我想知道这个结构何时可能更具表现力。在我看来,我们总是这样表达:
f : forall {A} -> {x y : A} -> x == y -> "some type"
f refl = instance of "some type" for p == refl
在这里,Agda将根据该问题的c : (x : A) -> C refl
示例进行路径归纳:
pathInd : forall {A} -> (C : {x y : A} -> x == y -> Set)
-> (c : (x : A) -> C refl)
-> {x y : A} -> (p : x == y) -> C p
似乎这个函数同构于:
f' : forall {A} -> {x y : A} -> x == y -> "some type"
f' = pathInd (\p -> "some type") (\x -> f {x} refl)
这两种方式(f
与pathInd
)的功效相同吗?
答案 0 :(得分:5)
pathInd
只是一个依赖的消除者。这是一个同构定义:
J : ∀ {α β} {A : Set α} {x y : A}
-> (C : {x y : A} {p : x ≡ y} -> Set β)
-> ({x : A} -> C {x} {x})
-> (p : x ≡ y) -> C {p = p}
J _ b refl = b
有了这个,您可以在_≡_
上定义各种函数而无需模式匹配,例如:
sym : ∀ {α} {A : Set α} {x y : A}
-> x ≡ y
-> y ≡ x
sym = J (_ ≡ _) refl
trans : ∀ {α} {A : Set α} {x y z : A}
-> x ≡ y
-> y ≡ z -> x ≡ z
trans = J (_ ≡ _ -> _ ≡ _) id
cong : ∀ {α β} {A : Set α} {B : Set β} {x y : A}
-> (f : A -> B)
-> x ≡ y
-> f x ≡ f y
cong f = J (f _ ≡ f _) refl
subst : ∀ {α β} {A : Set α} {x y : A}
-> (C : A -> Set β)
-> x ≡ y
-> C x -> C y
subst C = J (C _ -> C _) id
但你无法证明{1}中J
的身份证明的唯一性,如[1]所述:
uip : ∀ {α} {A : Set α} {x y : A} -> (p q : x ≡ y) -> p ≡ q
uip refl refl = refl
所以你可以用Agda的模式匹配来表达更多,而不仅仅是_≡_
的依赖消除器。但您可以使用--without-K
选项:
{-# OPTIONS --without-K #-}
open import Relation.Binary.PropositionalEquality
uip : ∀ {α} {A : Set α} {x y : A} -> (p q : x ≡ y) -> p ≡ q
uip refl refl = refl
uip
现在没有进行类型检查,导致此错误:
Cannot eliminate reflexive equation x = x of type A because K has
been disabled.
when checking that the pattern refl has type x ≡ x
答案 1 :(得分:5)
提供一个简短的答案:你说得对,Agda的模式匹配意味着存在路径归纳原语。事实上,已经证明,在具有宇宙的类型理论中,依赖模式匹配等同于归纳类型和所谓的K公理的归纳原语的存在:
http://link.springer.com/chapter/10.1007/11780274_27
最近,已经证明(最新实现)Agda的--without-K选项限制了模式匹配,使得它仅与感应类型的归纳原语的存在等效:
http://dl.acm.org/citation.cfm?id=2628136.2628139
完全披露:我是后者工作的合着者。