我在网上找不到任何关于这个的信息... 我也是Prolog的新手...
在我看来,Prolog可能是高度并发的,也许在尝试匹配规则时会同时尝试多种可能性。 现代的Prolog编译器/解释器是否本质上是并发的?哪些是?默认情况下是否启用并发?我需要以某种方式启用它吗?
* 我对多线程不感兴趣,只对本质上的并发感兴趣。
我在网上找不到任何关于这个的信息... 我也是Prolog的新手...
在我看来,Prolog可能是高度并发的,也许在尝试匹配规则时会同时尝试多种可能性。 现代的Prolog编译器/解释器是否本质上是并发的?哪些是?默认情况下是否启用并发?我需要以某种方式启用它吗?
* 我对多线程不感兴趣,只对本质上的并发感兴趣。
p(X) :- q(X), r(X).
如果您想要并行运行q(X)
和r(X)
,那么如果q
部分统一了X
(例如将其绑定到f(Y)
),那会发生什么呢?r
必须知道这个绑定,所以要么您必须进行通信,要么您必须等待两个并列子句完成;如果其中一个失败,则可能会浪费时间,除非您再次让它们进行同步通信。这会增加开销,并且很难做到正确。现在看看OR:
p(X) :- q(X).
p(X) :- r(X).
这里有一个有限的选择(当然,Prolog允许无限多的选择),所以您想要同时运行它们两个。但是,如果其中一个成功了怎么办?计算的另一部分必须被暂停并保存其状态。您会同时保存多少个状态?和处理器一样多似乎是合理的,但是那么您必须小心,不要让计算创建不适合内存的状态。这意味着您必须猜测计算的状态有多大,而Prolog隐藏了这些实现细节,例如处理器和内存; 它不像C语言。
换句话说,自动并行化很难。第五代计算机项目通过设计具有承诺选择的语言解决了其中的一些问题,即没有回溯的Prolog方言。在这样做时,他们彻底改变了语言。值得注意的是,并发语言Erlang是Prolog的一个分支,它也通过交换回溯来获得更接近函数式编程的东西。它仍然需要用户指导,以知道程序中哪些部分可以安全地并行运行。
理论上看起来很有吸引力,但存在各种问题,使得这样的实现似乎不明智。
无论好坏,人们都习惯于将他们的程序视为从左到右和自上而下执行,即使在 Prolog 编程时也是如此。在标准的 Prolog 中,谓词子句的顺序以及子句内术语的顺序都具有语义意义。并行化它们会改变太多现有代码的行为以至于变得不流行。
非关系型的语言元素(例如 cut 操作符)只有在可以依赖这种执行顺序时才能有意义地使用,即在并行解释器中它们将变得无法使用,除非发明了非常复杂的依赖跟踪。
所有现有的并行化解决方案都会产生至少一些性能开销,用于线程间通信。
Prolog 通常用于高级、深度递归的问题,例如图遍历、定理证明等。在现代计算机上进行并行化可以(理想情况下)实现某个常数 n 的加速,但它不能将一个不可行的递归解决方法转变为一个可行的方法,因为那将需要指数级加速。相比之下,Fortran 和 C 程序员通常解决的数字问题通常具有高但相当有限的计算成本。进行并行化以将一个耗时 10 小时的工作转变为一个耗时 1 小时的工作是值得的。相比之下,把一份程序从平均能看到 6 步延长到看到 6.5 步就不那么吸引人了。
目前还没有线程库的ISO标准,尽管已经有提案,并且每个Prolog系统通常都有丰富的库,提供线程同步、线程通信、线程调试和外部代码线程。在Prolog系统中取得垃圾回收的一定进展是必要的,以允许具有潜在无限长运行线程的线程化应用程序。
一些现有的层甚至允许在独立于Prolog系统的高级并行化范式中进行。例如,Logtalk具有一些构造,可以映射到各种目标Prolog系统。
现在让我们转向挂起的目标。从旧的Prolog系统(自Prolog II,1982年以来)我们就知道freeze/2命令或阻塞指令。这些构造强制一个目标不被现有子句扩展,而是放在睡眠列表上。该目标稍后可以被唤醒。由于目标的执行不是立即的,而只有在它被唤醒时才会执行,因此挂起的目标有时被视为并发目标,但对于这种形式的并行性来说,更好的概念应该是协程。
挂起目标对于实现约束求解系统非常有用。在最简单的情况下,睡眠列表是某个变量属性。但是,约束处理规则是约束求解系统的一种较新方法。在约束处理规则中,唤醒条件可以是挂起目标对模式。通过挂起目标或约束处理规则提供的约束求解的可用性可以在此处查看:
此致
关于这个问题的一个好文章是
作者是Evan Tick,1994年3月。出现在“逻辑编程杂志,十周年特刊,1995年”。链接的Postscript文件是完整的,不像您在Elsevier得到的PDF文件。
作者说:
过去几年(即1990-94年),并发逻辑编程及其发展有两种主要观点。大多数逻辑编程文献将并发逻辑编程语言视为逻辑程序的派生或变体,即主要区别在于广泛使用“不关心”非确定性而不是“不知道”(回溯)非确定性。因此名称为committed choice或CC语言。第二个观点是,并发逻辑程序是并发反应程序,类似于其他“传统”的并发语言,例如具有显式消息传递的C语言,因为过程是通过数据流进行通信以逐步生成答案的进程。一个愤世嫉俗者可能会说,前一种观点具有更多的学术丰富性,而后一种观点具有更多的实际公共关系价值。通过快速的谷歌搜索,似乎并发逻辑编程范式只是一些研究语言的基础,并且不再被积极开发。我看到有人声称在Mozart/Oz系统中很容易实现并发逻辑。
ECLiPSe-CLP是一种“与Prolog基本兼容”的语言,支持OR并行性,尽管“由于其他优先事项,目前不积极维护此功能”。
[1,2]记录了ECLiPSe-CLP中的OR-(和AND-)并行性。
然而,我曾经尝试过使用ECLiPSe-CLP存储库中的代码来使其工作,但是我没有成功。