2012-04-12 68 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