List haskell-concat的Prolog等价物

List haskell-concat的Prolog等价物,list,prolog,concat,List,Prolog,Concat,我试图在prolog中找到haskell的concat的等价物 例如,让我们有这样一个列表:[[[a]、[b]、[[c]、[d]]] 我需要将这个列表连接到这样的列表中[[a,b],[c,d]]。到目前为止,我已经尝试了一些带有append的代码,但我想不出正确的解决方案。您可以使用flant/2和append/3解决此问题,方法如下: my_concat([],L,L). my_concat([H|T],LT,LO):- flatten(H,H1), append(LT,[H1

我试图在prolog中找到haskell的
concat
的等价物

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


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

您可以使用
flant/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
追加/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).
另一种方式

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]]
?- append([[[a],[b]],[[c],[d]]], Flattened).
Flattened = [[a], [b], [c], [d]].
要执行所需操作,需要将
concat
映射到输入列表中的各个列表上:

Prelude> map concat [[[1],[2]],[[3],[4]]]
[[1,2],[3,4]]
在SWI Prolog中,您有与Haskell的
concat
相对应的
append/2
(两个参数,而不是更常见的
append/3
的三个参数):

Prelude> concat [[[1],[2]],[[3],[4]]]
[[1],[2],[3],[4]]
?- append([[[a],[b]],[[c],[d]]], Flattened).
Flattened = [[a], [b], [c], [d]].
在SWI Prolog中,还有一系列与Haskell的
映射相对应的
映射列表/N
谓词:

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

您的示例与Haskell的concat的正常行为不匹配:

Prelude> concat [[[1],[2]],[[3],[4]]]
[[1],[2],[3],[4]]
?- append([[[a],[b]],[[c],[d]]], Flattened).
Flattened = [[a], [b], [c], [d]].
要执行所需操作,需要将
concat
映射到输入列表中的各个列表上:

Prelude> map concat [[[1],[2]],[[3],[4]]]
[[1,2],[3,4]]
在SWI Prolog中,您有与Haskell的
concat
相对应的
append/2
(两个参数,而不是更常见的
append/3
的三个参数):

Prelude> concat [[[1],[2]],[[3],[4]]]
[[1],[2],[3],[4]]
?- append([[[a],[b]],[[c],[d]]], Flattened).
Flattened = [[a], [b], [c], [d]].
在SWI Prolog中,还有一系列与Haskell的
映射相对应的
映射列表/N
谓词:

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