Prolog-值范围列表,不包括范围

Prolog-值范围列表,不包括范围,prolog,Prolog,我正在尝试创建一系列值的列表,如rngList(20,25,X)[21,22,23,24] 但它包含了最后一个值并给了我[21,22,23,24,25]。你知道我哪里做错了吗 rngList(X, X, []) . rngList(X, Y, [Z|Tail]) :- Z is X+1, rngList(Z, Y, Tail) . 在结果中包含Z=X+1。你需要写下这个(注意,我还检查了XY调用时“偏移”到无限循环中 此外,我们可以在第一个子句上添加一个cut,因为如果它成功,则无需尝试第二个

我正在尝试创建一系列值的列表,如rngList(20,25,X)[21,22,23,24] 但它包含了最后一个值并给了我[21,22,23,24,25]。你知道我哪里做错了吗

rngList(X, X, []) .
rngList(X, Y, [Z|Tail]) :- Z is X+1, rngList(Z, Y, Tail) .

在结果中包含Z=X+1。你需要写下这个(注意,我还检查了XY调用时“偏移”到无限循环中

此外,我们可以在第一个子句上添加一个cut,因为如果它成功,则无需尝试第二个:

rngList(X,X,[]):-!
rngList(X,Y,[X | Tail]):-X
此外,一个更“逻辑”的谓词可能希望“空解决方案”失败(如“是否存在任何解决方案”“否!”):

rngList(X,Y,[X]):-X+1=:=Y,!。
rngList(X,Y,[X | More]):-X+1
因此:

?-rngList(3,5,L)。
L=[3,4]。
?-rngList(3,4,L)。
L=[3]。
?-rngList(3,3,L)。
错。
?-rngList(3,2,L)。
错。
更新

要同时排除需要将上述谓词作为辅助谓词调用的第一个值,请执行以下操作:

rngList(X,Y,L):-
X
因此:

?-rngList(3,6,L)。
L=[4,5]。
?-rngList(3,5,L)。
L=[4]。
?-rngList(3,4,L)。
错。
?-rngList(3,3,L)。
错。
?-rngList(3,2,L)。
错。
扩展
rngList/3
,这样它也可以从结果列表中计算一个或两个边界,即成为一个更完整的谓词,如:

?-rngList(3,Y[4,5])。
Y=6。

这确实删除了最后一个值,但现在它包含了我也尝试删除的第一个值avoid@BunkyGiordano针对该案例进行了更新