我有更多可能的列表作为目标,但我只需要一个最长的列表。这有可能获得第一长列表吗?
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.`
答案 0 :(得分:1)
您未提供有关classify/1
如何实施的任何详细信息;可能是你可以定义它,以便它只给你最长的列表。
您的另一个选择是使用findall/3
或bagof/3
或setof/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/3
和last/2
。
这种方法可行,即使它有几个问题。很难在不知道classify/1
做什么的情况下讨论那些人。
答案 1 :(得分:1)
我至少使用了一次Boris'回答
?- R=[_-S|_],setof(L-X,T^(classify(X),length(X,T),L is -1*T),R).