Idris - 定义素数类型

时间:2017-09-09 16:54:18

标签: primes idris

我正在学习Idris,作为一项个人练习,我想实现Primes类型,包括所有素数。

在idris中是否有一种方法可以从类型和属性开始定义一个新类型,它将选择属性所适用的起始类型的所有元素?在我的情况下,有没有办法将Primes定义为Nat的{​​{1}}集合?{/ p>

如果这是不可能的,我应该使用某种筛子来定义构造它们的素数吗?

1 个答案:

答案 0 :(得分:5)

我喜欢copumpkin's Agda definition of Prime,在Idris中看起来像这样:

data Divides : Nat -> Nat -> Type where
  MkDivides : (q : Nat) ->
              n = q * S m ->
              Divides (S m) n

data Prime : Nat -> Type where
  MkPrime : GT p 1 ->
            ((d : Nat) -> Divides d p -> Either (d = 1) (d = p))
            -> Prime p

读为“如果p可以被d整除,那么d必须是1或p” - 这是普通性的通用定义。

手动证明这个数字可能非常繁琐:

p2' : (d : Nat) -> Divides d 2 -> Either (d = 1) (d = 2)
p2' Z (MkDivides _ _) impossible
p2' (S Z) (MkDivides Z Refl) impossible
p2' (S Z) (MkDivides (S Z) Refl) impossible
p2' (S Z) (MkDivides (S (S Z)) Refl) = Left Refl
p2' (S Z) (MkDivides (S (S (S _))) Refl) impossible
p2' (S (S Z)) (MkDivides Z Refl) impossible
p2' (S (S Z)) (MkDivides (S Z) Refl) = Right Refl
p2' (S (S Z)) (MkDivides (S (S _)) Refl) impossible
p2' (S (S (S _))) (MkDivides Z Refl) impossible
p2' (S (S (S _))) (MkDivides (S _) Refl) impossible

p2 : Prime 2
p2 = MkPrime (LTESucc (LTESucc LTEZero)) p2'

为此编写决策程序也非常复杂。那将是一个很大的练习!您可能会发现其余的定义对此有用:

https://gist.github.com/copumpkin/1286093