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

つまり、末尾 (ペアの 2 番目の要素) をさらにインスタンス化することによって要素 E をキューに追加すると、新しい末尾は再び自由変数になります。演習として、要素を前面から (これも一定の時間で) 削除したままにします。ヒント: ペアの最初の要素が変数の場合、この表現のキューは空です。一般に、グローバル変数は、述語を分離してテストできないため、デバッグをかなり複雑にします。キューを引数として渡す (既に述べた) 代わりに、DCG 表記を使用して暗黙的にスレッド化することを検討してください。これにより、多くの場合、コードが読みやすくなります。特に、述語の小さなサブセットのみが「グローバル」引数にアクセスする必要がある場合はそうです。

于 2011-04-22T19:56:41.257 に答える