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

时间:2011-08-24 12:17:42

标签: prolog gnu-prolog

我想使用谓词:

range(X,0,5)
range(X,4,200)
range(X,-1000000,1000000)
dom_range(X,-1000000,1000000)

有意义:

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]).

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

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

P.S。问题受this question启发。

3 个答案:

答案 0 :(得分: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).

答案 1 :(得分:10)

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

range(Low, Low, High).
range(Out,Low,High) :- NewLow is Low+1, NewLow =< High, range(Out, NewLow, High).

希望有所帮助!

答案 2 :(得分:1)

Gnu-Prolog中的

range可以用有限域解决

range(X,Low,High) :- fd_domain(X,Low,High).

我不知道是否dom_range(X,L,H) :- fd_domain(X,L,H)

P.S。使用有限域时,您可能希望使用fd_set_vector_max/1