2

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 关系之间有什么区别吗?

4

2 回答 2

5

Curry 和 Prolog 之间的区别在于参数和结果之间的依赖关系,这是 Curry 中使用的 最佳评估策略的基础 。与 Haskell 类似,Curry 使用惰性(需要)评估策略。这导致以需求驱动的方式探索搜索空间。

例如,表达式

(xs ++ [1]) ++ ys =:= []

在 Curry 中有一个有限的搜索空间(没有任何答案),而等价的 Prolog 目标

?- append(Xs,[1],Zs), append(Zs,Ys,[]).

有无限的搜索空间。类似地,有一些例子,Curry 计算与 Prolog 相反的解决方案(例如,Curry 允许计算与 Haskell 类似的无限结构)。

因此,Curry 将 Haskell 的需求驱动评估策略扩展到了非确定性编程,而 Prolog 是基于严格评估的。

于 2020-12-17T12:58:16.167 回答
0

在考虑了更多之后,我意识到主要区别在于在 Prolog 中,两者

foo 1 2 3.
foo 1 2 4.

可以 同时 为 真,而在 Curry 中 两者

foo 1 2 == 3
foo 1 2 == 4

不能同时为真。(在 PAKCS 中,==然后=:=返回Bool

于 2020-12-30T05:33:00.103 回答