Idris - 定义素数类型
Idris - Define a primes type
我正在学习 Idris,作为个人练习,我想实现一个 Primes
类型,由所有素数组成。
在 idris 中有没有一种方法可以从一个类型和一个 属性 开始定义一个新类型,这将 select 属性 起始类型的所有元素成立吗?就我而言,有没有办法将 Primes
定义为 Nat
的集合,使得 n <= p and n|p => n=1 or n=p
?
如果这不可能,我是否应该定义素数,使用某种筛子归纳构造它们?
我喜欢 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
读作 "if p is divisible by d, then d must be 1 or 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'
为此编写一个决策程序也很复杂。那将是一个很大的练习!您可能会发现其余的定义对此很有用:
我正在学习 Idris,作为个人练习,我想实现一个 Primes
类型,由所有素数组成。
在 idris 中有没有一种方法可以从一个类型和一个 属性 开始定义一个新类型,这将 select 属性 起始类型的所有元素成立吗?就我而言,有没有办法将 Primes
定义为 Nat
的集合,使得 n <= p and n|p => n=1 or n=p
?
如果这不可能,我是否应该定义素数,使用某种筛子归纳构造它们?
我喜欢 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
读作 "if p is divisible by d, then d must be 1 or 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'
为此编写一个决策程序也很复杂。那将是一个很大的练习!您可能会发现其余的定义对此很有用: