在 Jekejeke Prolog 中,我试图让程序员尽可能简单,并且确实提供了一个名为 balance/1 的简单构造。使用 balance/1 生成和测试问题:
/* sequential */
?- Generate, Test.
将分布在多个线程上。调用就像将连词包装到谓词 balance/1 中一样简单。结果可能会进行一些重新排序:
?- use_module(library(runtime/distributed)).
/* parallel */
?- balance((Generate, Test)).
这是一个并行生成素数的示例。顺序代码如下:
:- use_module(library(advanced/arith)).
prime(N) :-
M is floor(sqrt(N)),
between(2,M,K),
N mod K =:= 0, !, fail.
prime(_).
?- time(aggregate_all(count,
(between(1,1000000,X), prime(X)), N)).
% Up 6,737 ms, GC 33 ms, Thread Cpu 6,656 ms (Current 07/16/19 01:49:02)
N = 78499
并行执行相同的操作会给出:
?- time(aggregate_all(count,
balance((between(1,1000000,X), prime(X))), N)).
% Up 4,167 ms, GC 39 ms, Thread Cpu 219 ms (Current 07/16/19 01:49:50)
N = 78499
所以有一个加速,因为问题可以在多个线程上运行。