繁体   English   中英

如何根据序言的长度对不同的输出进行排序?

[英]How to sort different outputs in prolog according to their lengths?

如何根据列表大小对谓词为true的所有不同输出进行排序/显示?

例如,如果之前的输出是:

X = [1,2,3,5,5,2,1,4,1]

X = [1,2,3,1]

X = [1,2,1,3,1,3]

我该怎么办,这样输出:

X = [1,2,3,1]

X = [1,2,1,3,1,3]

X = [1,2,3,5,5,2,1,4,1]

如果您的过程始终返回列表,则可以收集所有解决方案,并根据列表长度对其进行排序,然后遍历排序后的列表。

例如,假设您有一个过程something(L)返回一个列表,则可以执行以下操作:

sorted_something(L):-
  findall(Len-L, (something(L), length(L, Len)), AllL),
  keysort(AllL, SortedAllL),
  member(_-L, SortedAllL).

findall/3的调用将收集所有解决方案及其长度, keysort/2将根据其长度对解决方案进行排序, member/2从排序后的解决方案列表中获取每个列表。

排序和重复项删除可以通过setof / 3执行:

:- meta_predicate(sorted_lists(1,?)).

sorted_lists(Generate_a_list, SortedByLenght):-
  setof(Len-L, (call(Generate_a_list, L), length(L, Len)), All),
  member(_-SortedByLenght, All).

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM