在 SWI-Prolog 中,我有一个列表,其元素是 Key-ValuesList 形式的对。例如,一个这样的列表可能如下所示:
[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 有很长的列表作为值时,此实现会导致“全局堆栈外”错误。
有没有更少的堆栈消耗方法来做到这一点?对于这种类型的数据结构,这似乎是一种非常常见的操作。