11

我想使用如下谓词:

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

PS 问题的灵感来自这个问题

4

3 回答 3

14

SWI-Prolog 的谓词between/3。因此您可以将其称为 between(0,5,X) 以获得上面显示的结果。这个谓词看起来像是在 C 中实现的。

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

range(Low, Low, High).
range(Out,Low,High) :- NewLow is Low+1, range(Out, NewLow, High).
于 2011-08-24T13:00:29.010 回答
12

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

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

希望有帮助!

于 2011-12-22T18:42:08.050 回答
1

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

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

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

PS 在玩有限域时,您可能想使用fd_set_vector_max/1

于 2011-08-27T09:49:45.917 回答