Curry与它的表亲 Haskell 不同,它允许您为函数赋予多个值:
foo 1 2 = 3
foo 1 2 = 4
它会回溯(或其他一些搜索)来探索这种非确定性的含义。
这使得它类似于 Prolog(尤其是λProlog,由于类型系统和语法),您可以在其中声明
foo 1 2 3.
foo 1 2 4.
从语义上讲, N元 Curry 函数和N+1元 Prolog 关系之间有什么区别吗?
Curry 和 Prolog 之间的区别在于参数和结果之间的依赖关系,这是 Curry 中使用的 最佳评估策略的基础 。与 Haskell 类似,Curry 使用惰性(需要)评估策略。这导致以需求驱动的方式探索搜索空间。
例如,表达式
(xs ++ [1]) ++ ys =:= []
在 Curry 中有一个有限的搜索空间(没有任何答案),而等价的 Prolog 目标
?- append(Xs,[1],Zs), append(Zs,Ys,[]).
有无限的搜索空间。类似地,有一些例子,Curry 计算与 Prolog 相反的解决方案(例如,Curry 允许计算与 Haskell 类似的无限结构)。
因此,Curry 将 Haskell 的需求驱动评估策略扩展到了非确定性编程,而 Prolog 是基于严格评估的。
在考虑了更多之后,我意识到主要区别在于在 Prolog 中,两者
foo 1 2 3.
foo 1 2 4.
可以 同时 为 真,而在 Curry 中 两者
foo 1 2 == 3
foo 1 2 == 4
不能同时为真。(在 PAKCS 中,==
然后=:=
返回Bool
)