【发布时间】:2018-05-15 01:34:36
【问题描述】:
我尝试了许多解决方案,这与我所期望的结果一样接近。
我想合并 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 调用它时,我得到以下信息:
?- finalres("some title",a1,L).
L = [[g3, g4], [g1, g2]]
我想看看L = [g3, g4, g1, g2]- 订单不会打扰我。
我也不需要从列表中删除受骗者(我稍后会与成员打交道:))
是不是因为merged (List2) 的第二个参数从不分开?我是否误解了此附加代码的工作原理?
使用 SWI-Prolog。
提前致谢!
【问题讨论】:
-
不能只用
append/3吗? -
book/4的第三个参数是什么?原子还是列表? -
如果对
findall/3的调用返回列表列表,那么您需要“展平”结果。使用网站上的搜索功能。 -
@TomasBy 是的,流派确实是一个列表。 [g1, g2] 例如。我会继续尝试 append/3 并查看 findall/flattening!感谢您的宝贵时间,非常感谢。