Prolog使用自己的组合谓词的问题

时间:2009-11-03 16:22:49

标签: list prolog

我们走了,请耐心等待。总体目标是返回两个列表之间的最大对齐。如果有多个具有相同长度的对齐,则只能返回第一个。

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

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

2 个答案:

答案 0 :(得分:1)

使用this answer中提供的解决方案。

你也可以尝试避免使用findall/3, 因为你真的不需要建立一个列表来找到它最大的元素。

答案 1 :(得分:-1)

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

编辑:

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

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

如果你没有对性能进行过多关注,而你只是想让它起作用,你可以反过来对它进行排序,然后取出排序列表中的第一项。这样做的好处是,通过使用排序库谓词,您应该能够在几行中实现它。