Свести список списков в один список - PullRequest
0 голосов
/ 28 апреля 2018

Попытка свести список списков списков в один список с последующей модификацией. Список самого низкого уровня должен слиться в один элемент результирующего списка, и между ними должна быть добавлена ​​тире. Больше вы можете увидеть из следующего:

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 голосов
/ 29 апреля 2018

Вы можете описать это отношение одним предикатом, назовем его lists_pairs/2. Есть два случая:

  1. Если список списков пуст, то список пар также пуст.

  2. Если заголовок первого списка имеет форму [[A],[B]], тогда заголовок второго списка равен A-B, и отношение должно сохраняться и для хвостов списков.

Вы можете выразить это в Прологе так:

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] ;
.
.
.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...