haskell concat 的 Prolog 等价物

Prolog equivalent for haskell concat

我试图在序言中找到 haskell 的 concat 的等价物。

例如,我们有一个这样的列表:[[[a],[b]],[[c],[d]]].

我需要将此列表连接到这样的列表 [[a,b],[c,d]]。到目前为止,我已经用 append 尝试了一些代码,但我想不出正确的解决方案。

你可以用flatten/2append/3解决这个问题,方法是:

my_concat([],L,L).
my_concat([H|T],LT,LO):-
    flatten(H,H1),
    append(LT,[H1],LT1),
    my_concat(T,LT1,LO).

?- my_concat([[[a],[b]],[[c],[d]]],[],L).
L = [[a, b], [c, d]]

另一种方式

my_concat([X], [FX]):-
   flatten(X,FX).

my_concat([H|T], [FH| FT]):-
   my_concat(T,FT),
   flatten(H,FH).

您的示例与 Haskell 的 concat:

的正常行为不符
Prelude> concat [[[1],[2]],[[3],[4]]]
[[1],[2],[3],[4]]

要执行您想要的操作,您需要将 concat 映射到输入列表中的各个列表:

Prelude> map concat [[[1],[2]],[[3],[4]]]
[[1,2],[3,4]]

在 SWI-Prolog 中你有 append/2(两个参数而不是更常见的 append/3 的三个参数)对应于 Haskell 的 concat

?- append([[[a],[b]],[[c],[d]]], Flattened).
Flattened = [[a], [b], [c], [d]].

并且在 SWI-Prolog 中还有一个 maplist/N 谓词家族对应于 Haskell 的 map:

?- maplist(append, [[[a],[b]],[[c],[d]]], FlattenedButDifferently).
FlattenedButDifferently = [[a, b], [c, d]].