在 Haskell 中实现回溯

Implementation of backtracking in Haskell

全新 到 Haskell,我希望能得到一些帮助。

在 Prolog 中实现谓词,利用一些约束来减少解决方案 space,这样整个实现就不是天真/蛮力的,这是非常容易的。但是现在我必须处理 Haskell 我不知道该怎么做。

鉴于在某个时候 P1 我做出选择说 A1 并且在稍后的时间点 P2 我做了一个选择 A2 不符合我的约束我怎么能回到 P1 并在Haskell ?

我研究 Haskell 了 2 天,从我读到的内容来看,这可能是可行的,方法是在函数内部声明一个函数,或者使用我不太理解并让我感到困惑的 monad。

你能link我/给我看一些简单的东西吗选择它-让它处于约束之下使用回溯的谓词——最好没有单子——这样我就可以全神贯注了?

当然,这是一个简单的选择一个数字,然后如果发现数字不偶数,它会备份并选择另一个。

searchForEven :: [Int] -> [Int]
searchForEven ns = [n | n <- ns, even n]

这是一个符合您所描述情况的示例:

Given that at some point P1 I make a choice say A1 and at a later point in time P2 I make a choice say A2 that does not obey my constraint how can I go back to P1 and make a different choice?

p1 = [1..10]
p2 = [2,3,5,7]
constraint a b = a^2 + b^2 == 5^2

searchForPythagoreanTriple :: [Int]
searchForPythagoreanTriple =
    [ (a1, a2)
    | a1 <- p1
    , a2 <- p2
    , constraint a1 a2
    ]

我使用了我希望是相当有启发性的名称来突出示例如何与您描述的场景联系起来。

并且不要害怕 monad。看看在 monad 语法中 完全相同

searchForEven ns = do
    n <- ns
    guard (even n)
    pure n

searchForPythagoreanTriple = do
    a1 <- p1
    a2 <- p2
    guard (constraint a1 a2)
    pure (a1, a2)