你如何利用阿格达的荒谬证据来获得荒谬的模式?

时间:2017-03-22 15:04:20

标签: agda

我尝试编写自己的foldr1版本,该版本采用非空Vec A n(带有证明n ≡ zero → ⊥)和二进制操作{{1}并返回A类型的值。即:

A → A → A

问题是,尝试将荒谬的模式应用于案例foldr1 : {A : Set} {n : ℕ} (n ≡ zero → ⊥) → (A → A → A) → Vec A n → A 编译器说:

  

不能用模式()消除类型A(你提供的太多了吗?   参数?)

由于编译器无法推断其自身的荒谬性,我希望能够手动提供证明,执行以下操作:foldr1 p binop [] ()其中{{1}但是编译器不喜欢这种语法。

有没有办法在Agda手动提供荒谬的证据来构建荒谬的模式?如果没有,我怎样才能让编译器推断出我所写的内容确实是荒谬的模式?我的代码类似于:

foldr1 p binop [] (p refl)

1 个答案:

答案 0 :(得分:3)

您可以定义⊥-elim : {A : Set} → ⊥ → A或使用已定义它的Data.Empty中定义的空类型:

open import Data.Vec
open import Data.Nat
open import Data.Empty
open import Relation.Binary.PropositionalEquality 

binfold₁ : {n : ℕ} → {A : Set} → (n ≡ zero → ⊥) → Vec A n → (A → A → A) → A 
binfold₁ p []      _⊗_ = ⊥-elim (p refl)
binfold₁ p (x ∷ v) _⊗_ = {!!}

但你也可以选择另一种类型,而不是要求证明n ≡ zero → ⊥,而是要求Vec A (suc n)类型的向量:

binfold₁' : {n : ℕ} → {A : Set} → Vec A (suc n) → (A → A → A) → A 
binfold₁' (x ∷ v) _⊗_ = {!!}