2012-03-19 128 views
3

是否可以從Prolog列表中獲取列表中的所有元素?我們有getElements([[[a,b,[c]],d,e],f,g,[h,[i,j]]],S),結果如下: S = [a,b,c,d,e,f,g,h,i,j] ...從列表中獲取元素

感謝您的幫助。

+0

研究欄+「flatten」應該讓你開心。 – m09 2012-03-19 20:24:11

回答

2

在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追加兩個列表,一個糟糕的設計。

但是,頁面沒有說明是否有另一個本地謂詞來替換它。

我相信會有更好的答案。

+0

好的謝謝:)沒有知道它...雖然我希望有一點,我會找出訣竅 - 一些算法......但謝謝;)(和對不起,我的英語O :-)) – kolage 2012-03-19 20:29:12

+1

你可以看到來源/它是如何在這裏實現的。http://www.swi-prolog.org/pldoc/doc/swi/library/lists.pl?show=src – magus 2012-03-19 22:18:30

+3

@magus:這個謂詞已被棄用。請在您提到的源代碼中閱讀它的理由:結束需要拼合/ 3通常表示, 像追加/ 3用於追加兩個列表,一個不好的 設計。從生成的小列表生成列表 的高效代碼必須使用差異 列表,通常可以通過文法規則獲得最佳可讀性。 – false 2012-03-20 10:00:09

3

您詢問了列表的所有元素。也就是說,對於[[1,2,3],[4]],這將是列表[1,2,3,4]。然而,對於[[[1],[3]]],這將是列表[[1],[3],因爲[1][3]是元素。出於這個原因,flatten/2是不正確的,它會給你[1,3]作爲答案。此外,對於1它給[1] ...

下面是一個解決方案使用

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.