Performance Prolog有多并发?
我在网上找不到这方面的任何信息。。。我对序言也很陌生 在我看来,Prolog可能是高度并发的,在尝试匹配规则时,可能会同时尝试多种可能性。现代Prolog编译器/解释器是否天生是并发的?哪一个?默认情况下是否启用并发?我是否需要以某种方式启用它Performance Prolog有多并发?,performance,concurrency,prolog,multicore,Performance,Concurrency,Prolog,Multicore,我在网上找不到这方面的任何信息。。。我对序言也很陌生 在我看来,Prolog可能是高度并发的,在尝试匹配规则时,可能会同时尝试多种可能性。现代Prolog编译器/解释器是否天生是并发的?哪一个?默认情况下是否启用并发?我是否需要以某种方式启用它 *我对多线程不感兴趣,只对固有的并发性感兴趣。从理论上讲,这似乎很有吸引力,但有各种各样的问题使得这种实现看起来不明智 不管是好是坏,人们习惯于认为他们的程序是从左到右和自上而下执行的,即使是在Prolog中编程。在标准Prolog中,谓词的子句顺序和
*我对多线程不感兴趣,只对固有的并发性感兴趣。从理论上讲,这似乎很有吸引力,但有各种各样的问题使得这种实现看起来不明智
- 不管是好是坏,人们习惯于认为他们的程序是从左到右和自上而下执行的,即使是在Prolog中编程。在标准Prolog中,谓词的子句顺序和子句中的术语顺序在语义上都是有意义的。将它们并行化将改变太多现有代码的行为,使其不再流行
- 非关系语言元素(如cut运算符)只有在您可以依赖此类执行命令时才能有意义地使用,也就是说,除非发明了非常复杂的依赖项跟踪,否则它们将在并行解释器中无法使用
- 所有现有的并行化解决方案都会导致线程间通信的性能开销
- Prolog通常用于高级、深度递归问题,如图遍历、定理证明等。现代机器上的并行化(理想情况下)可以(理想情况下)对某些常量
实现n
的加速,但它不能将不可行的递归解方法转化为可行的方法,因为这需要指数级的加速。相比之下,Fortran和C程序员通常解决的数值问题通常具有较高但相当有限的计算成本;将10小时的作业转换为1小时的作业非常值得并行化。相比之下,将一个可以向前看6步的程序转变成一个可以(平均)向前看6.5步的程序就没有那么引人注目了n
查看为什么并行化PROlog与其他语言一样困难,考虑语言提供的两个主要控制结构:连接(和串行执行)和析取(或者,选择回溯)。假设你有一个AND结构,比如
p(X) :- q(X), r(X).
您需要并行运行q(X)
和r(X)
。然后,如果q
部分地统一了X
,比如将其绑定到f(Y)
,会发生什么r
必须知道这个绑定,所以要么你必须传达它,要么你必须等待两个连接完成;如果其中一个失败,您可能会浪费时间,除非您再次让它们通信以进行同步。这会增加开销,很难正确处理。现在为或:
p(X) :- q(X).
p(X) :- r(X).
这里有有限数量的选择(当然,Prolog允许无限多的选择),所以您希望同时运行这两个选项。但是,如果一个人成功了呢?计算的另一个分支必须挂起并保存其状态。你打算一次储蓄多少州?处理器的数量看起来是合理的,但是你必须注意不要让计算产生不适合内存的状态。这意味着您必须猜测计算的状态有多大,Prolog对您隐藏了这一点,因为它抽象了处理器和内存等实现细节;不是C
换句话说,自动并行是很难的。第五代计算机项目通过设计承诺选择语言(即Prolog方言,无回溯)解决了一些问题。在这样做的过程中,他们彻底改变了语言。必须注意的是,并发语言Erlang是Prolog的一个分支,它也用回溯来换取更接近函数式编程的东西。它仍然需要用户指导才能知道程序的哪些部分可以安全地并发运行。Prolog中有两种并发概念。一个与多线程相关,另一个与挂起的目标相关。我不知道你想知道什么。因此,我将首先对多线程进行一点扩展: 目前广泛使用的Prolog系统可以区分是否是多线程的。在多线程Prolog系统中,您可以生成在同一知识库上并发运行的多个线程。这给查询谓词和动态谓词带来了一些问题,这些问题由这些Prolog系统解决 您可以在此处找到多线程Prolog系统的列表: 多线程是各种并行化范例的先决条件。相应地,个性化的Prolog系统提供了服务于特定范例的结构。典型的范例是线程池,例如在web服务器中使用,或者为长时间运行的GUI任务生成线程 目前还没有一个线程库的ISO标准,尽管有一个提议,并且每个Prolog系统都有提供