【问题标题】:Implementing Goldbach's conjecture in Haskell, lots of restrictions在 Haskell 中实现哥德巴赫猜想,有很多限制
【发布时间】:2019-05-14 07:36:07
【问题描述】:

这个作业的重点是理解列表推导。

使用几个预定义的函数并在以下限制下对某个自然数实现哥德巴赫猜想(否则行为无关紧要):

  • 无辅助功能
  • 不使用 wherelet
  • 左侧和右侧只有一个定义方程必须是列表推导式
  • 结果列表中对的顺序无关紧要
  • 允许使用 Prelude 中的函数
-- This part is the "library" 

dm :: Int -> [ Int ] -> [ Int ]
dm x xs = [ y | y <- xs , y `mod ` x /= 0]

da :: [ Int ] -> [ Int ]
da ( x : xs ) = x : da ( dm x xs )

primes :: [ Int ]
primes = da [2 ..]

-- Here is my code
goldbach :: Int -> [(Int,Int)]

-- This is my attempt 1
goldbach n = [(a, b) | n = a + b, a <- primes, b <- primes, a < n, b < n]

-- This is my attempt 2
goldbach n = [(a, b) | n = a + b, a <- takeWhile (<n) primes, b <- takeWhile (<n) primes]

预期结果:汇总为指定整数的所有对的列表。但是 GHC 抱怨说,在理解中,n 是未知的。我的直觉告诉我,我需要一些 Prelude 功能来实现我需要的功能,但是哪一个呢?


更新

parse error on input ‘=’
    Perhaps you need a 'let' in a 'do' block?
    e.g. 'let n = 5' instead of 'n = 5'

【问题讨论】:

  • 请发布您遇到的错误。你连x都不提,奇怪的是它会说它不知道
  • @FabianSchneider 要求 a + b 成为一个列表。 let n = a+b 那里可能符合意图。
  • @luqui true;我认为这实际上是他的意思:goldbach n = [(a, b) | a &lt;- takeWhile (&lt;n) primes, b &lt;- takeWhile (&lt;n) primes, n == a + b] 确保 n 实际上是元组中的 a + b ...
  • a &lt;- ... 定义之前,您不能使用ab 同上。将n == a+b移到最后。
  • goldbach n = (n, [(a, b) | a &lt;- da [2..n], b &lt;- da [2..n], a+b==n] ).

标签: list haskell list-comprehension primes goldbach-conjecture


【解决方案1】:

忽略您所说的奇怪错误,我认为您实际遇到的问题如下:

正如@chi 和我所提到的,在定义a 和b 之前,您不能在最终理解中使用a 和b。 所以你必须把它移到 and。

另外:在haskell 中使用(==) 而不是(=) 检查整​​数的相等性。 所以你也需要改变它。

这将是您最终方法的完整代码:

goldbach n = [(a, b) | a &lt;- takeWhile (&lt;n) primes, b &lt;- takeWhile (&lt;n) primes, n == a + b]

一个小测试产生:

*Main> goldbach 5
[(2,3),(3,2)]

更新

如果你想达到你在评论中写的内容,你可以在你的理解中添加另一个条件

n `mod` 2 == 0

甚至更好:用这样的守卫定义你的功能:

goldbach n
  | n `mod` 2 == 0 = [(a, b) | a <- takeWhile (<n) primes, b <- takeWhile (<n) primes, n == a + b]
  | otherwise = []

但是,如果我没记错的话,这与实际的哥德巴赫猜想无关。

【讨论】:

  • *Foo> 戈德巴赫 23 []
  • 根据维基百科,哥德巴赫猜想指出Every even integer greater than 2 can be expressed as the sum of two primes.,这意味着它仅适用于偶数;这意味着它不适用于 23
  • 仍然goldbach 25 产生[(2,23),(23,2)] 即使它应该是任何正奇数整数的[]。并感谢您指出条件顺序在理解中的重要性!
  • @mushishi:不,这是一种暗示,而不是等价。任何大于 2 的偶数都可以表示为两个素数之和,这与奇数无关。不可能发生,也可能发生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
相关资源
最近更新 更多