【问题标题】:Prolog - Merging 2 lists gives me a list of lists instead of a single listProlog - 合并 2 个列表给我一个列表列表而不是一个列表
【发布时间】: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!感谢您的宝贵时间,非常感谢。

标签: list prolog append


【解决方案1】:

使用 cmets 中的建议答案修复:

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

【讨论】:

    猜你喜欢
    • 2016-01-08
    • 2016-01-12
    • 1970-01-01
    • 2014-05-16
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多