Работа со списками и приближение к числу - Prolog

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

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

Всем привет! Напишите предикат p(+X, +Y, +Q, -S) : X - [x1,x2,...,xn] и Y - [y1,y2,...,ym] - упорядоченные по возрастанию списки, Q - заданное число; предикат p - истинный т. и т.т., когда S есть сумма вида xi+yj, наиболее близкая к числу Q. Вывод должен быть в виде суммы чисел. Например: 10+20.
Листинг программы
  1. upTest([], _, _, _, S).
  2. upTest([HeadX | X], [HeadY | Y], Num, Result, String):- Last is Num - HeadX - HeadY, test(HeadX, Y, Num, Last, -Result, Q, -String), write("Result "), writeln(Result), upTest(X, [HeadY | Y], Num, Result, Q).
  3.  
  4. test(HeadX, [HeadY | [] ], Num, Last, _, _, Qq):- Last2 is Num - HeadX - HeadY, abs(Last2, Last3), Last > Last3, Qq = HeadX + HeadY.
  5. test(HeadX, [HeadY | [] ], Num, Last, Result, Q, Q):- Last2 is Num - HeadX - HeadY, abs(Last2, Last3), Last =< Last3, Result is Last.
  6. test(HeadX, [HeadY | Y], Num, Last, Result, QQ, _):- Last2 is Num - HeadX - HeadY, abs(Last2, Last3), Last > Last3,
  7. QQ = HeadX + HeadY, test(HeadX, Y, Num, Last3, Result, QQ, _).
  8. test(HeadX, [HeadY | Y], Num, Last, Result, Q, _):- Last2 is Num - HeadX - HeadY, abs(Last2, Last3), Last =< Last3, test(HeadX, Y, Num, Last, Result, Q, _).
Пытался написать, но не получается вернуть параметры в рекурсии. Помогите!!
Желательно на SWI Prolog

Решение задачи: «Работа со списками и приближение к числу»

textual
Листинг программы
  1. ?- findall(D/S=R, p([10, 20, 30, 40, 50, 1, 2, 3], [11, 22, 33, 44, 55, 45, 41], 88, D, S, R), L).
  2. L = [3/85=30+55, 3/85=40+45, 3/91=50+41].

Объяснение кода листинга программы

  1. Задача кода - найти все возможные значения выражения D/S=R, где D, S и R являются числами, а выражение D/S=R является верным.
  2. Входные данные: список чисел [10, 20, 30, 40, 50, 1, 2, 3] и список чисел [11, 22, 33, 44, 55, 45, 41].
  3. Выходные данные: список результатов, где каждый результат состоит из трех элементов: D, S и R.
  4. Код использует функцию findall/9 для поиска всех возможных значений выражения D/S=R.
  5. Аргументы функции findall/9:
    • D/S=R - выражение, которое нужно проверить.
    • [10, 20, 30, 40, 50, 1, 2, 3] - первый список чисел.
    • [11, 22, 33, 44, 55, 45, 41] - второй список чисел.
    • 88 - значение переменной R.
    • L - результат, который будет заполнен найденными значениями выражения D/S=R.
  6. Функция findall/9 использует вложенные циклы для перебора всех возможных значений D и S.
  7. В каждой итерации вложенных циклов, функция проверяет условие D/S=R.
  8. Если условие выполняется, то функция добавляет значения D, S и R в список L.
  9. Результат работы кода: список L = [3/85=30+55, 3/85=40+45, 3/91=50+41].

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


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

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

9   голосов , оценка 3.889 из 5

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

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

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