Functional programming 咖喱中的N元函数和N+之间有什么区别吗;Prolog中的一元关系?

Functional programming 咖喱中的N元函数和N+之间有什么区别吗;Prolog中的一元关系?,functional-programming,prolog,logic-programming,curry,lambda-prolog,Functional Programming,Prolog,Logic Programming,Curry,Lambda Prolog,与它的表亲Haskell不同,它允许您为函数指定多个值: foo 1 2 = 3 foo 1 2 = 4 它确实(或其他一些研究)探索了这种非决定论的含义 这使得它类似于Prolog(特别是由于类型系统和语法),您可以在其中声明 foo 1 2 3. foo 1 2 4. 从语义上讲,N元Curry函数和N+1元Prolog关系之间有什么区别吗?Curry和Prolog之间的区别在于依赖关系 在参数和结果之间,这些参数和结果是 用于咖喱。与Haskell类似,Curry使用了lazy(nee

与它的表亲Haskell不同,它允许您为函数指定多个值:

foo 1 2 = 3
foo 1 2 = 4
它确实(或其他一些研究)探索了这种非决定论的含义

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

foo 1 2 3.
foo 1 2 4.

从语义上讲,N元Curry函数和N+1元Prolog关系之间有什么区别吗?

Curry和Prolog之间的区别在于依赖关系 在参数和结果之间,这些参数和结果是 用于咖喱。与Haskell类似,Curry使用了lazy(needed) 评价战略。这导致搜索 以需求驱动的方式探索空间

例如,表达式

(xs ++ [1]) ++ ys =:= []
在Curry中有有限的搜索空间(没有任何答案), 而等价的Prolog目标

?- append(Xs,[1],Zs), append(Zs,Ys,[]).
有无限的搜索空间。同样,也有一些例子 其中Curry以与Prolog相反的方式计算解决方案 (例如,Curry允许使用无限结构进行计算 类似于Haskell)

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

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

foo 1 2 3.
foo 1 2 4.
可以同时为真,而在咖喱中两者都为真

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

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

这很有趣。在语法上是Prolog的语言中可能使用了相同的(惰性)策略,或者它需要Curry的参数/输出二分法吗?顺便说一句,
?-append(Zs,Ys,[]),append(Xs,[1],Zs)。
立即终止。惰性策略是动态的,即执行顺序由所需的参数决定,而Prolog有一个更静态的策略。您可以在Prolog中模拟惰性计算(实际上,PAKCS将Curry编译成Prolog)。您的建议与动态重新安排有关,例如,通过协同工作,这会导致新的问题(例如,由于挣扎而导致的不完整性)。因此,您可以在Prolog中模拟惰性计算,但不能通过简单的静态子句重新排序。@MaxB
append(Zs,Ys,[]),append(Xs[1],Zs)。
显然终止,因为第一个文本只有一个可生成的解决方案,即
Zs=Ys=[]
,而第二个文本对于该解决方案失败:
Xs+[1]=[]
。另一种方法是,
append(Xs[1],Zs),append(Zs,Ys,[])。
是一个无限的故障驱动循环。如果Prolog可以提取列表长度上的CLP(FD)条件,即
XsLength#>=0,YsLength#>=0,ZsLength#>=0,XsLength+1#=ZsLength,ZsLength+YsLength#=0,label([XsLength,YsLength,ZsLength])。
,如果失败,那将是什么问题。可悲的是,只能在特定的情况下使用。@DavidTonhofer“可悲的是,只能在特定的情况下使用。”我相信,在某些情况下,Curry的搜索也会出现分歧,您可能希望它终止。