Prolog在列表中统一列表

Prolog在列表中统一列表,prolog,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,Resul

我试图定义列表上的关系

?- 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).

希望不久能收到你的来信。

试试这样的东西。我已将谓词的名称更改为“展平”,因为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]).

还请注意,如果第一个参数未实例化,此谓词将给您一个堆栈溢出错误…

尝试类似的操作。我已将谓词的名称更改为“展平”,因为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]).

还请注意,如果第一个参数未实例化,此谓词将给您一个堆栈溢出错误…

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

如果只希望折叠单个标高,则应使用以下方法:

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

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

如果只希望折叠单个标高,则应使用以下方法:

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

如果使用SWI pl,则可以调用
flant/2
来展平所有嵌套级别,或者调用
append/2
仅展平一个级别。

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

内置的
flatte/2
可能具有您想要的行为-它可能已经在您使用的PROLOG解释器中实现了。
flatte/2
内置的可能具有您想要的行为想要-它可能已经在您使用的PROLOG解释器中实现了。非常感谢,现在我明白了:)非常感谢,现在我明白了:)