i want to make one list split into list of lists, and skip the 'solid' and separate the list into sublist.
the input and output is below
split_s([A,B,C,solid,D,E,F],X).
X = [[A,B,C],[D,E,F]].
Can anyone help me?
i want to make one list split into list of lists, and skip the 'solid' and separate the list into sublist.
the input and output is below
split_s([A,B,C,solid,D,E,F],X).
X = [[A,B,C],[D,E,F]].
Can anyone help me?
Try something along the following lines. It helps if you decompose your problem. In this case, the heart of the problem is this:
solid
.Which you can do like this with a predicate like 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.
. %
Once you have that down, the rest is easy:
Like this:
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!
The following works for me:
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]).
EDIT: moved the cut in the 3rd clause in front of the split.
If you don't want empty lists, then try the following:
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]).