2014-10-07 57 views
0

我無法理解蓄電池和孔之間的差異。Prolog平放蓄電池vs孔

形式上:

Accumulators 
*Use 2 arguments to organize the building of some 
output structure 
*One is for result so far 
*One is for final result 

Holes 
*Use 2 arguments to organize the building of some 
output structure 
*One is for final result 
*One for a hole in the final result where further information can be put 

這是拼合使用空穴或蓄電池? 如何將其轉換爲使用另一個?

my_flatten(In,[],Out). 
my_flatten([],Acc,Acc). 
my_flatten([H|T],Acc,Out) :- 
    my_flatten(T,Acc,TOut), 
    my_flatten(H,TOut,Out). 
my_flatten(X,Acc,[X|Acc]) :- 
    X \= [], 
    X \= [_|_]. 

回答

1

累加器是用於遞歸計數或構建結構(如常規列表)的變量。空洞用於差異列表(或其他差異結構)中,其中列表表示爲一對詞語,即正面和背面。通常後面會是一個變量或一個洞。通常使用中綴記號,因此列表將如下: Front-Back

因此List = [a,b,c|Hole]-Hole例如。

使用差異列表可讓您通過重新排列變量來追加恆定時間。

在差符號L-L是空列表,[1|Z]-Z是含有1列表,[1,2,3|Z]-Z是含有1,2和3可以通過與Y-[]統一它糾正一個差分列表的列表中。 「 - 通過W.F.Clocksin條款和效果」

flatten(X,Y):-flatpair(X,Y-[]) %rectifying the list 

flatpair([],L-L). %empty list 
flatpair([H|T],L1-L3):-flatpair(H,L1-L2),flatpair(T,L2-L3). 
flatpair(X,[X|Z]-Z). 

這是更爲有效的,然後使用蓄電池和構造部分列表或者使用附加

在平鋪差符號給定爲在工作表28。

+0

可能值得明確指出的是,編寫flatpair的一種常見方法是放棄中綴表示法並使用單獨的參數來填補漏洞,例如*,flatpair([],二)。 flatpair([H | T],L1,L3): - flatpair(H,L1,L2),flatpair(T,L2,L3)。 flatpair(X,[X | Z],Z)。'不需要注意中綴符號來實現孔。 :) – lurker 2014-10-07 12:42:29

+0

'flatpair([],L - [])。'有兩個解決方案:'L = []; L = [[]]。' – false 2014-10-07 15:07:27