Prolog - 合并2个列表为我提供了列表而不是单个列表

时间:2017-12-01 00:51:38

标签: list prolog append

我尝试了很多解决方案,这与我所期待的结果非常接近。

我想要合并2个列表,但我得到的是列表而不是一个列表。

res1(Title,L3) :- findall(Genre,(book(Title,_,Genre,_)),L3).
res2(Author,L2) :- findall(Genre,(name(Author,Editor,_), house(Editor,_,Genre)),L2).
finalres(Title,Author,L) :- res1(Title,L3), res2(Author,L2), merged(L3, L2, L).

merged([],List,List).
merged([Element|List1],List2,[Element|List3]) :- merged(List1,List2,List3).

合并后的代码来自Prolog Combining Two Lists

当我通过在参数中写两个列表来尝试这个时,我得到了正确的结果:

?- merged([g1,g2],[g3,g4],L).
L = [g1, g2, g3, g4].

然而,当我通过我的决赛调用它时,我得到以下内容:

?- finalres("some title",a1,L).
L = [[g3, g4], [g1, g2]]

我想看L = [g3, g4, g1, g2] - 订单不会打扰我。 我也不需要从列表中删除欺骗(我稍后会处理成员:))

是因为merged(List2)的第二个参数永远不会分开吗?我误解了这个附加代码是如何工作的吗?

使用SWI-Prolog。

提前致谢!

1 个答案:

答案 0 :(得分:0)

使用评论中的建议答案进行修复:

finalres(Title,Author,K) :- res1(Title,L3), 
                            res2(Author,L2), 
                            merged(L3, L2, L),
                            flatten(L, K).