1

我有一个生成列表的程序,并在不同阶段从中删除某些元素。有 4 个删除阶段,调用第 4 个将首先调用 1,2,3 然后 4。谓词称为 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).
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 回答