我正试图在列表上定义关系...
?- 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 :(得分: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
以展平仅一个级别。