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

标签 functional-programming prolog logic-programming curry lambda-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 用于 curry 。与 Haskell 类似,Curry 使用惰性(需要) 评价策略。这导致搜索 以需求驱动的方式探索空间。

例如,表达式

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

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

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

有无限的搜索空间。同样,还有例子 其中 Curry 计算与 Prolog 不同的解 (例如,Curry 允许使用无限结构进行计算 与 Haskell 类似)。

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

关于functional-programming - Curry 中的 N 元函数和 Prolog 中的 N+1 元关系有什么区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65337793/

相关文章:

多线程......函数式语言? (序言)

programming-languages - 比 Prolog 更新的逻辑编程语言

scala - 在 2.8.x 中的 Scala 中管理灵活、类型化、不可变的数据结构

unit-testing - Elixir /ExUnit : how to test functions with system calls most elegantly?

.net - 寻找类似于 map 的 F# 库函数,它将传递给 f 当前的计算状态

recursion - Prolog 超出本地堆栈空间/无限递归

haskell - 如何找到最优的加工顺序?

functional-programming - 为什么 OCaml 的线程被认为是 `not enough` ?

prolog - 使用swi-prolog将prolog代码+C代码编译成二进制

list - 如何从两个已经排序的列表中创建一个排序列表