Prolog压平累加器与孔

时间:2014-10-07 01:37:28

标签: prolog

我无法理解累加器和孔之间的区别。

形式上:

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 个答案:

答案 0 :(得分: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”

中作为工作表28给出差异表示法的展平
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). 

这比使用累加器和构建部分列表或使用追加更有效。