List 组合独立工作的谓词的Prolog问题
我们走吧,耐心点。总体目标是返回两个列表之间的最大对齐。如果有多条路线具有相同的长度,则可以返回第一条路线 对于对齐,我指的是两个列表共享的元素,顺序正确,但不一定按顺序。1,2,3和1,2,9,3;这里1,2,3将是最长的路线。任何人都知道我已经定义的谓词List 组合独立工作的谓词的Prolog问题,list,prolog,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, []). 然后我使
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], []].
这是正确的,但是现在我需要一个谓词,它将这两者结合起来,并返回列表列表中最大的列表 那么您只需要找到列表中最大的项目 编辑: 好的,一个更好的答案是: 如果您关心性能,那么您需要编写自己的谓词来扫描列表,跟踪最大的项 如果您对性能没有太多要求,只是希望它能够正常工作,那么您可以对其进行反向排序,然后在排序列表中选择第一项。这样做的好处是,通过使用排序库谓词,您应该能够在几行中实现它。使用中给出的解决方案 您还可以尝试避免使用
findall/3
,
因为你不需要建立一个列表来找到它最大的元素。如果你这么说是指列表中最大的列表。如果你只想找到最大的项,那么排序是一种过分的做法。是的,但是因为你可以使用库谓词,它的优点是实现起来更简单。