我正在Prolog中写一个目标搜索代理。我有两个名为search
的谓词。问题有Type == explore
而另一个Type == climb
。
请注意,使用的深度是常量= 10.程序为我的所有测试用例提供了正确的路径,但它们并不是最短的,所以from here我想到了使用length(Actions,_)
。
它适用于第一个search
谓词,但是当我尝试为后一个满足Type == climb
的搜索谓词添加类似内容时,它会进入无限循环/花费太长时间。
这就是我对此的看法:
search(Problem,Actions):-
Problem = [Goal-A-X,Y-Depth],
Goal = [Type,_,_],
Type == climb,
length(List,_),
depthfirst([A-X,Y],List,Depth),!,concat(List,[climb],Actions).
为什么会发生这种情况?
这是完整的代码:
search(Problem,Actions):-
Problem = [Goal-A-X,Y-Depth],
Goal = [Type,_,_],
Type == explore,
length(Actions,_),
depthfirst([A-X,Y],Actions,Depth),!.
search(Problem,Actions):-
Problem = [Goal-A-X,Y-Depth],
Goal = [Type,_,_],
Type == climb,
depthfirst([A-X,Y],List,Depth),concat(List,[climb],Actions).
depthfirst([A-X,Y],[],_):-
goal([_,Gx,Gy]),
Gx == X,
Gy == Y.
depthfirst([A-X,Y],[Action|Sol],Maxdepth):-
Maxdepth > 0,
s([A-X,Y],[A1-X1,Y1],Action),
Max1 is Maxdepth - 1,
depthfirst([A1-X1,Y1],Sol,Max1).
的修改:
好的,现在我知道它与指定的“深度”有关。我从MaxDepth
中移除了约束depthfirst
,现在它正在运行。然而,最初的第一个是在给定深度中找到解决方案,那么为什么它无法使用迭代深化来完成 - 按照我指定的方式完成?