你如何使用 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) _⊗_ = {!!}
我正在尝试编写自己的 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) _⊗_ = {!!}