[英]Prolog - How can I save results from recursive calls?
我仍在尝试理解Prolog逻辑,并且偶然发现了一个问题。 我试图保存在递归调用中找到的值,以传递或收集。
因此:
main([]) :- !.
main([H|Tail]) :- findall(X,something(_,_,X),R),
getValueReturn(R,H,Lin, Lout),
main(Tail).
% X is the Head from main
getValueReturn([H|Tail],X,Lin, Lout) :- subset(X, H) ->
findall(A,something(A,_,H),L1),
append(Lin,L1,Lout),
getValueReturn(Tail,X,Lout,L)
;
getValueReturn(Tail,X,Lin,Lout).
我想从getValueReturn中的findall收集结果,将它们组合起来,然后将它们发送回main,然后可以使用它们。 如何在getValueReturn中创建并添加到列表? 同样,如何将列表保存在所有递归调用的主目录中?
编辑:
我根据评论答复编辑了上面的代码,但是当我通过跟踪运行此代码时,找到空列表后,列表将删除所有元素。
我究竟做错了什么? 这是我第一次尝试使用通过递归构建列表的概念。
您应该发布可运行的完整代码以及示例数据。 我还没有测试。
您还需要在顶级传递L
在相邻过程中为不同的参数使用相同的变量名不会提高可读性。
main([E|Es],L0,L) :-
findall(X,something(_,_,X),Rs),
getValueReturn(Rs,E,L0,L1),
main(Es,L1,L).
main([],L,L).
getValueReturn([R|Rs],E,L0,L) :-
( subset(E,R) ->
findall(A,something(A,_,R),New),
append(L0,New,L1),
getValueReturn(Rs,E,L1,L)
; getValueReturn(Rs,E,L0,L) ).
getValueReturn([],_,L,L).
变量在Prolog中只能有一个值。 例如,在您的代码中, Lout
是append/3
的输出,是getValueReturn/4
的递归调用的输入,也是顶级的输出。 这可能不会做您想要的。
我找到了执行尝试的最佳方法是找到结果后使用asserta / z,然后稍后收集这些结果。
否则,代码将变得过于复杂,并且无法按预期运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.