从Prolog中检索给定间隔中的所有数字

时间:2011-10-09 21:01:42

标签: prolog clpfd

我是Prolog世界的新手,我想编写一条返回特定范围内所有元素的规则。

我打算做一些像

这样的事情

例如:

foo(X, Low, High) :- X > Low, X < High.

当我输入foo(X,2,5)时,它应该返回3,然后返回4.

似乎我的做法是错误的,我想知道哪种方法是正确的。

4 个答案:

答案 0 :(得分:6)

当这样写的时候,Prolog不知道你想要什么样的数字(以及你是否想要数字)。

实现这一目标的一种方法是:

range(X, L, H) :- X is L + 1, X < H.
range(X, L, H) :- L1 is L + 1, L1 < H, range(X, L1, H).

答案 1 :(得分:5)

答案很简单:between/3

?- between(3,4,X).
X = 3 ;
X = 4.

通过这种方式实现确切的行为是微不足道的。

你的方法不起作用的原因是</2的定义:两个参数都应该被实例化。所以,如果你想在不使用between/3的情况下实现它,你应该做一些类似svick的建议。

答案 2 :(得分:2)

使用SWI-Prologlibrary(clpfd),您可以写

:- use_module(library(clpfd)).

foo(X,Low,High) :-
    X #> Low,
    X #< High,
    label([X]).

答案 3 :(得分:1)

您也可以这样做(几乎是/ 3之间的重新实现:

range( X , Y , Z ) :-
  integer(X) ,
  integer(Y) ,
  range1(X,Y,Z)
  .

range1( X , X , X ) .              % X equals Y
range1( X , Y , X ) :- X < Y .
range1( X , Y , Z ) :- X < Y , X1 is X+1 , range( X1 , Y , Z ) .
range1( X , Y , X ) :- X > Y .
range1( X , Y , Z ) :- X > Y , X1 is X-1 , range( X1 , Y , Z ) .