我们走了,请耐心等待。总体目标是返回两个列表之间的最大对齐。如果有多个具有相同长度的对齐,则只能返回第一个。
对齐我的意思是两个列表的元素按正确的顺序共享,但不一定按顺序。 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], []].
这是正确的,但现在我需要一个结合了这两个的谓词,并返回列表列表中的最大列表。
答案 0 :(得分:1)
使用this answer中提供的解决方案。
你也可以尝试避免使用findall/3
,
因为你真的不需要建立一个列表来找到它最大的元素。
答案 1 :(得分:-1)
所以你只需要找到列表中最大的项目?
编辑:
好的,所以更好的答案是:
如果你关心性能,那么你需要编写自己的谓词来扫描列表,跟踪最大的项目。
如果你没有对性能进行过多关注,而你只是想让它起作用,你可以反过来对它进行排序,然后取出排序列表中的第一项。这样做的好处是,通过使用排序库谓词,您应该能够在几行中实现它。