SWI-Prolog には、要素が Key-ValuesList 形式のペアであるリストがあります。たとえば、そのようなリストの 1 つが次のようになります。
[1-[a,b],2-[],3-[c]]
このリストを、Key-[Value] という形式のペアのネストされたリストに変換したいと思います。ここで、Value は ValuesList の要素です。上記の例は次のように変換されます。
[[1-[a],2-[],3-[c]], [1-[b],2-[],3-[c]]]
私の現在の解決策は次のとおりです。
% all_pairs_lists(+InputList, -OutputLists).
all_pairs_lists([], [[]]).
all_pairs_lists([Key-[]|Values], CP) :-
!,
findall([Key-[]|R], (all_pairs_lists(Values,RCP), member(R,RCP)), CP).
all_pairs_lists([Key-Value|Values], CP) :-
findall([Key-[V]|R], (all_pairs_lists(Values,RCP), member(V,Value), member(R,RCP)), CP).
この述語を使用すると、次の形式の呼び出し
all_pairs_lists([1-[a,b],2-[],3-[c]],OutputLists).
変数 OutputLists を上記の目的の結果にバインドします。正しいように見えますが、InputList に値として非常に長いリストがある場合、この実装は「グローバル スタックの不足」エラーを引き起こします。
これを行うためのスタック消費の少ないアプローチはありますか? このタイプのデータ構造では、非常に一般的な操作のように思えます。