Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 组合独立工作的谓词的Prolog问题_List_Prolog - Fatal编程技术网

List 组合独立工作的谓词的Prolog问题

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, []). 然后我使

我们走吧,耐心点。总体目标是返回两个列表之间的最大对齐。如果有多条路线具有相同的长度,则可以返回第一条路线

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

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

那么您只需要找到列表中最大的项目

编辑:

好的,一个更好的答案是:

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

如果您对性能没有太多要求,只是希望它能够正常工作,那么您可以对其进行反向排序,然后在排序列表中选择第一项。这样做的好处是,通过使用排序库谓词,您应该能够在几行中实现它。

使用中给出的解决方案

您还可以尝试避免使用
findall/3

因为你不需要建立一个列表来找到它最大的元素。

如果你这么说是指列表中最大的列表。如果你只想找到最大的项,那么排序是一种过分的做法。是的,但是因为你可以使用库谓词,它的优点是实现起来更简单。