3

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

update_queue(NewItem) :-
    global_queue(Q),
    retractall(global_queue(Q)),
    append(Q, [NewItem], NewQ),
    assert(global_queue(NewQ)).

还有其他方法吗?(除了将变量作为参数传递之外)。不一定更有效率,我只是好奇。

4

1 回答 1

6

在 SWI-Prolog 中,还有 nb_setval/2 和 b_setval/2(以及相应的“_getval/2”)。使用 time/1 来查看是否更有效。还有对队列表示的评论:如果将初始队列表示为一对变量 QQ,则可以在恒定时间内附加一个元素:

insert_q0_q(E, Q-[E|Rest], Q-Rest).

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

于 2011-04-22T19:56:41.257 回答