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

Prolog-生成适合给定范围的数字,prolog,gnu-prolog,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,...,10000

我想使用如下谓词:

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具有谓词。因此,您可以将其命名为介于(0,5,X)之间,以获得上面显示的结果。这个谓词看起来像是用C实现的

如果我们必须用纯prolog编写它(速度和空间不是一个因素),您可以尝试以下方法

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

Gnu Prolog中的
范围
可以用有限域来求解

range(X,Low,High) :- fd_domain(X,Low,High).
我不知道是否
dom\u范围(X,L,H):-fd\u域(X,L,H)


另外,在使用有限域时,您可能希望使用

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

范围(低、低、高)。
范围(Out,Low,High):-NewLow为低+1,NewLow=<高,范围(Out,NewLow,High)。

希望有帮助

它是否适用于
域()
?域到底是什么?我无法告诉您在上述场景中希望dom_range做什么。这只是将参数传递给范围的另一种方式吗?dom_range(Out,[Low,High]):-range(Out,Low,High)。fd_域似乎是有限域库的一部分,并不像swi的between或my range谓词那样通用。如果fd库类似于clpfd(constraint linear processing finite domain),那么fd_domain只是在变量(或列表)上设置约束。在运行某种谓词之前,实际值不会绑定到变量,此时会考虑所有约束并绑定一个值。感谢您的澄清。:)。所以这两种解决方案都有其优缺点,所以我很高兴知道两者:)。GNU也有介于/3之间的,这是。
range(Low, Low, High).
range(Out,Low,High) :- NewLow is Low+1, NewLow =< High, range(Out, NewLow, High).