Работа со списками и приближение к числу - Prolog
Формулировка задачи:
Всем привет!
Напишите предикат p(+X, +Y, +Q, -S) :
X - [x1,x2,...,xn] и Y - [y1,y2,...,ym] - упорядоченные по возрастанию списки, Q - заданное число; предикат p - истинный т. и т.т., когда S есть сумма вида xi+yj, наиболее близкая к числу Q.
Вывод должен быть в виде суммы чисел. Например: 10+20.
Пытался написать, но не получается вернуть параметры в рекурсии. Помогите!!
Листинг программы
- upTest([], _, _, _, S).
- 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).
- test(HeadX, [HeadY | [] ], Num, Last, _, _, Qq):- Last2 is Num - HeadX - HeadY, abs(Last2, Last3), Last > Last3, Qq = HeadX + HeadY.
- test(HeadX, [HeadY | [] ], Num, Last, Result, Q, Q):- Last2 is Num - HeadX - HeadY, abs(Last2, Last3), Last =< Last3, Result is Last.
- test(HeadX, [HeadY | Y], Num, Last, Result, QQ, _):- Last2 is Num - HeadX - HeadY, abs(Last2, Last3), Last > Last3,
- QQ = HeadX + HeadY, test(HeadX, Y, Num, Last3, Result, QQ, _).
- 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
Листинг программы
- ?- 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).
- L = [3/85=30+55, 3/85=40+45, 3/91=50+41].
Объяснение кода листинга программы
- Задача кода - найти все возможные значения выражения D/S=R, где D, S и R являются числами, а выражение D/S=R является верным.
- Входные данные: список чисел [10, 20, 30, 40, 50, 1, 2, 3] и список чисел [11, 22, 33, 44, 55, 45, 41].
- Выходные данные: список результатов, где каждый результат состоит из трех элементов: D, S и R.
- Код использует функцию findall/9 для поиска всех возможных значений выражения D/S=R.
- Аргументы функции 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.
- Функция findall/9 использует вложенные циклы для перебора всех возможных значений D и S.
- В каждой итерации вложенных циклов, функция проверяет условие D/S=R.
- Если условие выполняется, то функция добавляет значения D, S и R в список L.
- Результат работы кода: список L = [3/85=30+55, 3/85=40+45, 3/91=50+41].
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д