Prolog 断言和收回以模拟全局变量

Prolog 断言和收回以模拟全局变量,prolog,global-variables,swi-prolog,dcg,prolog-assert,Prolog,Global Variables,Swi Prolog,Dcg,Prolog Assert,我这样做是为了模拟全局变量: 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(以及相应的“_get

我这样做是为了模拟全局变量:

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

也就是说,通过进一步实例化tail(即,该对的第二个元素),将元素E附加到队列中,新tail再次是一个自由变量。我把从前面移除一个元素(也是在固定时间内)作为一种练习;提示:当对的第一个元素是变量时,此表示形式中的队列为空。通常,全局变量会使调试变得相当复杂,因为这样就无法单独测试谓词。作为将队列传递为参数(您已经提到)的替代方案,考虑使用DCG符号来隐式地通过它。这通常会使代码更具可读性,特别是当只有一小部分谓词需要访问“全局”参数时。

至于nb_setval/2:这个结构定义得非常糟糕。也就是说,为了可靠地使用SWI,您必须知道非常精确的SWI当前详细信息。但是,在下一个版本中,情况可能会发生变化—他们在过去几次确实发生了变化。