Curry 中的 N 元函数和 Prolog 中的 N+1 元关系有什么区别吗?

Is there any difference between an N-ary function in Curry and an N+1-ary relation in Prolog?

Curry,不像它的堂兄 Haskell,允许你给一个函数多个值:

foo 1 2 = 3
foo 1 2 = 4

它确实 backtracking(或其他一些搜索)来探索这种不确定性的含义。

这使得它类似于 Prolog(特别是 λProlog 由于类型系统和语法),您可以在其中声明

foo 1 2 3.
foo 1 2 4.

在语义上,N-ary Curry 函数和 N+1-ary Prolog 关系之间有什么区别吗?

Curry 和 Prolog 的区别在于依赖关系 论点和结果之间的关系 optimal evaluation strategy 用于咖喱。和Haskell类似,Curry使用了一个lazy(needed) 评价策略。这导致搜索 space 以需求驱动的方式探索。

例如,表达式

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

在 Curry 中进行了有限搜索 space(没有任何答案), 而等效的 Prolog 目标

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

有一个无限搜索space。同样,还有例子 Curry 计算与 Prolog 对比的解决方案 (例如,Curry 允许使用无限结构进行计算 类似于 Haskell).

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

在进一步思考之后,我意识到主要区别在于在 Prolog 中,两者

foo 1 2 3.
foo 1 2 4.

可以同时,而在库里

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

不能同时为真。 (在 PAKCS 中,===:= return Bool