Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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
List Prolog-更新动态列表_List_Search_Dynamic_Prolog - Fatal编程技术网

List Prolog-更新动态列表

List Prolog-更新动态列表,list,search,dynamic,prolog,List,Search,Dynamic,Prolog,我想为广度搜索更新两个动态列表。尽管它们在后台进行更新,但在initiate谓词中实例化的值不会更新 initialise(Start) :- retractall(openlist(_)), retractall(closedlist(_)), assert(openlist([(Start,Start)])), assert(closedlist([])). 此处,打开列表和关闭列表分别启动为[(开始,开始)]和[] 然后,我迭代搜索,但打开和关闭变量不会更

我想为广度搜索更新两个动态列表。尽管它们在后台进行更新,但在initiate谓词中实例化的值不会更新

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