Prolog相当于haskell concat

时间:2018-04-23 14:14:54

标签: list prolog concat

我正在尝试在prolog中找到haskell concat的等价物。

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

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

3 个答案:

答案 0 :(得分:4)

您的示例与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:< / p>

?- 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]].

答案 1 :(得分:3)

您可以使用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]]

答案 2 :(得分:1)

另一种方式

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

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