Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/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 依次连接两个列表_List_Prolog - Fatal编程技术网

List 依次连接两个列表

List 依次连接两个列表,list,prolog,List,Prolog,我试图创建一个谓词,以这样的方式连接两个列表 测试([1,2],[3,4],X)将给出X=[1,3,2,4] 我的尝试看起来是这样的 test([], [], _). test([X|L1], [Y|L2], L3) :- append([X, Y], L3, L4), test(L1, L2, L4). 问题是,它只给出了true.输出,所以我最后的列表似乎没有存储在L3var下?我不知道如何解决这个问题,如果有任何建议,我将不胜感激。你有一个良好的开端,而且几乎可以正常工作。这里有一些评论

我试图创建一个谓词,以这样的方式连接两个列表

测试([1,2],[3,4],X)
将给出
X=[1,3,2,4]

我的尝试看起来是这样的

test([], [], _).
test([X|L1], [Y|L2], L3) :-
append([X, Y], L3, L4),
test(L1, L2, L4).

问题是,它只给出了
true.
输出,所以我最后的列表似乎没有存储在
L3
var下?我不知道如何解决这个问题,如果有任何建议,我将不胜感激。

你有一个良好的开端,而且几乎可以正常工作。这里有一些评论

名称
test
非常通用,应该使用更好的名称。从可读性的角度来看,这不仅是一个很好的实践,而且泛型名称经常会与预定义的系统谓词发生冲突。在这种情况下,我会选择
interleave
zip
,这是两个列表之间这种关系的常用名称

您的基本用例
测试([],[],41;
有效地表明,对两个空列表进行操作的结果是您想要的任何列表,这显然是不符合逻辑的。它应该是交织([],[],[])。

append([X,Y],L3,L4)
中使用
append/3
太过分了。您可以简单地编写:
L4=[X,Y | L3]
,或者更简洁地编写:

interleave([X|L1], [Y|L2], [X,Y|L3]) :-
    interleave(L1, L2, L3).
对于这种单一的基本情况,您将成功的解决方案限制为只包含两个长度相同的列表。如果您想要不同长度的列表,您需要一些额外的逻辑来适应。这可以通过两个基本情况来实现。将所有这些放在一起,您将拥有:

interleave([], L, L).          % interleaving the empty list with any list is the same list
interleave([H|T], [], [H|T]).  % interleaving any non empty list
                               %   with the empty list is the same list
interleave([X|L1], [Y|L2], [X,Y|L3]) :-
    interleave(L1, L2, L3).

这将是一个“压缩”或“交织”操作。您已经有了基本的想法,但是
append/3
太过分了。您只需编写
交织([X | L1],[Y | L2],[X,Y | L3]):-interleave(L1,L2,L3)。
(注意,我将名称更改为更有意义的名称)。您的基本用例
测试([],[],uz)。
表示,如果您压缩/交织两个空列表,那么您将得到您想要的任何东西。听起来对吗?如果你将两个空列表交错,你会得到什么呢?好的,那么基本情况交错([],[],[])。可能需要为L1和L2制作一些大小不同的基本情况。非常感谢。是的,你明白了。如果您想处理不同大小的列表,那么就需要这些列表的子句。从你的问题中不清楚这些是否会成功。如果您希望不同大小的列表失败,那么您所拥有的将满足这一要求。如果您希望它们成功,那么您只需要简单明了的额外基本情况:
交错([],L,L)。
交错([H | T],[H | T])。
-注意,使用头/尾符号确保列表不为空,从而避免了冗余解决方案。