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])。
-注意,使用头/尾符号确保列表不为空,从而避免了冗余解决方案。