我这样做是为了模拟全局变量:
update_queue(NewItem) :-
global_queue(Q),
retractall(global_queue(Q)),
append(Q, [NewItem], NewQ),
assert(global_queue(NewQ)).
还有别的办法吗?(也就是说,除了将变量作为参数传递之外)。不一定更有效率,我只是好奇。
在SWI-Prolog中,还有nb_setval/2和b_setval/2(以及对应的"_getval/2")。使用time/1看看是否更有效。还有一个关于队列表示的注释:如果将初始队列表示为一对变量Q-Q,则可以在常量时间内添加一个元素:
insert_q0_q(E, Q-[E|Rest], Q-Rest).
也就是说,您通过进一步实例化尾部(即对中的第二个元素)将元素E附加到队列中,并且新的尾部仍然是一个自由变量。我把从前面删除一个元素(也是在常数时间内)作为一种练习;提示:当pair的第一个元素是变量时,此表示中的队列为空。一般来说,全局变量会使调试变得相当复杂,因为无法单独测试谓词。作为将队列作为参数传递的替代方法(前面已经提到过),可以考虑使用DCG表示法隐式地将其线程化。这通常使代码更具可读性,特别是当只有一小部分谓词需要访问"全局"参数时。