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解释器中实现了。非常感谢,现在我明白了:)非常感谢,现在我明白了:)