断言和撤消以模拟全局变量

时间:2011-04-22 19:03:45

标签: 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)).

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

1 个答案:

答案 0 :(得分:5)

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

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

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