List 在Prolog中查找最长的连续子列表

List 在Prolog中查找最长的连续子列表,list,prolog,clpfd,meta-predicate,List,Prolog,Clpfd,Meta Predicate,我是Prolog的初学者,这是我的问题: 我有一个无重复整数的排序列表,即[1,2,3,11,12,13,14,21,22,23,24,25] 我想编写一个谓词,查找列表元素中最长的连续子列表,即最长的列表,其中每个整数后面紧跟其后的整数(在自然数集合中) 在上述示例中,该列表将是[21,22,23,24,25],其中长度=5 如果有多个列表具有相同的最大长度,我只对其中一个感兴趣,不管是哪一个 它应该是这样工作的: maxCont([1,2,3,11,12,13,14,21,22,23,24,

我是Prolog的初学者,这是我的问题:

我有一个无重复整数的排序列表,即
[1,2,3,11,12,13,14,21,22,23,24,25]

我想编写一个谓词,查找列表元素中最长的连续子列表,即最长的列表,其中每个整数后面紧跟其后的整数(在自然数集合中)

在上述示例中,该列表将是
[21,22,23,24,25]
,其中
长度=5

如果有多个列表具有相同的最大长度,我只对其中一个感兴趣,不管是哪一个

它应该是这样工作的:

maxCont([1,2,3,11,12,13,14,21,22,23,24,25],Lst]).
Lst = [21,22,23,24,25].
?- splitlistIfAdj(z_nonsucc_t,[1,2,3,11,12,13,14,21,22,23,24,25],Pss).   
Pss = [[1,2,3],[11,12,13,14],[21,22,23,24,25]].

首先,我们基于和定义
z_nonsucc_t/3

接下来,我们根据和定义了/3的最大值:

为了获得最长的列表,我们使用
max\u of_by/3
,如下所示:

请注意,
max\u of_by/3
在以下情况下可能会成功多次:

?- max_of_by(Xs,[[1,2,3],[11,12,13,14,15],[21,22,23,24,25]],length). Xs = [11,12,13,14,15] ; Xs = [21,22,23,24,25]. 示例查询:

?- maxCont([1,2,3,11,12,13,14,   21,22,23,24,25],Xs).
Xs = [21,22,23,24,25].

?- maxCont([1,2,3,11,12,13,14,15,21,22,23,24,25],Xs).
  Xs = [11,12,13,14,15]
; Xs = [21,22,23,24,25].

你尝试了什么?@joel76实际上,我确实通过稍微更改第一个答案的代码找到了解决方案。
?- max_of_by(Xs,[[1,2,3],[11,12,13,14],[21,22,23,24,25]],length).
Xs = [21,22,23,24,25].
?- max_of_by(Xs,[[1,2,3],[11,12,13,14,15],[21,22,23,24,25]],length). Xs = [11,12,13,14,15] ; Xs = [21,22,23,24,25].
maxCont(Zs,Xs) :-
   splitlistIfAdj(z_nonsucc_t,Zs,Pss),
   max_of_by(Xs,Pss,length).
?- maxCont([1,2,3,11,12,13,14,   21,22,23,24,25],Xs).
Xs = [21,22,23,24,25].

?- maxCont([1,2,3,11,12,13,14,15,21,22,23,24,25],Xs).
  Xs = [11,12,13,14,15]
; Xs = [21,22,23,24,25].