2010-11-23 74 views
0

我試圖確定在列表的關係裏面列出...Prolog的統一列表

?- matrix_items([[a,b],[c,d],[e,f]],Rs). 
Rs = [a,b,c,d,e,f].      % expected result 

到目前爲止,我能夠做這樣的事;不幸的是,它並沒有把所有元素加起來:

sift([],_).            
sift([H|T],[H|Result]) :- 
    create(H,Result), 
    sift(H,Result). 

create([],_). 
create([H|T],[H|R]) :- 
    create(T,R). 

希望很快聽到你的消息。

+0

sift是什麼? – Cameron 2010-11-23 16:42:54

+0

內置的「flatten/2」可能具有您似乎需要的行爲 - 它可能已在您使用的PROLOG解釋器中實現。 – sharky 2010-11-23 20:45:18

回答

2

嘗試類似這樣的事情。我已經改變了謂詞的名稱flatten_l作爲統一在序言其他的內涵:

flatten_l([H|T], FL):- 
    flatten_l([H|T], [], FL). 

flatten_l([], FL, FL):- !. 
flatten_l([H|T], ML, FL):- 
    flatten_l(T, ML, NL), 
    !, 
    flatten_l(H, NL, FL). 
flatten_l(X, FL, [X|FL]). 

還要注意的是,如果第一個參數未初始化這個謂詞會給你一個堆棧溢出錯誤...

1

如果您想摺疊所有列表(甚至是子列表),則可以使用flatten/2

如果你只想摺疊單個級別,那麼下面應該工作:

unify([], []). 
unify([X|Xs], Ret) :- unify(Xs, Rs), append(X, Rs, Ret). 
0

如果使用SWI-PL,你可以叫flatten/2扁平化的嵌套或append/2各級壓扁只有一個水平。