我尝试编写自己的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)
答案 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) _⊗_ = {!!}