listprologprolog-dif

Remove leading zeros in list in Prolog


I have a list with an unknown number of zeros at the beginning of it, for example [0, 0, 0, 1, 2, 0, 3]. I need this list to be stripped of leading zeros, so that it would look like [1, 2, 0 , 3].

Here's what I have:

lead([Head | _], _) :- Head =\= 0.
lead([0 | Tail], _) :- 
  lead(Tail, Tail).

The output of which is simply True. Reading the trace shows that it is running until it has a list with no leading zeros, but then the answer doesn't propagate back up the stack. I'm pretty new to Prolog, so I can't figure out how to make it do that.


Solution

  • Here is a solution that works in all directions:

    lead([],[]).
    lead([H|T],[H|T]) :-
        dif(H,0).
    lead([0|T],T2) :-
        lead(T,T2).
    

    Some queries:

    ?- lead([0,0,0,1,2,0,3], L).
    L = [1, 2, 0, 3] ;
    false.
    
    
    ?- lead(L, []).
    L = [] ;
    L = [0] ;
    L = [0, 0] ;
    L = [0, 0, 0] ;
    ...
    
    
    ?- lead(L0, L).
    L0 = L, L = [] ;
    L0 = L, L = [_G489|_G490],
    dif(_G489, 0) ;
    L0 = [0],
    L = [] ;
    L0 = [0, _G495|_G496],
    L = [_G495|_G496],
    dif(_G495, 0) ;
    L0 = [0, 0],
    L = [] ;
    L0 = [0, 0, _G501|_G502],
    L = [_G501|_G502],
    dif(_G501, 0) ;
    L0 = [0, 0, 0],
    L = [] ;
    ...
    

    EDIT This predicate actually doesn't work for e.g. lead(L0, [0,1,2]).