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我已经更新了答案。现在我想知道你们还能发现什么其他的缺陷。这是一门射杀麻雀的大炮!谢谢你的帮助!