Обработка списков - Prolog (226647)
Формулировка задачи:
Даны два непустых списка целых чисел L1 и L2. Создать программу, которая строит список L3, содержащий все различные пары [X1, X2], в которых X1 - элемент L1, расположенный на нечетном месте, X2 - элемент L2, и разность X1 и X2 равна 1. Запрос: R(L1, L2, L3).
Не могу сделать данное задание. Не получается объединять элементы из каждого списка в общий 3й список. Пока вот что есть(просто выводит элементы, которые подходят по условию):
Также есть функция, которая добавляет элемент в конец списка:
Я понимаю, что нужно их объединить, но не могу сделать это.
Листинг программы
- r([A,_|T1],[B|T2],L):-((A-B)=:=1;(B-A)=:=1),print(A),tab(1),print(B),tab(1),r(T1,T2,L).
- r([A,_|T1],[B|T2],L):-(A-B)=\=1,(B-A)=\=1,r(T1,T2,L).
Листинг программы
- add([],X,[X]).
- add([H|T],X,[H|Res]):-add(T,X,Res).
Решение задачи: «Обработка списков»
textual
Листинг программы
- domains
- int=integer
- intl=int*
- intll=intl*
- predicates
- plist(int,intl,intll)
- cart(intl,intl,intll)
- append(intll,intll,intll)
- odd_pos(intl,intl)
- filter(intll,intll)
- cmpl(intl,intl)
- delall(intll,intl,intll)
- uniq(intll,intll)
- task(intl,intl,intll)
- clauses
- plist(_,[],[]).
- plist(X,[H|T],[[X,H]|Z]) :- plist(X,T,Z).
- append([],X,X).
- append([H|T],X,[H|Y]) :- append(T,X,Y).
- cart([],_,[]).
- cart([H|T],Y,Z) :- plist(H,Y,R), cart(T,Y,ZZ), append(R,ZZ,Z).
- odd_pos([],[]).
- odd_pos([H],[H]).
- odd_pos([H,_|T],[H|Z]) :- odd_pos(T,Z).
- filter([],[]).
- filter([[H1,H2]|T],[[H1,H2]|Z]) :- filter(T,Z), abs(H1-H2)=1.
- filter([[H1,H2]|T],Z) :- filter(T,Z), abs(H1-H2)<>1.
- cmpl([H1,H2],[H1,H2]).
- delall([],_,[]).
- delall([H|T],H,Z) :- delall(T,H,Z).
- delall([U|T],H,[U|Z]) :- not(cmpl(H,U)), delall(T,H,Z).
- uniq([],[]).
- uniq([H|T],[H|Z]) :- delall(T,H,TT), uniq(TT,Z).
- task(X,Y,R) :- odd_pos(X,XX), cart(XX,Y,U), filter(U,RR), uniq(RR,R).
Объяснение кода листинга программы
В данном коде представлена система обработки списков на языке Prolog. Код содержит следующие элементы:
- Определение доменов:
- int = integer (целое число)
- intl = int* (список целых чисел)
- intll = intl* (список списков целых чисел)
- Определение предикатов:
- plist(int,intl,intll)
- cart(intl,intl,intll)
- append(intll,intll,intll)
- odd_pos(intl,intl)
- filter(intll,intll)
- cmpl(intl,intl)
- delall(intll,intl,intll)
- uniq(intll,intll)
- task(intl,intl,intll)
- Определение задач:
- Задача
task(intl,intl,intll)
принимает на вход три списка: X, Y, R.- Выполняется проверка на нечетность позиции элемента в списке X с помощью предиката odd_pos.
- Создается новый список Y с помощью предиката cart, который объединяет элементы списка X и Y, при этом сохраняя только нечетные позиции элементов списка X.
- Далее, с помощью предиката filter, из полученного списка Y удаляются все элементы, которые находятся на четной позиции.
- Затем, с помощью предиката uniq, из полученного списка R удаляются все повторяющиеся элементы.
- Задача
- Основная логика кода:
- В основной части кода выполняется следующая последовательность действий:
- Создается список X с произвольными значениями.
- Выполняется рекурсивный вызов функции task, передавая в нее список X, Y и R.
- В результате выполнения функции task, в переменной R будет содержаться список, отфильтрованный по нечетным позициям и без повторяющихся элементов. Список действий:
- В основной части кода выполняется следующая последовательность действий:
- Определение доменов и предикатов.
- Определение задачи
task(intl,intl,intll)
. - Основная логика кода:
- Создание списка X.
- Вызов функции task(X,Y,R).
- Получение результата в переменной R.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д