prolog - gprolog 最长子集

标签 prolog

我有一个整数列表,我需要从列表中找到升序整数的最长子集。 例如:[1,2,5,3,6,7,4] - 最长的子集应该是 SS = [1,2,3,6,7]

谁能至少告诉我实现它的主要指南。

最佳答案

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 =< H,
    longestSubseq( Tail, [H, BufHead | BufTail], Longest, Ans ).

longestSubseq( [H | Tail], Buffer, Longest, Ans ) :-
    [BufHead | _ ] = Buffer,
    BufHead > H,
    length( Longest, LongestLength ),
    length( Buffer, BufferLength ),
    ( 
        ( BufferLength > LongestLength, NewLongest = Buffer )
    ;
        ( BufferLength =< LongestLength, NewLongest = Longest ) 
    ),
    longestSubseq( Tail, [H], NewLongest, Ans ).

我对 gprolog 不是很熟悉,所以它是一个 swi-prolog 代码。

我们得到的是 2 个谓词:longestSubseq/2longestSubseq/4

longestSubseq/4 有一个缓冲区(当前单调子序列),最长(当前时间最长的子序列)和一个累加器 Ans。

我们需要在该累加器中处理一些行为:

  1. 缓冲区为空。我们在其中添加了新元素。
  2. 新元素小于最后一个缓冲区元素。我们将该元素放入缓冲区。
  3. 新元素大于最后一个缓冲区元素。我们清除缓冲区并将该元素放入其中。如果缓冲区大于最长的子序列,我们将替换它。

所以,这似乎是可行的。

?- longestSubseq( [2], X ).
X = [2] ;
false.

?- longestSubseq( [2,1,2,3,2], X ).
X = [1, 2, 3] ;
false.

关于prolog - gprolog 最长子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8218274/

相关文章:

syntax - 为什么作为高优先级运算符的原子不需要圆括号?

list - 在 prolog 脚本中定义列表

prolog:如何用 global_cardinality 判断列表至少有 N 个等于 M 的元素(M,N 是整数)

prolog - 谓词返回假

prolog - 黑白棋(黑白棋)游戏、翻转棋子、Prolog

java - 语义网中的 SWI-Prolog

c++ - 在 Windows 8 上编译 Yap

prolog - 如何在Prolog中应用通用量词?

prolog - 如何查看 Prolog 查询的详细顺序(执行)?

Emacs 和 Prolog