繁体   English   中英

Prolog-如何保存递归调用的结果?

[英]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中只能有一个值。 例如,在您的代码中, Loutappend/3的输出,是getValueReturn/4的递归调用的输入,也是顶级的输出。 这可能不会做您想要的。

我找到了执行尝试的最佳方法是找到结果后使用asserta / z,然后稍后收集这些结果。

否则,代码将变得过于复杂,并且无法按预期运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM