簡體   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