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

时间:2015-03-27 22:21:10

标签: list prolog size predicate

如何根据列表大小排序/显示使谓词成立的所有不同输出?

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

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]

2 个答案:

答案 0 :(得分: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从排序的解决方案列表中获取每个列表。< / p>

答案 1 :(得分:0)

排序和重复删除可以通过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).