在SWI-Prolog中,我有一個列表,其元素是Key-ValuesList形式的對。例如,一個這樣的列表可以看起來像:錯誤:在處理序言對列表時出現「Out of global stack」
[1-[a,b],2-[],3-[c]]
我想此列表轉換爲對形式密鑰 - [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具有非常長的列表作爲值時,此實現會導致「全局堆棧外」錯誤。
有沒有一個更少的堆棧消耗方法來做到這一點?對於這種類型的數據結構來說,這看起來很常見。
謝謝這真的讓事情變得清晰。但是,它仍然會爲大型輸入列表生成相同的堆棧溢出錯誤。五個鍵每個具有50個值列表導致堆棧溢出。 – Epicurus 2012-08-07 13:04:36
但根據您的具體需要,可能無法立即返回列表。你也可以看看,並完全跳過findall。 – m09 2012-08-07 13:20:57
btw 5個鍵每個都有50個值,是312M列表,它有很多列表。我猜,即使擴展堆棧也會導致其他問題。你需要參考我以前的評論我認爲 – m09 2012-08-07 13:30:10