是否可以從Prolog列表中獲取列表中的所有元素?我們有getElements([[[a,b,[c]],d,e],f,g,[h,[i,j]]],S),結果如下: S = [a,b,c,d,e,f,g,h,i,j] ...從列表中獲取元素
感謝您的幫助。
是否可以從Prolog列表中獲取列表中的所有元素?我們有getElements([[[a,b,[c]],d,e],f,g,[h,[i,j]]],S),結果如下: S = [a,b,c,d,e,f,g,h,i,j] ...從列表中獲取元素
感謝您的幫助。
在SWI-Prolog的(或其它),你可以使用flatten/2
:
?- flatten([[[a,b,[c]],d,e],f,g,[h,[i,j]]], S).
S = [a, b, c, d, e, f, g, h, i|...].
注意the SWI-Prolog manual page for flatten/2
包括以下語句:
結束了需要壓平/ 3經常表示,像追加/ 3追加兩個列表,一個糟糕的設計。
但是,頁面沒有說明是否有另一個本地謂詞來替換它。
我相信會有更好的答案。
好的謝謝:)沒有知道它...雖然我希望有一點,我會找出訣竅 - 一些算法......但謝謝;)(和對不起,我的英語O :-)) – kolage 2012-03-19 20:29:12
你可以看到來源/它是如何在這裏實現的。http://www.swi-prolog.org/pldoc/doc/swi/library/lists.pl?show=src – magus 2012-03-19 22:18:30
@magus:這個謂詞已被棄用。請在您提到的源代碼中閱讀它的理由:結束需要拼合/ 3通常表示, 像追加/ 3用於追加兩個列表,一個不好的 設計。從生成的小列表生成列表 的高效代碼必須使用差異 列表,通常可以通過文法規則獲得最佳可讀性。 – false 2012-03-20 10:00:09
您詢問了列表的所有元素。也就是說,對於[[1,2,3],[4]]
,這將是列表[1,2,3,4]
。然而,對於[[[1],[3]]]
,這將是列表[[1],[3]
,因爲[1]
和[3]
是元素。出於這個原因,flatten/2
是不正確的,它會給你[1,3]
作爲答案。此外,對於1
它給[1]
...
下面是一個解決方案使用dcg:
seq([]) --> [].
seq([E|Es]) --> [E], seq(Es).
seqq([]) --> [].
seqq([Es|Ess]) --> seq(Es), seqq(Ess).
?- phrase(seqq([[[1],[3]]]), Xs).
Xs = [[1],[3]].
?- phrase(seqq(1), Xs).
false.
該解決方案現在作品也像下列情況:
?- phrase(seqq([S1,S2]), [1,2]).
S1 = [],
S2 = [1,2] ;
S1 = [1],
S2 = [2] ;
S1 = [1,2],
S2 = [] ;
false.
而flatten/2
完全錯誤:
?- flatten([S1,S2],[1,2]).
S1 = 1,
S2 = 2.
研究欄+「flatten」應該讓你開心。 – m09 2012-03-19 20:24:11