【发布时间】:2025-12-12 09:50:01
【问题描述】:
如何在 Prolog 中展平列表,例如:
from A = [["a","b"],["c"]]
to B = ["a", "b", "c"] ?
【问题讨论】:
-
唯一干净的方法是使用
flatten/2。例如,在 SWI-Prolog 中:?- flatten([[a,b],[c,[d]]], R). R = [a, b, c, d].
如何在 Prolog 中展平列表,例如:
from A = [["a","b"],["c"]]
to B = ["a", "b", "c"] ?
【问题讨论】:
flatten/2。例如,在 SWI-Prolog 中:?- flatten([[a,b],[c,[d]]], R). R = [a, b, c, d].
可以通过以下方式使用 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"].
【讨论】: