Prolog-通过一组动态选项进行回溯

Prolog-通过一组动态选项进行回溯,prolog,backtracking,Prolog,Backtracking,我试图在一个目标上触发回溯,但如果可能的话,以一种动态的方式。为了更好地举例说明我的问题,假设我们有以下序言代码: num(1). num(2). num(3). num(4). num(5). 然后我转到SWI Prolog并调用:num(X)。这会触发回溯,通过键入,查找所有解决方案 我想删除这些事实(num(1),num(2),等等),并用动态生成这些事实的东西替换这些代码。我有什么办法可以做到这一点吗?也许是这样的吧 num(X):- for X in 1..5 这会产生与上面代码相

我试图在一个目标上触发回溯,但如果可能的话,以一种动态的方式。为了更好地举例说明我的问题,假设我们有以下序言代码:

num(1).
num(2).
num(3).
num(4).
num(5).
然后我转到SWI Prolog并调用:
num(X)
。这会触发回溯,通过键入
,查找所有解决方案

我想删除这些事实(
num(1)
num(2)
,等等),并用动态生成这些事实的东西替换这些代码。我有什么办法可以做到这一点吗?也许是这样的吧

num(X):- for X in 1..5
这会产生与上面代码相同的解决方案吗

据我所知,
findall
谓词返回一个列表,这不是我想要的。我想回溯所有答案,并使用
查看它们

SWI Prolog具有(非ISO)谓词:

num(X) :- between(1, 5, X).
您可以实现谓词(用于其他序言和进一步调整),如下所示:

between2(A, A, A) :- !.  % green cut
between2(A, B, A) :- A < B.
between2(A, B, C) :-
    A < B,
    A1 is A + 1,
    between2(A1, B, C).
介于2(A,A,A):-!%绿色切口
在2(A,B,A)之间:-A

介于/3之间的
和介于2/3之间的
的签名都是
(+From,+To,.X)
。这意味着必须绑定
From
To
,并且
X
可以绑定也可以不绑定。还要注意的是
From
To
必须是整数,这样
From就有了,而且你已经非常接近了

:- use_module(library(clpfd)).

num(X) :-
   X in 1..5.

?- num(X).
   X in 1..5.

?- num(X), X #>3.
   X in 4..5.

?- num(X), labeling([], [X]).
   X = 1
;  X = 2
;  X = 3
;  X = 4
;  X = 5.

我认为它不是复制品。据我所知,
findall
返回一个列表。我想使用
回溯一组解决方案。希望我能解释清楚。在控制台上键入
member(X[1,2,3,4,5])。
。@TomasBy fablead,非常感谢!就这样@斯科特:这真的是重复的吗?
介于(1,To,I)
之间,仅在
To=1,I=1时成功。然而,
To=2,I=2,介于(1,To,I)
也成功了。所以这根本不是绿色切割。@false您在提供的链接中看到了
介于/3
之间的签名了吗<代码>从
必须绑定,因为它们在问题中。你也可以抱怨为什么
介于(1,2,X)
介于(5,1,X)
介于(1.5,3,X)
不能“按预期”工作。你的答案中没有签名!那又怎么样?这并不意味着签名是
(?,?,?)
@false我已经更新了答案。现在我想知道你们还能发现什么其他的缺陷。这是一门射杀麻雀的大炮!谢谢你的帮助!