Prolog:检查列表中的列表长度

时间:2016-12-06 00:12:01

标签: list prolog

我在Prolog中是全新的,我在处理包含其他列表的列表时遇到问题。 我有一些像这样的列表: [([5],23),([1],23),([2],43),([4],29),([3],14),([5,1,4,3],47)] 我试图获取最长的(子)列表并将其放在列表中

在这个例子中我希望结果如下: ([5,1,4,3],47),([5],23),([1],23),([2],43),([4],29),([3],14)]

(不要关心它是否会从它的起点移除)。

感谢所有愿意帮助的人

1 个答案:

答案 0 :(得分:1)

假设您要使用内置排序例程(我在这里使用SWI-Prolog作为示例),那么以下内容将起作用:

calcLen((List,K),(N,List,K)):- length(List,N).
delLen((_,List,K),(List,K)).

sortlen(List,Sorted):- 
  maplist(calcLen,List,List1), 
  sort(0,@>=,List1, List2),
  maplist(delLen,List2,Sorted).

两个谓词calcLendelLen在列表中的对的前面插入并删除长度计算 - 使它们成为三元组。 maplist谓词将calcLen(以及后来的delLen)应用于列表。