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