声明和缩回以模拟全局变量

| 我这样做是为了模拟全局变量:
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 \”)。使用时间/ 1来查看是否更有效。还要对队列表示进行评论:如果将初始队列表示为一对变量Q-Q,则可以在常量时间内附加以下元素:
insert_q0_q(E, Q-[E|Rest], Q-Rest).
也就是说,您通过进一步实例化尾部(即该对中的第二个元素),将元素E附加到队列中,而新尾部又是一个自由变量。我保留从前面(也在固定时间内)移除元素作为练习;提示:当该对中的第一个元素是变量时,此表示形式中的队列为空。通常,全局变量会使调试变得相当复杂,因为这样便无法孤立地测试谓词。作为将队列作为参数传递的替代方法(您已经提到过),请考虑使用DCG表示法将其隐式地通过。这通常使代码更具可读性,尤其是在仅一小部分谓词需要访问“全局”参数的情况下。     

要回复问题请先登录注册