所以我试图定义一组正自然数{1,2,3,... 。 。} AGDA。
data Nat : Set where
one : Nat
succ : Nat -> Nat
{-#BUILTIN NATURAL Nat #-}
这就是我做到的,但它仍然需要0。
你如何让它从1开始?
答案 0 :(得分:4)
Agda允许通过FROMNAT
内置函数
open import Agda.Builtin.Nat
open import Data.Empty
open import Data.Unit.Base
Positive : Nat -> Set
Positive zero = ⊥
Positive _ = ⊤
data Nat₁ : Set where
one : Nat₁
succ : Nat₁ -> Nat₁
toNat₁ : ∀ n {_ : Positive n} -> Nat₁
toNat₁ 0 {()}
toNat₁ 1 = one
toNat₁ (suc (suc n)) = succ (toNat₁ (suc n))
{-# BUILTIN FROMNAT toNat₁ #-}
fail : Nat₁
fail = 0
ok : Nat₁
ok = 1
此处Positive n
是n
为0
时不可满足的约束,n
为正时则无法满足。所以在fail
中,约束计算到⊥
,你得到一个未解决的这种类型的元,这是不可能解决的(假设类型系统是一致的),因为这种类型是无人居住的。