为了澄清我的意思,让我们来看看这个递归的例子:
statement([]).
statement([A|B]):- A, statement(B).
头部,A按规则检查我的规则,并且尾部B被发送以递归,然后成为第2级的头部。当它递归并处于第二级时,我如何访问前一个一个?我觉得这一切都错了吗?如果需要澄清,请询问,我会这样做。提前谢谢。
我想要测试(类型检查器):
String s; int i; i = s.length(); // OK
或
String s; int i; s = i.length(); // fails
答案 0 :(得分:2)
您必须明确记录以前的语句,以便在每次迭代时都可以访问前面的步骤。由您如何记录这些陈述取决于您。一种解决方案是:
statement(L) :- statement(L,[]).
statement([], _).
statement([A|B], L):- check(A), statement(B,[A|L]).
L记录前面的语句(按相反顺序)。
答案 1 :(得分:0)
当然..使用prolog数据库,断言和收回。这证明了它:
% 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)事实,但是你可以删除回收,这将确保有多个lasthead(X)事实,每个列表项一个。
然后,您可以使用例如访问/处理多个lasthead(X)事实。 findall(X,lasthead(X),Y),它可以为你提供你在路上声明的最后一个(X)值。