我正在通过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], []]]] ;
我不知道如何重写它,所以在最后一步中程序没有添加空列表。我愿意接受建议/提示/解决方案。
谢谢你,周日愉快!
答案 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
中的元素。