将列表列表展平为单个列表

时间:2018-04-28 20:27:47

标签: prolog

尝试将列表列表展平为单个列表,并进行以下修改。最低级别列表应合并为一个结果列表项,并应在它们之间添加破折号。您可以从以下内容中看到更多内容:

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)一样工作。

1 个答案:

答案 0 :(得分:4)

您实际上可以使用单个谓词来描述这种关系,我们称之为lists_pairs/2。有两种情况需要解决:

  1. 如果列表清单为空,那么对的列表也是空的。

  2. 如果第一个列表的头部格式为[[A],[B]],则第二个列表的头部为A-B,并且该列表的尾部也必须保持关系。

  3. 你可以在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] ;
    .
    .
    .