Prolog如何并发?
我无法在网上找到任何信息...我也是Prolog的新手...
在我看来,Prolog可能是高度并发的,可能在尝试匹配规则时一次尝试多种可能性。 现代的Prolog编译器/解释器是否固有地*并发? 哪个? 默认情况下并发吗? 我需要以某种方式启用它吗?
*我对多线程不感兴趣,只是固有的并发性。
理论上这看起来很有吸引力,但是存在各种问题,使得这种实现看起来不明智。
无论好坏,即使在Prolog编程时,人们也习惯将自己的程序视为从左到右和从上到下执行。 谓词和子句中的词语的顺序在标准Prolog中在语义上是有意义的。 并行化它们会改变太多的代码流行的行为。
非关系语言元素(如切割操作符)只有在您可以依赖这些执行顺序时才能被有意义地使用,即,除非发现非常复杂的依赖关系跟踪,否则它们将在并行解释器中变得不可用。
所有现有的并行化解决方案都会产生至少一些线程间通信的性能开销。
Prolog通常用于高层次的深度递归问题,如图遍历,定理证明等。在现代机器上的并行化(理想情况下)可以对某些常数n
实现n
的加速,但它不能将不可行的递归解决方法转化为一个可行的,因为那需要一个指数式的加速。 相比之下,Fortran和C程序员通常解决的数值问题通常具有很高但相当有限的计算成本; 将10小时工作转换为1小时工作非常值得并行工作。 相比之下,把一个可以看到大约6步的程序转变成可以(平均)看上去6.5步的程序并不那么吸引人。
现代的Prolog编译器/解释器是否固有地*并发? 哪个? 默认情况下并发吗?
并行逻辑程序设计是20世纪80年代日本第五代计算机程序的主要目标; 预计Prolog的变体将在大规模并行硬件上“容易”并行化。 这种努力很大程度上失败了,因为自动并发并不容易。 今天,Prolog编译器倾向于提供线程库,而程序必须控制手动并发量。
要了解为什么并行化Prolog与其他语言一样难,请考虑语言提供的两种主要控制结构:连接(AND,串行执行)和分离(OR,与回溯选择)。 假设你有一个AND构造如
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系统可以区分它们是否是多线程的。 在一个多线程的Prolog系统中,你可以产生多个在同一知识库上同时运行的线程。 这给咨询和动态谓词带来了一些问题,这些问题由这些Prolog系统解决。
您可以在这里找到多线程Prolog系统的列表:
操作系统和Web相关的功能
多线程是各种并行化范例的先决条件。 相应地,个别Prolog系统提供了服务某些范式的构造。 典型的范例是线程池,例如在Web服务器中使用,或者为长时间运行的GUI任务产生线程。
目前线程库没有ISO标准,尽管有一个提议,每个Prolog系统通常提供丰富的库,提供线程同步,线程通信,线程调试和外部代码线程。 在Prolog系统中垃圾收集的某些进展对于允许线程化应用程序有可能无限长的运行线程是必要的。
一些现有的层甚至允许Prolog系统独立的高级并行化范例。 例如,Logtalk具有映射到各种目标Prolog系统的构造。
现在让我们转向暂停的目标 。 从较早的Prolog系统(事实上,自1982年Prolog II开始),我们知道冻结/ 2命令或阻止指令。 这些结构迫使一个目标不被现有的子句扩展,而是放在一个睡眠清单上。 这个目标可以在以后被唤醒。 既然目标的执行不是直接的,而且只有当它被唤醒时,暂停的目标有时被看作是并发目标,但是这种并行化形式的更好的概念是协程。
暂停目标对实施约束解决系统很有用。 在最简单的情况下,睡眠列表是一些可变属性。 但是约束求解系统的新方法是约束处理规则。 在约束处理规则中,唤醒条件可以暂停目标对模式。 这里可以看到通过暂停目标或约束处理规则求解约束的可用性:
Prolog系统概述
最好的祝福
链接地址: http://www.djcxy.com/p/79401.html