prologmarquee

Marquee in Prolog


Well known from , is clearly the pinnacle of the Semantic Web. Or rather its nadir side by side with the blink tag. In any case, how can we represent marquee in Prolog? In other words, how to define a relation marquee/2 such that the following holds:

?- marquee("Prolog is marquee ready! ",M).
   M = "Prolog is marquee ready! "
;  M = "rolog is marquee ready! P"
;  M = "olog is marquee ready! Pr"
;  M = "log is marquee ready! Pro"
;  M = "og is marquee ready! Prol"
;  M = "g is marquee ready! Prolo"
;  M = " is marquee ready! Prolog"
;  M = "is marquee ready! Prolog "
;  M = "s marquee ready! Prolog i"
;  M = " marquee ready! Prolog is"
;  M = "marquee ready! Prolog is "
;  ... .
?- M=[m|_],marquee("Prolog is marquee ready! ",M).
   M = "marquee ready! Prolog is "
;  M = "marquee ready! Prolog is "
;  M = "marquee ready! Prolog is " % infinitely many redundant answers
;  ... .

So how can I define marquee/2 in ISO Prolog just using the Prolog prologue? The double quotes above assume set_prolog_flag(double_quotes, chars), and the answer write option max_depth(0) needs to be set to get the entire string.

What I have tried is member/2 but it only describes the characters and then I tried nth0/3 and nth1/3 but they only described two characters in sequence as in:

?- T = "Prolog is marquee ready! ", nth1(I,T,A),nth0(I,T,B).
   T = "Prolog is marquee ready! ", I = 1, A = 'P', B = r
;  T = "Prolog is marquee ready! ", I = 2, A = r, B = o
;  ... .

Edit: one clarification about the repetitions. They should fit together seamlessly, as in

?- marquee("! ",M).
   M = "! "
;  M = " !"
;  M = "! "
;  M = " !"
;  M = "! "
;  M = " !"
;  M = "! "
;  M = " !"
;  M = "! "
;  M = " !"
;  ... .

Solution

  • First, hat tip to this answer and the author, @brebs.

    I looked at marquee_/3 ... and append/3 looked back at me—with shuffled arguments.

    So here's the minimally updated version of marquee/2:

    marquee(L,M) :-
       append(L,R,LD),
       append(R,M,LD).   % was: marquee_(LD,R,M)
    

    Sample queries:

    ?- marquee("prolog",Xs).
       Xs = "prolog"
    ;  Xs = "rologp"
    ;  Xs = "ologpr"
    ;  Xs = "logpro"
    ;  Xs = "ogprol"
    ;  Xs = "gprolo"
    ;  Xs = "prolog"
    ;  Xs = "rologp"
    ;  ... .
    
    ?- marquee("",Xs).
       Xs = []
    ;  Xs = []
    ;  ... .