Задача на создание списка из двух списков на SWI-prolog

Дано два списка A, B [[a1, b1], [a2, b2],...]. Создать список С. например: А = [1, 2, 3], B = [4, 5, 6], C = [[1, 4], [2, 3], [3, 6]]. Пожалуйста помогите, не знаю, как сделать правильно это задание. Вот что у меня есть для начала: concat([], B, B). concat([X|A], B, [X|C]):- concat(A, B, C).


Ответы (1 шт):

Автор решения: Sergei Zhilinski

Задание достаточно простое, но требует понимание списков.

Вот мой вариант:

my_union([],[],[]). % Если оба списка пустые - возвращаем пустое место. Данный вызов только на случай если мы вызываем предикат с двумя пустыми списками.

my_union([A],[],[A,[]]). % Если в одном списке остался последний элемент, а второй списко пуст - то возвращаем пару из элемента и пустового множества

my_union([],[A],[[],A]). %аналогично предыдущему, но списки поменяны местами
 % ешё два аналогичных предиката, но случай если один из списков будет гораздо длиннее другого. 
my_union([A|Resta],[],[[A,[]]|Result]):-
    my_union(Resta,[],Result).  
    
my_union([],[A|Resta],[[[],A]|Result]):-
    my_union([],Resta,Result).  

my_union([A|Resta],[B|Restb],[[A,B]|Result]):-
    my_union(Resta,Restb,Result). %основной предикат. Берём первые два элемента из обоих списков и возвращаем список, где они образуют пару на первом месте результирующего списка, а остальной список вызываем рекурсивно.

Можно ещё написать по-другому, добавив проверку на равенство длин список перед вызовом основного предиката, но лично я предпочитаю данный вариант из-за его гибкости.

Ну и если вы изучаете пролог в этом семестре, то рекомендую тщательней изучить свойства списков, это поможет для написания рекурсивных предикатов и будет большим подспорьем в будущем.

Ну и результаты тестов: ?- my_union([],[],Result). Result = [] .

?- my_union([a,b,c],[a,b,c],Result). Result = [[a, a], [b, b], [c, c]] .

?- my_union([a,b,c,d],[a,b,c],Result). Result = [[a, a], [b, b], [c, c], d, []] .

?- my_union([a,b,c],[a,b,c,d,e],Result). Result = [[a, a], [b, b], [c, c], [[], d], [], e] ;

→ Ссылка