Assignment 6 FAQs and More

FAQs

  1. Q: A couple of my append.pl predicates get "ERROR: Out of global stack", like this:
    ?- mem(1,[1,2]).
    true ;
    ERROR: Out of global stack
    
    Any suggestions?

    A: If you're blowing out the stack, try tracing. I see this with a faulty mem that I've named memv2:

    ?- trace, memv2(1,[1,2]).
       Call: (9) memv2(1, [1, 2]) ? creep
       Call: (10) lists:append(_678, [1], _682) ? creep
       Exit: (10) lists:append([], [1], [1]) ? creep
       Call: (10) lists:append([1], _680, [1, 2]) ? creep
       Exit: (10) lists:append([1], [2], [1, 2]) ? creep
       Exit: (9) memv2(1, [1, 2]) ? creep
    true ;
       Redo: (10) lists:append(_678, [1], _682) ? creep
       Exit: (10) lists:append([_664], [1], [_664, 1]) ? creep
       Call: (10) lists:append([_664, 1], _692, [1, 2]) ? creep
       Fail: (10) lists:append([_664, 1], _692, [1, 2]) ? creep
       Redo: (10) lists:append([_664|_666], [1], [_664|_672]) ? creep
       Exit: (10) lists:append([_664, _676], [1], [_664, _676, 1]) ? creep
       Call: (10) lists:append([_664, _676, 1], _704, [1, 2]) ? creep
       Fail: (10) lists:append([_664, _676, 1], _704, [1, 2]) ? creep
       Redo: (10) lists:append([_664, _676|_678], [1], [_664, _676|_684]) ? creep
       Exit: (10) lists:append([_664, _676, _688], [1], [_664, _676, _688, 1]) ? creep
       Call: (10) lists:append([_664, _676, _688, 1], _716, [1, 2]) ? creep
       Fail: (10) lists:append([_664, _676, _688, 1], _716, [1, 2]) ? creep
       ...
    
    Note that there's a sequence of Fails with longer and longer lists for the first argument of append, like this:
       ...
       Fail: (10) lists:append([_664, 1], _692, [1, 2]) ? creep
       ...
       Fail: (10) lists:append([_664, _676, 1], _704, [1, 2]) ? creep
       ...
       Fail: (10) lists:append([_664, _676, _688, 1], _716, [1, 2]) ? creep
    
    As humans we can quickly see that
    append([...more than one value..., 1], _728, [1, 2])
    
    will NEVER be true but those append calls plunge away, trying longer and longer lists that end with 1.

    This sort of behavior is often seen when the first of two append goals generates an unfavorable sequence of alternatives. This problem can often be fixed by doing the appends in the opposite order.

    p.s.
    Remember that you can turn off tracing with ?- nodebug.

  2. Q: I'm sure stuck on btw! Any suggestions?
    A: Here's a process that works for writing a number of generative predicates, including btw.
    1. Write a clause that produces the first result for any argument.

      Example:

      ?- btw([1,2,3,4,5],---,R).
      R = [1, ---, 2, 3, 4, 5].
      
      ?- 
      
    2. Next, write a clause that will produce btw's second result. Use btw to implement that second clause. That clause should look something like this:
      btw(..., Sep, ...) :- ..., btw(...,Sep,...), ...
      
      Don't worry about having the clause do anything more than producing the second result but be sure to use btw in the body! The ellipses above imply three or more goals in the body but you might find a single goal is all you need.
    When writing that second goal, look closely at the second result shown in the write-up's first example:
    ?- btw([1,2,3,4,5],---,R).
    R = [1, ---, 2, 3, 4, 5] ;
    R = [1, 2, ---, 3, 4, 5] ; 
    R = [1, 2, 3, ---, 4, 5] ;
    R = [1, 2, 3, 4, ---, 5] ;
    false.
    

    Notice that what I've underlined in the second result sure looks like what btw would produce if called on the tail of [1,2,3,4,5], huh?!

    You might now find that in addition to producing the second result, your btw is now complete, or almost so! 🙂 (If not, do a6/turnin, then mail to 372s23 and be sure to mention that you've read this FAQ.)

    Corrections (fixed in copy on website)

    1. The printed copies skip from Problem 11 to Problem 13. mishaps.pl should be Problem 12, and observations.txt should be "Problem" 13.