我是 Prolog 世界的新手,我想编写一个规则来返回特定范围内的所有元素。
我打算做类似的事情
前任:
foo(X, Low, High) :- X > Low, X < High.
当我输入 foo(X, 2, 5) 时,它应该返回 3,然后是 4。
看来我的方法是错误的,我想知道哪种方法是正确的。
当这样写时,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).
简单的答案between/3
::
?- between(3,4,X).
X = 3 ;
X = 4.
以这种方式实现确切的行为有点微不足道。
您的方法不起作用的原因是</2
:两个参数都应该被实例化。所以,如果你想在不使用的情况下实现它,between/3
你应该做一些类似于 svick 的建议。
使用SWI-Prolog和library(clpfd)
,您可以编写
:- use_module(library(clpfd)).
foo(X,Low,High) :-
X #> Low,
X #< High,
label([X]).
您也可以这样做(几乎是 between/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 ) .