你如何使用 Agda 中的荒谬证明来证明荒谬的模式?

How do you make use of a proof of absurdity in Agda for an absurd pattern?

我正在尝试编写自己的 foldr1 版本,它采用非空 Vec A n(有证明 n ≡ zero → ⊥)和二元运算 A → A → A 和 returns 类型 A 的值。即:

foldr1 : {A : Set} {n : ℕ} (n ≡ zero → ⊥) → (A → A → A) → Vec A n → A

问题是,试图将荒谬的模式应用于案例 foldr1 p binop [] () 编译器说:

Cannot eliminate type A with pattern () (did you supply too many arguments?)

由于编译器无法自行推断出荒谬性,我希望能够手动提供证明,例如:foldr1 p binop [] (p refl) where refl : n \equiv zero,但编译器会不喜欢那种语法。

有没有办法在Agda中手动提供荒谬的证明来构造荒谬的模式?如果不是,我怎样才能让编译器推断出我写的确实是一个荒谬的模式?我的代码是这样的:

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

data ⊥ : Set where

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

您可以定义 ⊥-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) _⊗_ = {!!}