List 在Prolog中查找最长的连续子列表
我是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,
[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].