【问题标题】:Understanding Assignment Solution in Agda了解 Agda 中的分配解决方案
【发布时间】:2023-04-09 00:35:01
【问题描述】:

考虑以下提取的代码片段,用于证明 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) Γ≈

我需要解释⊥-elimtoWitnessFalsetoWitness 的工作原理。另外, 的表达是什么意思/代表什么?

【问题讨论】:

标签: functional-programming agda bottom-type


【解决方案1】:

是空类型,因此(总体而言,一致的语言)你永远不能构造 类型的值。但是这个also means,你能想到的任何提议,都来自。这就是⊥-elim见证人:

⊥-elim : ∀ {w} {Whatever : Set w} → ⊥ → Whatever

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

toWitness的类型及相关定义如下:

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 PTrue Q(如果Q = yes _)或(如果Q = no _)。那么,调用toWitness 的唯一方法是让QP 为真并传递平凡的单元构造函数tt : ⊤;唯一的另一种可能性是让QP 是错误的,并将 作为参数传递,但正如我们所见,这是不可能的。总之,toWitness 表示如果Q 告诉我们P 成立的决定,那么我们可以从Q 获得P 的证明。

toWitnessFalse 与角色反转完全相同:如果Q 告诉我们P 不成立的决定,那么我们可以从Q 获得¬ P 的证明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-31
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多