2010-11-23 63 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各级压扁只有一个水平。