2009-11-03 34 views
1

工作謂詞在這裏,我們走了,多多包涵。總體目標是返回兩個列表之間的最大對齊。如果有多個具有相同長度的對齊,則可以返回第一個。Prolog的問題與combinding是對自己

隨着對準我的意思是元素兩個列表共享,以正確的順序,但不一定秩序。 1,2,3和1,2,9,3;這裏1,2,3將是最長的隊列。任何人,知道我已經定義的謂詞。

align(Xs, Ys, [El | T]) :-append(_, [El | T1], Xs),append(_, [El | T2], Ys),align(T1, T2, T). 
align(_Xs, _Ys, []). 

然後,我使用內置的謂詞findall得到這些列表之間的所有對齊列表?在這種情況下,它首先將最大的對齊,但我不知道爲什麼。

findall(X,align([1,2,3],[1,2,9,3],X),L). 

這將返回以下;

L = [[1, 2, 3], [1, 2], [1, 3], [1], [2, 3], [2], [3], []]. 

這是正確的,但現在我需要一個謂詞,它將這兩個相結合,並返回列表中最大的列表。

回答

1

使用在this answer給出的解決方案。

你也可以嘗試避免使用findall/3, ,因爲你不需要建立一個列表來找到它的最大元素。

-1

所以,你只需要在列表中找到最大的項目?

編輯:

好了,一個更好的答案是這樣的:

如果您關心性能,那麼你需要編寫自己的斷言它掃描的最大項目的列表保持跟蹤。

如果你不點這麼多的性能,你只希望它的工作,你可以只逆向排序,然後採取排序列表中的第一項。這樣做的好處是,通過使用一個排序庫謂詞,你應該能夠用幾行來實現它。

+0

如果你的意思在名單列表中的最大列表。比是的。 – Algific 2009-11-03 17:42:07

+1

如果你只是想找到最大的項目,排序是一種矯枉過正。 – Kaarel 2009-11-03 23:44:56

+0

確實如此,但由於您可以使用庫謂詞,因此具有實現起來更簡單的優點。 – nedned 2009-11-04 03:15:16