获得最长的列表作为prolog的目标

时间:2015-10-21 06:35:17

标签: list prolog

我有更多可能的列表作为目标,但我只需要一个最长的列表。这有可能获得第一长列表吗?

li-->[a]|[b]|[c].
int-->['1']|['2']|['3'].
num-->int,num_nl.
num_nl-->num|[].
list1-->num,li.
classify(L,S,R):-list1(S,[]),extract(S,L,R).
extract(S,L1,L2):-append(L11,L22,L1),append(S,L3,L22),append(L11,L3,L2).

这里错误:超出本地堆栈。我只想要最长的列表作为目标:

?-classify([c,'1','1',a,f],S,R).
S = ['1', '1', a], R = [c, f] ;
false.
?-classify([c,'1','2','3',a,f,'1','1','2','3',b],S,R).
S = ['1','2','3',a], R = [c, f,'1','1','2','3',b] ;
false.`

2 个答案:

答案 0 :(得分:1)

您未提供有关classify/1如何实施的任何详细信息;可能是你可以定义它,以便它只给你最长的列表。

您的另一个选择是使用findall/3bagof/3setof/3收集所有结果,然后以列表长度作为第一个元素进行配对,然后对这些对进行排序并选择最后一次。

例如:

?- bagof(X, classify(X), Xs),
   maplist(length, X, Lengths),
   pairs_keys_values(Ps, Lengths, Xs),
   keysort(Ps, Sorted),
   last(_-Longest, Sorted).

它使用SWI-Prolog标准库中定义的pairs_keys_values/3last/2

这种方法可行,即使它有几个问题。很难在不知道classify/1做什么的情况下讨论那些人。

答案 1 :(得分:1)

我至少使用了一次Boris'回答

?- R=[_-S|_],setof(L-X,T^(classify(X),length(X,T),L is -1*T),R).