2012-04-12 6 views
1

私はリストを生成するプログラムを持っており、異なる段階でそこから特定の要素を取り除きます。 4つの除去段階があり、4番目を呼び出すと1,2,3,3が呼び出されます。述語はs4(Q、100)と呼ばれ、同じプレスタイル形式のs1、s2、s3もあります(Q、100 )。ステージ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). 

答えて

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

私の状況ではうまくいかないのか、s4(Q、N)(Nは整数)を呼び出してプログラムを実行しなければならないので、2つのリストを使って述語を呼び出すことはできません。だからs4(Q、100)→s3(Q、100)→s2(Q、100)→s1(Q、100)→generateList→s1をQに変更する→s2をQ - > s3をQに変更する - > makes4をQに変更する - > print Q – XavierNuquos

+0

@XavierNuquos私が編集しました – m09

+0

ああ、もちろん!それは完璧な意味、もう一度ありがとうMog! – XavierNuquos

1

いや何を意味するかを見ることができるように、プロローグは単一代入を使用して自分のコードの残りの部分です。元のリストの代わりに新しいリストを渡す必要があります。

だけでなく、いくつかの実装(SWI-プロローグなど)と(あるいはあなたが/リトラクト主張することができます)を更新することができ、グローバル変数をサポートしていますが、本当に、特にこのような場合には、それを使用することをお勧めしていない

+0

うーんは、removePrimesの結果いくつかの方法が存在しなければならない(L) s2に戻ることができますか? 基本的にはs4(Q、100)を呼び出した後、s3、s2、s1を経てs1が変更され、s2が変更され、s3が変更され、s4が変更され、Qが出力されます。これをどうすればいいのですか? – XavierNuquos