prolog实现自定义flatten

时间:2014-11-22 12:11:24

标签: prolog

你好,我在prolog中有一个列表列表,我想要展平它们。我做了一个preidacate,按照我的意愿压扁列表,但我有这个案例:

[[2,2,3],[3,2]]会像这样被夷为平地:[2,2,3,0,3,2] ,如果上一个列表的最后一个元素与下一个列表的第一个元素相同,我想在新列表中添加0。你能救我吗?

这是我到目前为止的工作:

myflat([],[]) :- !.
myflat([H|T],Z) :- myflat(H,K), myflat(T,L), append(K,L,Z),!.
myflat(H,[H]) :- not(H = [K]).

但我想不出如何检查上述元素的相等性

1 个答案:

答案 0 :(得分:0)

不完美但有效:

myflat([[A,B|List]|ListOfLists], [A|Output]) :-
    myflat([[B|List]|ListOfLists], Output).
myflat([[A],[A|List]|ListOfLists], [A,0|Output]) :-
    myflat([[A|List]|ListOfLists], Output).
myflat([[A],[B|List]|ListOfLists], [A|Output]) :-
    A =\= B,
    myflat([[B|List]|ListOfLists], Output).
myflat([[A]], [A]).

示例输入/输出:

?- myflat([[1,2,1],[1,2],[2,1]], X).
X = [1, 2, 1, 0, 1, 2, 0, 2, 1] .

?- myflat([[2,2,3],[3,2]],X).
X = [2, 2, 3, 0, 3, 2] ;
false.