尝试将列表列表展平为单个列表,并进行以下修改。最低级别列表应合并为一个结果列表项,并应在它们之间添加破折号。您可以从以下内容中看到更多内容:
Input:
L = [[[A],[B]],[[C],[D]],[[E],[F]],[[G],[H]]]
Expected output:
Res = [A-B,C-D,E-F,G-H]
这是我的代码:
toList([],_).
toList([H|T],Out) :-
toList1(H,Out1),
newOut2 = [Out|Out1],
toList(T,newOut2).
toList1([],newOut1).
toList1([[A],[B]],Out1) :-
newOut1 = [A-B],
toList1([],newOut1).
应该像toList([[[A],[B]],[[C],[D]],[[E],[F]],[[G],[H]]], Res)
一样工作。
答案 0 :(得分:4)
您实际上可以使用单个谓词来描述这种关系,我们称之为lists_pairs/2
。有两种情况需要解决:
如果列表清单为空,那么对的列表也是空的。
如果第一个列表的头部格式为[[A],[B]]
,则第二个列表的头部为A-B
,并且该列表的尾部也必须保持关系。
你可以在Prolog中表达这样:
lists_pairs([],[]). % case 1
lists_pairs([[[A],[B]]|Ls],[A-B|Ps]) :- % case 2
lists_pairs(Ls,Ps).
您的示例查询会产生所需的答案:
?- lists_pairs([[[A],[B]],[[C],[D]],[[E],[F]],[[G],[H]]], Res).
Res = [A-B, C-D, E-F, G-H].
您也可以在另一个方向使用此谓词:
?- lists_pairs(L, [A-B, C-D, E-F]).
L = [[[A], [B]], [[C], [D]], [[E], [F]]].
最常见的查询也适用:
?- lists_pairs(L, P).
L = P, P = [] ;
L = [[[_G22], [_G28]]],
P = [_G22-_G28] ;
L = [[[_G22], [_G28]], [[_G43], [_G49]]],
P = [_G22-_G28, _G43-_G49] ;
L = [[[_G22], [_G28]], [[_G43], [_G49]], [[_G64], [_G70]]],
P = [_G22-_G28, _G43-_G49, _G64-_G70] ;
.
.
.