[英]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.