2017-12-06 3 views
0

私はまだPrologのロジックを理解しようとしており、問題を抱えています。 再帰呼び出し内で見つかった値を保存したり、収集したりしようとしています。このように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から結果を収集し、それらを組み合わせて、バックメインにそれらを送信したいと思います。 getValueReturn内のリストを作成して追加するにはどうすればよいですか? 同様に、すべての再帰呼び出しのためにメインにリストを保存するにはどうすればよいですか?

EDIT:

は私がトレースを介してこれを実行すると、空のリストが発見された場合ただし、リストには、すべての要素を削除し、コメント返信ごとに上記のコードを編集しました。

私は間違っていますか?再帰を使ってリストを構築するという概念を使用しようとするのは初めてです。

+0

一部のリストにリストを追加することも、結果リストを変数の先頭にすることもできます。 –

+0

結果のリストを変数の先頭にすることはどういう意味ですか?私のLをLに解体し、残りの部分でgetValueReturnを呼び出しますか?しかし、それでは、私のfindallの結果はどうやってそれに保存されますか? – Pain

+0

すでにfindallの結果をパラメータとして与えています。 –

答えて

0

私は、結果が見つかったときにasserta/zを使用し、その後これらの結果を収集することを試みていたことを行う最も良い方法を見つけました。

そうしないと、コードが過度に複雑になり、意図したとおりに機能しませんでした。

0

実行可能な完全なコードをサンプルデータとともに投稿してください。私はこれをテストしていない。

トップレベルにも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で1つの値しか持つことができません。例えば、コードではLoutappend/3の出力、再帰呼び出しの入力はgetValueReturn/4、最上位の出力です。これはおそらくあなたが望むことをするつもりはありません。

関連する問題