Functional programming 我能证明具有不同构造函数的类型是不相交的吗?

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

如果我试图证明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: ℕ ≡ 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₂ ())