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

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

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

Даны два непустых списка целых чисел L1 и L2. Создать программу, которая строит список L3, содержащий все различные пары [X1, X2], в которых X1 - элемент L1, расположенный на нечетном месте, X2 - элемент L2, и разность X1 и X2 равна 1. Запрос: R(L1, L2, L3). Не могу сделать данное задание. Не получается объединять элементы из каждого списка в общий 3й список. Пока вот что есть(просто выводит элементы, которые подходят по условию):
Листинг программы
  1. r([A,_|T1],[B|T2],L):-((A-B)=:=1;(B-A)=:=1),print(A),tab(1),print(B),tab(1),r(T1,T2,L).
  2. r([A,_|T1],[B|T2],L):-(A-B)=\=1,(B-A)=\=1,r(T1,T2,L).
Также есть функция, которая добавляет элемент в конец списка:
Листинг программы
  1. add([],X,[X]).
  2. add([H|T],X,[H|Res]):-add(T,X,Res).
Я понимаю, что нужно их объединить, но не могу сделать это.

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

textual
Листинг программы
  1. domains
  2. int=integer
  3. intl=int*
  4. intll=intl*
  5.  
  6. predicates
  7.  
  8. plist(int,intl,intll)
  9. cart(intl,intl,intll)
  10. append(intll,intll,intll)
  11. odd_pos(intl,intl)
  12. filter(intll,intll)
  13. cmpl(intl,intl)
  14. delall(intll,intl,intll)
  15. uniq(intll,intll)
  16. task(intl,intl,intll)
  17.  
  18. clauses
  19.  
  20. plist(_,[],[]).
  21. plist(X,[H|T],[[X,H]|Z]) :- plist(X,T,Z).
  22.  
  23. append([],X,X).
  24. append([H|T],X,[H|Y]) :- append(T,X,Y).
  25.  
  26. cart([],_,[]).
  27. cart([H|T],Y,Z) :- plist(H,Y,R), cart(T,Y,ZZ), append(R,ZZ,Z).
  28.  
  29. odd_pos([],[]).
  30. odd_pos([H],[H]).
  31. odd_pos([H,_|T],[H|Z]) :- odd_pos(T,Z).
  32.  
  33. filter([],[]).
  34. filter([[H1,H2]|T],[[H1,H2]|Z]) :- filter(T,Z), abs(H1-H2)=1.
  35. filter([[H1,H2]|T],Z) :- filter(T,Z), abs(H1-H2)<>1.
  36.  
  37. cmpl([H1,H2],[H1,H2]).
  38.  
  39. delall([],_,[]).
  40. delall([H|T],H,Z) :- delall(T,H,Z).
  41. delall([U|T],H,[U|Z]) :- not(cmpl(H,U)), delall(T,H,Z).
  42.  
  43. uniq([],[]).  
  44. uniq([H|T],[H|Z]) :- delall(T,H,TT), uniq(TT,Z).
  45.  
  46. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут