我想将一个列表拆分为列表列表,并跳过“固体”列表。并将列表分成子列表。
输入和输出低于
split_s([A,B,C,solid,D,E,F],X).
X = [[A,B,C],[D,E,F]].
任何人都可以帮助我吗?
答案 0 :(得分:1)
尝试以下几行。如果您分解您的问题,它会有所帮助。在这种情况下,问题的核心是:
solid
的列表的最长前缀。您可以使用take_until( List , Separator , Prefix , Remainder )
之类的谓词来执行此操作:
take_until( [] , _ , [] , [] ) . % if we hit the end of the source list, we're done.
take_until( [X|Xs] , X , [] , Xs ) . % if we hit the separator, we're done
take_until( [X|Xs] , S , [X|Ps] , Rs ) :- % otherwise...
X \= S , % - when the head of the list is NOT the separator
take_until( Xs , S , Ps , Rs ) % - we take it on to the sublist and keep going.
. %
一旦你有了这个,其余的很容易:
像这样:
split( [] , [] ) . % splitting the empty list results in the empty list.
split( [X|Xs] , [Y|Ys] ) :- % splitting a non-empty list...
take_until( [X|Xs] , solid , Y , R ) , % - get the desired prefix
split(R, , Ys ) % - recurse down on what's left
. % Easy!
答案 1 :(得分:0)
以下适用于我:
split_s([],[[]]).
split_s([H|T],[[H|XH]|XR]) :- var(H),!,split_s(T,[XH|XR]).
split_s([solid|T],[[]|X]) :- !,split_s(T,X).
split_s([H|T],[[H|XH]|XR]) :- split_s(T,[XH|XR]).
编辑:在分割前面的第3个子句中移动了切口。
如果您不想要空列表,请尝试以下操作:
split_s([],[]).
split_s([H|T],[[H|XT]|XXT]) :- var(H),!,split_s([[H]|T],[[[H]|XT]|XXT]).
split_s([solid|T],X) :- !,split_s(T,X).
split_s([H],[[H]]) :- !.
split_s([H,M|T],[[H,M|XT]|XXT]) :- var(M),!,split_s([[M]|T],[[[M]|XT]|XXT]).
split_s([H,solid|T],[[H]|XT]) :- !,split_s(T,XT).
split_s([H|T],[[H|XH]|XR]) :- split_s(T,[XH|XR]).