我正在尝试在prolog中找到haskell concat
的等价物。
例如,让我们有一个这样的列表:[[[a],[b]],[[c],[d]]]
。
我需要将此列表连接到类似[[a,b],[c,d]]
的列表。到目前为止,我已尝试使用append
的一些代码,但我想不出正确的解决方案。
答案 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/2
和append/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).