2015-10-21 33 views
-1

我有更多的可能列表作爲目標,但我只需要一個最長的列表。是否有可能獲得第一個最長的列表?獲得最長的列表作爲目標在序言

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

這裏出錯:本地stack.I的希望只有最長的名單爲目標:

?-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.` 
+1

您可以顯示分類謂詞怎麼看?難以幫助,否則 – Limmen

+0

好的。現在我添加pridicate.is可能得到答案? – Gamsh

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

它使用pairs_keys_values/3並且如在SWI-Prolog的標準庫中定義的last/2

儘管存在幾個問題,但這種方法仍可行。在沒有任何關於classify/1的作用的知識的情況下討論這些是很困難的。

+0

我編輯的問題,我添加pridicate.is可能得到答案? – Gamsh

1

我至少使用一次鮑里斯的答案一個令人費解的變種

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