Prolog - combine2如何防止在最后添加一个空列表

时间:2016-10-09 14:12:51

标签: list prolog

我正在通过learnprolognow学习Prolog。目前我正在第4章,我被困在the second exercise

“现在编写一个3位谓词combine2,它将三个列表作为参数,并将前两个列表的元素组合成第三个,如下所示:

?-  combine2([a,b,c],[1,2,3],X).    
X  =  [[a,1],[b,2],[c,3]] "

我的实现是:

combine2([],[],[]).
combine2([H1|T1],[H2|T2],[[H1,H2],R]):-
   combine2(T1,T2,R).

上面查询的结果是:

 X = [[a, 1], [[b, 2], [[c, 3], []]]] ;

我不知道如何重写它,所以在最后一步中程序没有添加空列表。我愿意接受建议/提示/解决方案。

谢谢你,周日愉快!

2 个答案:

答案 0 :(得分:3)

在您的实现中:[[H1,H2],R]是一个包含元素[H1,H2]和元素R的两个元素的列表。您需要编写的是[[H1,H2]|R],它表示头元素列表[H1 ,H2]和列表R的其余部分将被递归地实例化。请注意,行[[H1,H2],R]不仅会导致最后一个空列表,而且它也会嵌套您的列表,因为您没有获得X = [[a, 1], [b, 2], [c, 3], []] ;(它只有一个空列表),但嵌套列表如下:X = [[a, 1], [[b, 2], [[c, 3], []]]] ;

答案 1 :(得分:2)

您必须在|中仅更改字符,而不是[[H1,H2],R]:我的意思是[[H1,H2]|R]而不是[[H1,H2],R]

如果您使用逗号,则创建一个包含两个元素的新列表:(a)列表[H1,H2]和(b)列表R

如果使用管道,则插入(在第一个位置)列表[H1, H2],然后插入R中的元素。