我如何在agda中实现正数

时间:2016-10-18 01:50:49

标签: agda

所以我试图定义一组正自然数{1,2,3,... 。 。} AGDA。

data Nat : Set where
 one : Nat
 succ : Nat -> Nat
{-#BUILTIN NATURAL Nat #-}

这就是我做到的,但它仍然需要0。

你如何让它从1开始?

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 nn0时不可满足的约束,n为正时则无法满足。所以在fail中,约束计算到,你得到一个未解决的这种类型的元,这是不可能解决的(假设类型系统是一致的),因为这种类型是无人居住的。