2016-12-06 62 views
3

我在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

。假定您要使用内置的排序例程(我使用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)应用于列表。