Вы можете описать это отношение одним предикатом, назовем его lists_pairs/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] ;
.
.
.