-1

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?

Daniel Lyons
  • 22,421
  • 2
  • 50
  • 77
Pei Chuang
  • 67
  • 6

2 Answers2

1

Try something along the following lines. It helps if you decompose your problem. In this case, the heart of the problem is this:

  • find the longest prefix of a list that doesn't contain the atom 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:

  • use the above predicate to extract the first such prefix, then
  • recurse down on what's left over.

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!
Nicholas Carey
  • 71,308
  • 16
  • 93
  • 135
0

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]).
halfbit
  • 3,414
  • 1
  • 20
  • 26