List 如何在prolog中根据输出的长度对其进行排序?

List 如何在prolog中根据输出的长度对其进行排序?,list,prolog,size,predicate,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] 如果您的过程总是返回一个列表,那么您可以收集所有的解决方案,根据列表长度对它们进行排序,然后迭代排序后的列表 例如,假设您有一个返回列表的过程somethin

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

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

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).

删除重复的解决方案怎么样?我可以在代码中写些什么来避免在解决方案中显示重复项?@Swailem95查找用于收集解决方案的三个谓词:
findall/3
bagof/3
、和
setof/3
。您可以收集所有解决方案并以某种方式对它们进行排序,或者,您可以更改传递这些解决方案的谓词,以便按照需要的顺序找到它们。