Prolog统一列表中的列表

时间:2010-11-23 16:38:12

标签: 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).

希望很快收到你的来信。

3 个答案:

答案 0 :(得分:2)

尝试这样的事情。我已经将谓词的名称更改为flatten_l,因为unify在Prolog中有其他内涵:

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 :(得分:1)

如果要折叠所有列表(甚至是子列表),可以使用flatten/2

如果您只想折叠单个级别,则以下内容应该有效:

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

答案 2 :(得分:0)

如果您使用SWI-pl,则可以调用flatten/2以展平所有级别的嵌套或append/2以展平仅一个级别。