Re: Help with lists.



Bart Demoen wrote:

My apologies for this impure program: I had no time to make it more
pure :-)

Here is a purer one nevertheless - with the right complexity I think.



remove_triplets(I,O) :-
        pair(I,I1,1),
        sort(I1,I1s),
        collect(I1s,[],Leave1),
        sort(Leave1,Leave),
        skim(Leave,I1,O).

skim([],_,[]).
skim([P|RP],[X-PX|RX],Out) :-
        (P == PX ->
            Out = [X|S],
            skim(RP,RX,S)
        ;
            skim([P|RP],RX,Out)
        ).

collect([],[]).
collect([X-PX|R],O) :-
        eat(R,X,R1,1,N),
        (N =\= 2 ->
            O = [PX|O1],
            collect(R1,O1)
        ;
            R = [_-P2|_],
            O = [PX,P2|O1],
            collect(R1,O1)
        ).

eat([],_,[],N,N).
eat([A|R],X,O,I,N) :-
        A = (AX-_),
        (AX == X ->
            I1 is I + 1,
            eat(R,X,O,I1,N)
        ;
            O = [A|R],
            N = I
        ).

pair([],[],_).
pair([X|R],[X-I|S],I) :-
        I1 is I + 1,
        pair(R,S,I1).


Cheers

Bart Demoen
.