さて、あなたは何を達成しようとしているのかまだ分かりませんが、あなたが言ったビットとピースから取りました:
"アイデアは次のとおりです:座標リストから:L = [...]私はこの結果を探します:[0,0,0,5,5,3,3,3,2,4,4] これまでのところ、私は次のようなサブソリューションを得ました:[4,4]、2、[3 、3,3]、[5,5,5]、[0,0,0]である。 ...私はこのすべてのソリューションをマージしたい。」
そして、それはあなたが再帰的にので、すべての個別の結果は1つの結果のリストに終了しますサブリストのすべてを追加しようとしているようだ。
、この場合は、何がしたいことは実際には非常に単純flatten正しいと呼ばれている
は
入力データと出力例:。
?- flatten([[4,4],[2],[3,3,3],[5,5,5],[0,0,0]],Result).
Result = [4, 4, 2, 3, 3, 3, 5, 5, 5, 0, 0, 0]
注:あなたのデータはあなたが達成しようとしているものと逆の順序で表示されています。あなたのコードを帰納的に再帰的に修正することができない場合は、後でreverseでそれを行うことができます。
だから、すべてがまとめ:
?- reverse([[4,4],[2],[3,3,3],[5,5,5],[0,0,0]],R), flatten(R,RFlat).
R = [[0, 0, 0], [5, 5, 5], [3, 3, 3], [2], [4, 4]],
RFlat = [0, 0, 0, 5, 5, 5, 3, 3, 3, 2, 4, 4]
EDIT
いくつかの考え:
私はあなたがそれらを処理するために、リストの最後の2つの要素を取得している参照して、再帰的にしたいです同じリストに対してこれをやってください。最後の要素だけが削除されています。あなたはここで逆リストのアプローチのために行くこともできますが、行くための別の方法は、のようになります。最後に、ブロックのロジックを実行するために
% Base case (*)
foo([_],[]).
% Recursively calls block on last 2 elements of list and removes last elem
foo(List,[SubResult|R]) :-
last2_and_rest(List,X,Y,Rest),
block(X,Y,SubResult),
foo(Rest,R).
:あなたのような何かを書くことができ、この方法で
% Gets last two elements and returns the list with last one removed
last2_and_rest([X,Y],X,Y,[X]).
last2_and_rest([H|T],X,Y,[H|A]) :- last2_and_rest(T,X,Y,A).
2つの要素は、最後の要素が削除された状態で同じリストのままであり、残りのリストの要素の各ペアについて再帰的にそれを続けます。リストに要素がもう1つだけ残っていると、last2_and_restを呼び出すことができなくなります。これはfalseを返すので、それに応じてベースケース(*)を記述します。
私はまだあなたが実行しようとしているロジックを理解していないので、このコードでは/ before/after/..ブロック/ 2の呼び出しで何が起こるか考慮していませんが、その部分は機能しており、あなたは副作用の併合に問題があるだけだと述べました。
このコードが実行され、ロジックを正しく追加すると、[[0,0,0]、[5,5,5]、[3,3,3]、...のような結果が得られます。 。]あなたは私が上で説明したようにその後、平らにすることができます。
私はそれが私のものかどうかわかりませんが、私はあなたが何をしようとしているのか分かりません。おそらく、[(3,5)、(6,3)、(9,2)、(10,4)、(12,0)]から[0,0,0、 5,5,5,3,3,3,2,4,4]。 – SND
これは非常に不明です。私はここでも具体的な質問はしていない。あなたは声明を出しています*これまでのところ、[4,4]、[2]、[3,3,3]、[5,5,5]、[0,0,0] '*しかし、あなたがそれを得るためにどのようなクエリを実行したのか、あるいはそれがどのような質問に関連しているのかを全く示さない。 – lurker
私はその質問を示します。 %ブロック([(3,5)、(6,3)、(9,2)、(10,4)、(12,0)]、L2)。 %L2 = [4,4] – alvarellos