生成符合给定范围的数字



我想使用这样的谓词:

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上运行。

注:受这个问题启发的问题

SWI-Prolog的谓词在/3之间。因此,您可以调用它between(0,5,X)来获得上面显示的结果。这个谓词看起来是用C实现的。

如果我们必须用纯序言(并且速度& &;空间不是一个因素)来写它,您可以尝试下面的操作。

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

Dave的回答几乎是完美的:没有检查是否低<高。我添加了一个条件,现在它工作得很好(否则它会生成从低到无限的数字):>

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

希望有帮助!

Gnu-Prolog中的range可以用有限域求解

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

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

注:当使用有限域时,您可能喜欢使用fd_set_vector_max/1

相关内容

  • 没有找到相关文章

最新更新