List Prolog-更新动态列表
我想为广度搜索更新两个动态列表。尽管它们在后台进行更新,但在initiate谓词中实例化的值不会更新List Prolog-更新动态列表,list,search,dynamic,prolog,List,Search,Dynamic,Prolog,我想为广度搜索更新两个动态列表。尽管它们在后台进行更新,但在initiate谓词中实例化的值不会更新 initialise(Start) :- retractall(openlist(_)), retractall(closedlist(_)), assert(openlist([(Start,Start)])), assert(closedlist([])). 此处,打开列表和关闭列表分别启动为[(开始,开始)]和[] 然后,我迭代搜索,但打开和关闭变量不会更
initialise(Start) :-
retractall(openlist(_)),
retractall(closedlist(_)),
assert(openlist([(Start,Start)])),
assert(closedlist([])).
此处,打开列表和关闭列表分别启动为[(开始,开始)]和[]
然后,我迭代搜索,但打开和关闭变量不会更新,尽管openlist和closedlist会更新(如果我运行listing(openlist)或listing(closedlist),它们会更新,但在第一次迭代中只更新一次。之后,它们会锁定到这些变量中)
你知道为什么会这样吗
谢谢 在Prolog中,不能使用assert/retract(ab)。使您的过程递归,并“更新”您的变量,作为递归调用的附带效果。这是什么意思?因为这是一个广度搜索,我正在为开放列表分配一个起始节点。我有第三个谓词将触发此迭代,从而更新两个列表。将搜索到的节点传递到关闭的列表中,并将新发现的节点添加到打开的列表中。像您现在这样使用assert和retract很容易出错,而且速度很慢。它与Prolog通常的编写方式也有很大的不同,以至于人们很难理解您的代码在做什么(而且您似乎也遇到了问题)。什么是“动态列表”?你有使用这个术语的链接吗?如果我看到解释的话,也许会更有意义。那些不是列表,那些是谓词。不管是哪种方式,谷歌对“prolog广度优先搜索”的先兆搜索返回了一些相当不错的实现。这看起来可能是最彻底的:。《序言的技巧》中还有一整章是关于搜索的。
iterate :-
openlist(OPEN),
closedlist(CLOSE),
OPEN = [(X,Y)|T],
append(CLOSE,OPEN,R1),
retractall(openlist(_)),
retractall(closedlist(_)),
assert(closedlist(R1)),
back(X,M),
append(M,OPEN,Result),
diff(Result, R1, M3),
assert(openlist(M3)).