1

我们走吧,忍受我。总体目标是返回两个列表之间的最大对齐。如果有多个具有相同长度的对齐,它可以只返回第一个。

对齐是指两个列表共享的元素,按正确的顺序但不一定按顺序。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], []]. 

这是正确的,但是现在我需要一个谓词来结合这两者并返回列表列表中的最大列表。

4

2 回答 2

1

使用此答案中给出的解决方案。

您也可以尝试避免使用findall/3,因为您实际上并不需要构建一个列表来找到它的最大元素。

于 2009-11-03T23:52:02.407 回答
-1

所以你只需要找到列表中最大的项目吗?

编辑:

好的,所以更好的答案是:

如果您关心性能,那么您需要编写自己的谓词来扫描列表以跟踪最大项目。

如果您不太关心性能并且只希望它工作,您可以对其进行反向排序,然后获取排序列表中的第一项。这样做的好处是,通过使用排序库谓词,您应该能够在几行中实现它。

于 2009-11-03T17:16:29.753 回答