如何根据长度对序言中的不同输出进行排序?
How to sort different outputs in prolog according to their lengths?
我如何sort/display 根据列表大小使谓词为真的所有不同输出?
例如,如果之前的输出是:
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]
如果您的程序总是returns一个列表,您可以收集所有解决方案,根据列表长度对它们进行排序,然后迭代排序后的列表。
例如,假设您有一个过程 something(L)
其中 returns 一个列表,您可以这样做:
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).
我如何sort/display 根据列表大小使谓词为真的所有不同输出?
例如,如果之前的输出是:
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]
如果您的程序总是returns一个列表,您可以收集所有解决方案,根据列表长度对它们进行排序,然后迭代排序后的列表。
例如,假设您有一个过程 something(L)
其中 returns 一个列表,您可以这样做:
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).