我选择了 Jekejeke Prolog,用于连接新谓词 random_labeling/1
使用 CLP(FD) 从知识库中隐式获取随机数生成器
可以通过 sys_random Prolog 标志访问和修改。
Jekejeke Prolog 3, Runtime Library 1.3.4
(c) 1985-2019, XLOG Technologies GmbH, Switzerland
?- use_module(library(finite/clpfd)).
% 20 consults and 0 unloads in 944 ms.
Yes
?- use_module(library(basic/random)).
% 0 consults and 0 unloads in 0 ms.
Yes
?- random_new(111,R), set_prolog_flag(sys_random,R),
X in 0..5, Y #= X*X, random_label([X,Y]),
write(X-Y), nl, fail; true.
4-16
3-9
5-25
1-1
2-4
0-0
Yes
?- random_new(111,R), set_prolog_flag(sys_random,R),
X in 0..5, Y #= X*X, random_label([X,Y]),
write(X-Y), nl, fail; true.
4-16
3-9
5-25
1-1
2-4
0-0
我正在计划进一步的谓词 random_labeling/2。但它不需要种子,而是 Java java.util.Random 实例。这比种子更通用。但我想将 API 更改为 labeling/2 和一些选项将是最好的方法。
编辑 29.12.2018:我现在会做笔记,因为我想这是个好主意
采用indomain/2,目前我已经实现了random_indomain/1,
并从此实现 random_label/1。另见此处:
indomain/2 来自 ECLiPSe Prolog
random:以随机顺序尝试枚举。回溯时,
先前测试的值被删除。此方法使用 random/1 来
创建随机数,之前使用 seed/1 以使结果可重现。
http://eclipseclp.org/doc/bips/lib/gfd_search/indomain-2.html