Search code examples
listprologprolog-dif

filter list into separate lists


I need to filter the list [#,d,e,#,f,g] such that I get the output as [[d,e],[f,g]] ,
I am stuck while creating a new list every time I encounter '#' is there a way to do this? I tried the code below,

filterL([],List) :-[].
filterL([Head|Tail],X) :-
   (  Head \='#'->
      append(X,Head,List),
      filterL(Tail,List)
   ;  filterL(Tail,X)
   ).

Solution

  • Your problem is not very well defined. Are empty sequences allowed or not? Shall [#] be related to [[],[]] (there is an empty sequence before and after) or []? You say it should be []. So:

    list_splitbyhash(Xs, Xss) :-
       phrase(splitby(Xss,#), Xs).
    
    splitby([],_E) -->
        [].
    splitby(Xss,E) -->
        [E],
        splitby(Xss,E).
    splitby([Xs|Xss],E) -->
        {Xs = [_|_]},
        all_seq(dif(E),Xs),
        splitby(Xss,E).
    
    all_seq(_, []) --> [].
    all_seq(C_1, [C|Cs]) -->
       [C],
       {call(C_1,C)},
       all_seq(C_1, Cs).