2011-04-22 59 views
1

我這樣做是爲了模擬全局變量:斷言和收回來模擬全局變量

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

有另一種方式? (除了傳遞變量作爲參數,就是)。不一定更高效,我只是好奇。

回答

5

在SWI-Prolog中,還有nb_setval/2和b_setval/2(和相應的「_getval/2」)。使用時間/ 1來查看這是否更有效。還對隊列表示註釋:如果表示所述初始隊列爲一對變量QQ的,可以追加的元件在恆定時間:

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

即,可以通過一個元件E附加到隊列進一步實例化尾部(即該對的第二個元素),並且新尾部也是一個自由變量。作爲一項練習,我會從前面(也是在不斷的時間內)移除一個元素;提示:當這個對的第一個元素是一個變量時,這個表示中的隊列是空的。通常,全局變量會使調試變得相當複雜,因爲您無法單獨測試謂詞。作爲將隊列作爲參數傳遞的替代方法(您已經提到過),可以考慮使用DCG符號來隱式地對其進行線程化。這通常會使代碼更具可讀性,特別是如果只有一小部分謂詞需要訪問「全局」參數。

+0

至於nb_setval/2:這個構造非常不明確。也就是說,你必須知道SWI的非常精確的當前細節,才能可靠地使用它。然而,在下一個版本中,事情可能會改變—,並且它們在過去幾次確實發生了變化。 – false 2012-10-06 10:28:11