haskell - 模式匹配 - Prolog vs. Haskell

标签 haskell prolog pattern-matching

这不是家庭作业问题,而是考试学习指导问题。 Prolog Vs Haskell中的模式匹配有什么区别?

我已经进行了一些研究并阅读了它们背后的理论并没有真正让我对两者之间有一个扎实的理解。我在Prolog中读到,模式匹配是不同的,因为它具有统一变量的能力,因此能够通过分辨率进行推断并吐出可能的答案

eg ?- [a,b] = [a,X]
   X = b

现在我不确定如何在 Haskell 中显示模式匹配。我知道上面在 Prolog 中显示的相同查询在 Haskell 中不起作用,因为 Haskell 不能像 Prolog 那样统一。我记得在某个地方,要在 Haskell 中得到相同的答案,你必须通过 guard 明确地告诉它。

我知道我非常接近理解它,但我需要有人帮我分解 Barney 风格,这样我才能完全理解它并向 12 岁的 child 解释它。这一直困扰着我很长一段时间,我似乎无法找到一个可靠的解释。

顺便说一句,上面显示的示例只是向你们展示我到目前为止所学到的东西,并且我实际上正在尝试找到答案。我的主要问题与上面的示例无关,而是对两者之间的区别的完整理解。

最佳答案

Prolog 模式匹配基于统一,特别是 Martelli-Montanari Algorithm (减去发生检查,默认情况下)。该算法匹配相同位置的值,将一侧的变量绑定(bind)到另一侧相应位置的值。这种模式匹配可以双向工作,因此在 Prolog 中,您可以使用参数作为输入和输出。一个简单的例子,length/2谓词。我们可以使用它来(评论解释查询):

?- length([],0).      % is the length of empty list zero?
?- length([a,b,c],X). % what's the length of list consisting of a,b and c?
?- length(L,5).       % give me all lists that have length of 5

Haskell pattern matching是一种单向匹配,将变量绑定(bind)到给定值的不同部分。一旦绑定(bind),它就会执行相应的操作(右侧)。例如,在函数调用中,模式匹配可以决定调用哪个函数。例如。:
sum []     = 0
sum (x:xs) = x + sum xs

第一个 sum 绑定(bind)空列表,而第二个绑定(bind)至少 1 个元素的列表。基于此,给定 sum <a list> ,结果可能是 0x + sum xs取决于是否 sum <a list>匹配 sum []sum (x:xs) .

关于haskell - 模式匹配 - Prolog vs. Haskell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9780779/

相关文章:

haskell - 使 Haskell 代码更加地道(440 Hz 音调)

Prolog - 如何将所有 prolog 答案写入 .txt 文件?

function - scala 模式匹配函数 - 如何绕过类型删除

F# multiple when 守卫在模式匹配中使用分组模式

haskell - 商店comonad 是什么?

haskell - 从元组的元组中提取元组 Haskell

prolog - Prolog扩展处理时间运算符的实现

java - 如何在 Java 中检测另一个图像中的图像?

haskell - 我可以为 IO Monad 取 "snapshots"吗?

mysql - 从mysql获取数据并在prolog中进行谓词