Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<pre><code>longestSubseq( List, Ans ) :- longestSubseq( List, [], [], Ans ). longestSubseq( [], Buffer, [], Buffer ) :- !. longestSubseq( [], _, AnsRevert, Ans ) :- reverse( AnsRevert, Ans ). longestSubseq( [H | Tail], [], Longest, Ans ) :- longestSubseq( Tail, [H], Longest, Ans ). longestSubseq( [H | Tail], [BufHead | BufTail], Longest, Ans ) :- BufHead =&lt; H, longestSubseq( Tail, [H, BufHead | BufTail], Longest, Ans ). longestSubseq( [H | Tail], Buffer, Longest, Ans ) :- [BufHead | _ ] = Buffer, BufHead &gt; H, length( Longest, LongestLength ), length( Buffer, BufferLength ), ( ( BufferLength &gt; LongestLength, NewLongest = Buffer ) ; ( BufferLength =&lt; LongestLength, NewLongest = Longest ) ), longestSubseq( Tail, [H], NewLongest, Ans ). </code></pre> <p>I not quite familiar with gprolog, so it's a swi-prolog code.</p> <p>What we've got there is 2 predicates: <code>longestSubseq/2</code> and <code>longestSubseq/4</code>. </p> <p><code>longestSubseq/4</code> have a buffer (current monotonically subsequence), longest (longest subsequence at current time) and a accumulator Ans. </p> <p>There are some behaviors what we need to handling in that accumulator:</p> <ol> <li>Buffer is empty. We put new element in it.</li> <li>New element is smaller than last buffer element. We put that element in buffer.</li> <li>New element is larger than last buffer element. We clear buffer and put that element in it. If buffer was larger than longest subsequence, we substitute it.</li> </ol> <p>So, it seems workable.</p> <pre><code>?- longestSubseq( [2], X ). X = [2] ; false. ?- longestSubseq( [2,1,2,3,2], X ). X = [1, 2, 3] ; false. </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload