Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用迭代深化搜索陷入无限循环的Prolog_Prolog_Depth First Search_Iterative Deepening - Fatal编程技术网

使用迭代深化搜索陷入无限循环的Prolog

使用迭代深化搜索陷入无限循环的Prolog,prolog,depth-first-search,iterative-deepening,Prolog,Depth First Search,Iterative Deepening,我正在用Prolog编写一个目标搜索代理。我有两个名为search的谓词。一个问题是Type==explore,另一个问题是Type==gramb 注:使用的深度为常数=10。程序为我所有的测试用例提供了正确的路径,但是它们不是最短的,所以我想到了使用length(Actions,)它对于第一个搜索谓词非常有效,但是当我尝试为满足Type==gramb的后一个搜索谓词添加类似的内容时,它会进入无限循环/花费太长时间。 这就是我为此所做的: search(Problem,Actions):-

我正在用Prolog编写一个目标搜索代理。我有两个名为
search
的谓词。一个问题是
Type==explore
,另一个问题是
Type==gramb

注:使用的深度为常数=10。程序为我所有的测试用例提供了正确的路径,但是它们不是最短的,所以我想到了使用
length(Actions,)

它对于第一个
搜索
谓词非常有效,但是当我尝试为满足
Type==gramb
的后一个搜索谓词添加类似的内容时,它会进入无限循环/花费太长时间。 这就是我为此所做的:

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).

编辑

好的,现在我知道它与指定的“深度”有关。我从
depthfirst
中删除了约束
MaxDepth
,它现在正在工作。然而,最初的depthfirst是在给定深度内找到解决方案的,那么为什么它不能使用迭代深化-按照我指定的方式完成?

ypu能显示您为导致无限循环的查询键入的内容吗?@mbrach我称之为简单搜索(问题,操作)在指定一个相关的目标并将其作为问题之后。问题=[Goal-A-X,Y-Depth],其中Goal是=[,Goal X坐标,Goal Y坐标],A是代理的四个角度之一,X,Y是坐标,Depth是第一次搜索应该达到的最大深度。depthfirst中使用的s()谓词是后继函数(链接到代理的知识库,在别处断言)。@mbrach这里有一些额外的信息:我试图通过编写以下代码来打印列表的长度:
length(List,u),length(List,N),write(N),depthfirst([A-X,Y],List,Depth)
几乎可以不停地在屏幕上写下所有的数字。
长度(List,N)
长度(List,N)
只会生成长度为0,1,2。。。如果
列表
是变量,则无限大。因此,这种行为是意料之中的。但是,如果您的谓词正在运行,我希望该构造允许您尝试长度逐渐变长的列表,直到找到解决方案。似乎您仍然必须为查询中的
问题
键入特定的内容。如果在
搜索(问题,操作)
查询中
问题
操作
都未绑定,那么
类型==爬升
将始终失败,因为
类型
将被解除绑定,如果一个参数绑定而另一个参数未绑定,
=
将失败。因此,如果在你的问题陈述中,你展示了一个导致你需要帮助的问题的最简单的例子,这会有所帮助。