1

リストを生成するプログラムがあり、さまざまな段階でリストから特定の要素を削除します。4 つの除去段階があり、4 番目を呼び出すと、最初に 1,2,3 が呼び出され、次に 4 が呼び出されます。述語は s4(Q, 100) と呼ばれ、同じ述語スタイル (Q,100) を持つ s1、s2、s3 もあります。 )。

ステージ s1 で、要素の数に応じて要素を削除します。そのため、Q を呼び出して別の述語に渡します。

removePrimes(Q,L).

これでリスト Q から望ましくない要素を引いたものになります。ただし、Q は変更されておらず、元の要素がすべて残っています。

私の質問は、Q に L の結果を与える方法があるので、その値を s2 に渡して再度変更できるようにする方法はありますか?

これが私のコードの残りの部分です。

s4(Q,X):-
    s3(Q,X).

s3(Q,X):-
    s2(Q,X).

s2(Q,X):-
    s1(Q,X).

    %Further alter the list here
    %Q is not passed back, since it is unchanged in s1

s1(Q,X):-
    s0(Q,X),
    %remove the undesired elements
    removePrimes(Q,L).

    %L now contains the list we need, but Q is unchanged!!!

s0(Q, N) :-
    %generate the list
    validPair(Q).
4

2 に答える 2

2
sTotal(L) :-
    validPair(Q),
    s1(Q, Q2),
    s2(Q2, Q3),
    s3(Q3, Q4),
    ...
    sN(QN, L).

トリックを行う必要があります。

編集、コードから:

s4(X, N):-
    s3(Q),
    dostuff(Q, X, N).

s3(L):-
    s2(Q),
    doblah(Q, L).

s2(L):-
    s1(Q),
    dosomethingwithalist(Q, L).

s1(L):-
    s0(Q),
    removePrimes(Q,L).
s0(Q) :-
    validPair(Q).

これは同等であり、冗長すぎるバージョンであることに注意してください。

s4(X, N) :-
    validPair(Q),
    removePrimes(Q, Q2),
    dosomethingwithalist(Q2, Q3),
    doblah(Q3, Q4),
    dostuff(Q4, X, N).
于 2012-04-12T12:31:15.857 に答える
1

いいえ、プロローグは単一の割り当てを使用します。元のリストの代わりに新しいリストを渡す必要があります。

まあ、いくつかの実装 (swi-prolog など) は、更新できる (またはアサート/リトラクトできる) グローバル変数をサポートしていますが、特にこの場合、それを使用することは実際にはお勧めしません。

于 2012-04-12T12:16:44.863 に答える