Functional programming 我能证明具有不同构造函数的类型是不相交的吗?
如果我试图证明Nat和Bool在Agda中不相等:Functional programming 我能证明具有不同构造函数的类型是不相交的吗?,functional-programming,agda,dependent-type,Functional Programming,Agda,Dependent Type,如果我试图证明Nat和Bool在Agda中不相等: open import Data.Nat open import Data.Bool open import Data.Empty open import Relation.Binary.PropositionalEquality noteq : ℕ ≡ Bool -> ⊥ noteq () 我得到一个错误: Failed to solve the following constraints: Is empty: ℕ ≡ Boo
open import Data.Nat
open import Data.Bool
open import Data.Empty
open import Relation.Binary.PropositionalEquality
noteq : ℕ ≡ Bool -> ⊥
noteq ()
我得到一个错误:
Failed to solve the following constraints:
Is empty: ℕ ≡ Bool
我知道不可能在类型本身上进行模式匹配,但令我惊讶的是,编译器看不到Nat和Bool具有不同的(类型)构造函数
有没有办法在Agda中证明这一点?或者Agda中不支持涉及类型的不等式?证明Agda中两个集合不同的唯一方法是利用它们的 基数方面的差异。如果他们有相同的红衣主教,那么你 无法证明任何事情:这将与cubical不兼容 以下是
Nat
和Bool
不相等的证明:
open import Data.Nat.Base
open import Data.Bool.Base
open import Data.Sum.Base
open import Data.Empty
open import Relation.Binary.PropositionalEquality
-- Bool only has two elements
bool : (a b c : Bool) → a ≡ b ⊎ b ≡ c ⊎ c ≡ a
bool false false c = inj₁ refl
bool false b false = inj₂ (inj₂ refl)
bool a false false = inj₂ (inj₁ refl)
bool true true c = inj₁ refl
bool true b true = inj₂ (inj₂ refl)
bool a true true = inj₂ (inj₁ refl)
module _ (eq : ℕ ≡ Bool) where
-- if Nat and Bool are the same then Nat also only has two elements
nat : (a b c : ℕ) → a ≡ b ⊎ b ≡ c ⊎ c ≡ a
nat rewrite eq = bool
-- and that's obviously nonsense...
noteq : ⊥
noteq with nat 0 1 2
... | inj₁ ()
... | inj₂ (inj₁ ())
... | inj₂ (inj₂ ())