Обработка списков - Prolog (226647)

Узнай цену своей работы

Формулировка задачи:

Даны два непустых списка целых чисел L1 и L2. Создать программу, которая строит список L3, содержащий все различные пары [X1, X2], в которых X1 - элемент L1, расположенный на нечетном месте, X2 - элемент L2, и разность X1 и X2 равна 1. Запрос: R(L1, L2, L3). Не могу сделать данное задание. Не получается объединять элементы из каждого списка в общий 3й список. Пока вот что есть(просто выводит элементы, которые подходят по условию):
Также есть функция, которая добавляет элемент в конец списка:
Я понимаю, что нужно их объединить, но не могу сделать это.

Решение задачи: «Обработка списков»

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. Код содержит следующие элементы:

  1. Определение доменов:
    • int = integer (целое число)
    • intl = int* (список целых чисел)
    • intll = intl* (список списков целых чисел)
  2. Определение предикатов:
    • 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)
  3. Определение задач:
    • Задача task(intl,intl,intll) принимает на вход три списка: X, Y, R.
      • Выполняется проверка на нечетность позиции элемента в списке X с помощью предиката odd_pos.
      • Создается новый список Y с помощью предиката cart, который объединяет элементы списка X и Y, при этом сохраняя только нечетные позиции элементов списка X.
      • Далее, с помощью предиката filter, из полученного списка Y удаляются все элементы, которые находятся на четной позиции.
      • Затем, с помощью предиката uniq, из полученного списка R удаляются все повторяющиеся элементы.
  4. Основная логика кода:
    • В основной части кода выполняется следующая последовательность действий:
      • Создается список X с произвольными значениями.
      • Выполняется рекурсивный вызов функции task, передавая в нее список X, Y и R.
      • В результате выполнения функции task, в переменной R будет содержаться список, отфильтрованный по нечетным позициям и без повторяющихся элементов. Список действий:
  5. Определение доменов и предикатов.
  6. Определение задачи task(intl,intl,intll).
  7. Основная логика кода:
    • Создание списка X.
    • Вызов функции task(X,Y,R).
    • Получение результата в переменной R.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.2 из 5