Prolog - 生成适合给定范围的数字

Grz*_*cki 8 prolog gnu-prolog

我想使用如下谓词:

range(X,0,5)
range(X,4,200)
range(X,-1000000,1000000)
dom_range(X,-1000000,1000000)
Run Code Online (Sandbox Code Playgroud)

含义:

range(X,0,5) :- member(X,[0,1,2,3,4,5]).
range(X,4,200) :- member(X,[4,5,6...198,199,200]).
range(X,-1000000,1000000) :- member(X,[-1000000,...,1000000]).
dom_range(X,-1000000,1000000) :- domain(X, [-1000000,...,1000000]).
Run Code Online (Sandbox Code Playgroud)

如何在Prolog中很好地编码(考虑解决方案性能 - 递归的深度等)?

预计解决方案将在GNU-Prolog上运行.

PS问题受到这个问题的启发.

Dav*_*ein 12

SWI-Prolog的谓词在/ 3之间.所以你可以在(0,5,X)之间调用它来获得上面显示的结果.这个谓词看起来像是在C中实现的.

如果我们必须用纯prolog编写它(速度和空间不是一个因素),你可以试试这个.

range(Low, Low, High).
range(Out,Low,High) :- NewLow is Low+1, range(Out, NewLow, High).
Run Code Online (Sandbox Code Playgroud)

  • fd_domain似乎是有限域库的一部分,并不完全像swi之间或我的范围谓词那样通用.如果fd库类似于clpfd(约束线性处理有限域),则fd_domain只是在变量(或列表)上设置约束.在运行某种[标记](http://www.swi-prolog.org/pldoc/doc_for?object=clpfd:labeling/2)谓词之前,实际值不会绑定到变量,此时所有约束都是考虑并且值受约束. (2认同)

小智 10

戴夫的答案几乎是完美的:没有检查是否低<高.我添加了一个条件,现在它工作正常(否则它会生成从低到无穷大的数字):

range(Low, Low, High).
range(Out,Low,High) :- NewLow is Low+1, NewLow =< High, range(Out, NewLow, High).
Run Code Online (Sandbox Code Playgroud)

希望有所帮助!