gpt4 book ai didi

primes - Idris - 定义素数类型

转载 作者:行者123 更新时间:2023-12-04 18:01:43 25 4
gpt4 key购买 nike

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

在 idris 中是否有一种方法可以从一个类型和一个属性开始定义一个新类型,它将选择该属性为真的起始类型的所有元素?就我而言,有没有办法定义 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

读作“如果 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

关于primes - Idris - 定义素数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46132987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com