1

为了澄清我的意思,让我们举这个递归的例子:

statement([]). 
statement([A|B]):- A, statement(B).

头部A被我的规则检查,尾部B被送去递归,然后成为第2级的头部。当它递归并且在第二级时,我怎样才能访问之前的A?我想这一切都错了吗?如果需要任何澄清,请询问,我会这样做。提前致谢。

我想测试的(类型检查器):

String s; int i; i = s.length(); // OK

或者

String s; int i; s = i.length(); // fails
4

2 回答 2

2

您必须明确记录前面的语句,以便在每次迭代时您都可以访问前面的步骤。如何记录这些陈述取决于您。一种解决方案是:

statement(L) :- statement(L,[]).
statement([], _). 
statement([A|B], L):- check(A), statement(B,[A|L]).

L 记录前面的语句(以相反的顺序)。

于 2012-05-01T06:14:33.137 回答
0

当然..使用序言数据库,断言和撤回。这证明了这一点:

% Declare the lasthead fact as dynamic, so facts can change
:-dynamic lasthead/1.

% Set a starting value for the first iteration
lasthead(null).

statement([]).
statement([A|B]) :-

    % Show the previous head
    lasthead(LH),
    writeln(['Last head was', LH]),

    % Retract last head. ie. remove from the database
    retract(lasthead(_)),

    % Store the current head in the database
    assertz(lasthead(A)),

    % Recurse around
    statement(B).


?- statement([a,b,c,d,e]).
[Last head was,null]
[Last head was,a]
[Last head was,b]
[Last head was,c]
[Last head was,d]

上面的示例使用retract 来确保只有一次lasthead(X) 事实,但您可以删除retract,这将确保有多个lasthead(X) 事实,每个列表项一个。

然后,您可以使用例如访问/处理多个 lasthead(X) 事实。findall(X, lasthead(X), Y),它将为您提供您在此过程中断言的任何 lasthead(X) 值。

于 2012-05-01T09:55:45.623 回答