Functional programming 理解Agda中的赋值解

Functional programming 理解Agda中的赋值解,functional-programming,agda,bottom-type,Functional Programming,Agda,Bottom Type,考虑以下提取的代码片段,以证明Agda中变量的“类型唯一性”: unicity : ∀ {Γ₁ Γ₂ e τ₁ τ₂} → (Γ₁ ⊢ e ∷ τ₁) → (Γ₂ ⊢ e ∷ τ₂) → (Γ₁ ≈ Γ₂) → (τ₁ ∼ τ₂) unicity (VarT here) (VarT here) (_ , ( τ∼ , _ )) = τ∼ unicity (VarT here) (VarT (ski`p {α = α} lk2)) (s≡s' , ( _ , _ )) = ⊥-elim

考虑以下提取的代码片段,以证明Agda中变量的“类型唯一性”:

unicity : ∀ {Γ₁ Γ₂ e τ₁ τ₂} →  (Γ₁ ⊢ e ∷ τ₁) → (Γ₂ ⊢ e ∷ τ₂) → (Γ₁ ≈ Γ₂) → (τ₁ ∼ τ₂)
unicity   (VarT here) (VarT here) (_ , ( τ∼ , _ ))   = τ∼ 
unicity (VarT here) (VarT (ski`p {α = α} lk2)) (s≡s' , ( _ , _ )) = ⊥-elim (toWitnessFalse α (toWitness` s≡s'))
unicity (VarT (skip {α = α} lk1)) (VarT here) (s'≡s , ( _ , _ )) = ⊥-elim (toWitnessFalse α (toWitness s'≡s))
unicity (VarT (skip lk1)) (VarT (skip lk2)) (_ ,( _ , Γ≈ ))     = unicity (VarT lk1) (VarT lk2) Γ≈
我需要解释一下
⊥-elim
toWitnessFalse
toWitness
。另外,表达式
mean/stand for?

是空类型,因此(用一种完全一致的语言)永远不能构造类型为
。但这是你能想到的任何命题,都来自
。这就是
⊥-elim
证人:

⊥-elim : ∀ {w} {Whatever : Set w} → ⊥ → Whatever
这在实践中非常有用,因为您可能在某些假设下编写证明,其中一些假设可能是
,或者它们可能是否定语句(
A→ ⊥A
),你也可以证明
A
,等等。然后,你发现你实际上不必再关心那个特定的分支,因为这是不可能的;但是,仅仅因为你不在乎,你仍然必须以某种方式正式满足结果类型。这就是
⊥-elim
为您提供

的类型和相关定义如下:

T : Bool → Set
T true  = ⊤
T false = ⊥

⌊_⌋ : ∀ {p} {P : Set p} → Dec P → Bool
⌊ yes _ ⌋ = true
⌊ no  _ ⌋ = false

True : ∀ {p} {P : Set p} → Dec P → Set
True Q = T ⌊ Q ⌋

toWitness : ∀ {p} {P : Set p} {Q : Dec P} → True Q → P
给定一个
Q:Dec p
True Q
(如果
Q=yes
)或
(如果
Q=no
)。调用
toWitness
的唯一方法是让
Q
P
为真,并传递平凡的单元构造函数
tt:⊤;唯一的另一种可能性是让
Q
P
为false,并将a
toWitness
表示,如果
Q
告诉我们
P
的决定成立,那么我们可以从
Q
获得
P
的证明


与角色颠倒的情况完全相同:如果
Q
告诉我们
p
不成立的决定,那么我们可以从
Q

获得
-p
的证明。您能提供一个自包含的文件吗?至于,你可以看看标准库的文档。@gallais,你能详细说明一下吗?比如它们是如何工作的?