2012-04-12 65 views
1

我有一個程序生成一個列表,並在不同的階段從它刪除某些元素。有4個刪除階段,調用第4個將首先調用1,2,3然後4.謂詞被稱爲s4(Q,100),也有s1,s2,s3具有相同的preicate風格,(Q,100 )。序言列表存儲

在階段S1,我刪除元素取決於他們有多少的因素有,所以我通過Q可另一個謂詞,通過調用

removePrimes(Q,L). 

這現在有列表Q減去不想要的元素。但是,Q不變,仍然具有所有原始元素。

我的問題是,有沒有給Q的結果的方式,所以它的價值可以傳遞到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 - >使4變成Q - >打印Q. – XavierNuquos 2012-04-12 12:45:04

+0

@XavierNuquos我編輯 – m09 2012-04-12 12:59:07

+0

當然啊!這很有道理,再次感謝莫吉! – XavierNuquos 2012-04-12 13:04:15

1

沒了,Prolog使用單一的分配;你應該通過新的列表,而不是原來的。

很好,一些實現(SWI-序言爲例)支持可更新的全局變量(或者你可以斷言/收回)用,但它不是真的建議使用它,尤其是在這種情況下

+0

嗯,必須有某種方式removePrimes的結果(L)可以傳回s2? 基本上,你調用s4(Q,100),然後它通過s3,s2,s1下降,使s1變化,使s2變化,使s3變化,使s4變化,然後輸出Q,這應該是縮短列表。我怎樣才能做到這一點? – XavierNuquos 2012-04-12 12:21:59