users-prolog
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Impressed but confused, gluing a list together...


From: Sean Charles
Subject: Re: Impressed but confused, gluing a list together...
Date: Tue, 1 Oct 2013 22:47:48 +0100

Michał,

Thanks… it makes more sense when somebody else explains it if they know what 
they are talking about… one day I will know what I am talking about… one day...

:)


On 1 Oct 2013, at 22:30, "Michał Bieliński" <address@hidden> wrote:

> Dnia 1 Października 2013, 23:03, Wt, emacstheviking napisał:
>> I am dong some gluing of strings together and I wanted an intercalate
>> capability like many languagues offer, e.g. "join" in Javascript or
>> implode() with PHP and I came up with this:
>> 
>> join([], _, []).
>> join([X], _, [X]).
>> join([X|Xs], With, [X, With|Acc]) :- join( Xs, With, Acc).
>> 
>> The great news is that I figured it out first time and it seems to
>> do what I need, I also have a flatten() predicate that will produce
>> the final output string.
>> 
>> However... I am not sure I truly understand how I did it... if
>> I explain my reasoning perhaps somebody can straighten me out?
> 
> Okay.  Lets have at it.
> 
>> Rule 2: If there is a single X in the list, return just that single X.
>> That avoid "trailing" glue.
>> join([X], _, [X]).
> 
> I added a cut to avoid the solution with trailing glue.
> join([X], _, [X]) :- !.
> 
>> Rule 3: Um...... I used the force I guess.
>> join([X|Xs], With, [X, With|Acc]) :- glue( Xs, With, Acc).
> 
> Having a list of at least two elements, a "With" (glue) to separate return
> the following: a list with the first element of what you started with,
> then put the glue and next ... well, to know what comes next you have to
> repeat the operation with tail of the very first list.  The result of that
> step will tell you what to put next.
> 
> Thus first call rips the first character ("head") from the string, makes
> it the beginning of new list and puts glue next.  Then the "decapitated"
> string is passed to new invocation of join predicate which repeats the
> process with string shorter by one character building the final return
> stage by stage.  Recurse until there is only once character left.
> 
> Knowing this maybe you could build join so that flatten is not needed. 
> Assuming you want it of course.
> 
> -- 
> Michał Bieliński
> 
> 
> _______________________________________________
> Users-prolog mailing list
> address@hidden
> https://lists.gnu.org/mailman/listinfo/users-prolog




reply via email to

[Prev in Thread] Current Thread [Next in Thread]