Prolog中的展平列表[重复]

Posted

技术标签:

【中文标题】Prolog中的展平列表[重复]【英文标题】:Flattening lists in Prolog [duplicate] 【发布时间】:2021-12-24 14:11:53 【问题描述】:

如何在 Prolog 中展平列表,例如:


    from A = [["a","b"],["c"]]
    to B = ["a", "b", "c"] ?

【问题讨论】:

这也是:***.com/questions/9059572/flatten-a-list-in-prolog 唯一干净的方法是使用flatten/2。例如,在 SWI-Prolog 中:?- flatten([[a,b],[c,[d]]], R). R = [a, b, c, d]. swi-prolog.org/pldoc/doc/_SWI_/library/… 【参考方案1】:

可以通过以下方式使用 maplist 和 append 来展平列表。

一个两级列表可以如图所示展开。


    ?- A=[["a","b"],["c"]],maplist(append,[A],[B]).
    A = [["a", "b"], ["c"]],
    B = ["a", "b", "c"].

一个三级可以通过命令的两次传递来展平。


    ?- A=[[["a","b"]],[["c"]]],maplist(append,[A],[B]),maplist(append,[B],[C]).
    A = [[["a", "b"]], [["c"]]],
    B = [["a", "b"], ["c"]],
    C = ["a", "b", "c"].

列表中的两个和三个级别的混合会导致两次执行命令时出错。


    ?- A=[[["a","b"]],[["c"]],["d"]],maplist(append,[A],[B]),maplist(append,[B],[C]).
    false.

列表中的两个和三个级别的混合只能通过一次命令进行部分展平。


    ?- A=[[["a","b"]],[["c"]],["d"]],maplist(append,[A],[B]).
    A = [[["a", "b"]], [["c"]], ["d"]],
    B = [["a", "b"], ["c"], "d"].

【讨论】:

这不是扁平化 a 列表,而是扁平化一个非常具体的列表。 这是一个糟糕的答案,但既然你自己回答了,我想知道你是否真的想要任何帮助。您似乎需要帮助,但这是一个不同的话题。 也可以使用自定义谓词 foldr 来部分展平列表,如下: foldr(Function,A,L,B):- reverse(A,C),foldl(Function,C,L ,B),!。和 foldr(append,A,[],B)。

以上是关于Prolog中的展平列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Prolog 中的前缀

展平内部列表而不更改python中的外部列表

在Prolog中展平列表

列表替换中的 Prolog 元素

Prolog中的列表练习列表

Prolog DCG中的可选项或重复项