Предикат range(?M, ?N, ?L), истинный тогда и только тогда, когда L - список целых чисел - Prolog
Формулировка задачи:
Доброго времени суток.
Помогите, пожалуйста со следующей задачей:
Напишите предикат range(?M, ?N, ?L), истинный тогда и только тогда, когда L - список целых чисел, расположенных между M и N включительно (предикат должен допускать различное использование, когда не менее двух из трех аргументов конкрети-зованы). Указание. Используйте предикаты var(+X) и nonvar(+X).
В чем суть: у меня получилось написать код, в тех случаях когда все 3 параметра конкретизированы и когда конкретизированы только N и L. помогите разобраться с остальными двумя случаями. Заранее спасибо.
Решение задачи: «Предикат range(?M, ?N, ?L), истинный тогда и только тогда, когда L - список целых чисел»
textual
Листинг программы
range(M, N, L) :- nonvar(L), !, sort(L, LL), range_sorted(M, N, LL). range(M, N, L) :- range_sorted(M, N, LL), permutation(LL, L). range_sorted(N,N,[N]). range_sorted(M,N,[M|T]):- (nonvar(T),!; M < N), MM is M + 1, range_sorted(MM, N, T).
Объяснение кода листинга программы
range(M, N, L)
- это определение предиката, который будет проверять, является ли списокL
последовательностью чисел отM
доN
.- Предикат
range
имеет три аргумента:M
- начало диапазона,N
- конец диапазона,L
- список чисел. - Если список
L
уже не является переменным (то есть был определен), то мы пропускаем первые два шага и переходим к шагу 5. - С помощью
sort(L, LL)
сортируем списокL
в порядке возрастания и сохраняем результат в переменнойLL
. - Если список
L
уже отсортирован (то естьLL
равенL
), то мы пропускаем следующие два шага и переходим к шагу 7. - В противном случае, мы рекурсивно вызываем
range_sorted(M, N, LL)
, чтобы отсортировать списокL
и сохранить результат вLL
. - С помощью
permutation(LL, L)
мы переупорядочиваем элементы спискаLL
в порядке убывания и сохраняем результат в переменнойL
. - Если
M
равноN
(то есть диапазон пуст), то мы добавляемN
в списокL
и завершаем рекурсию. - Если
M
меньшеN
, то мы рекурсивно вызываемrange_sorted(M+1, N, T)
, гдеT
- это результат вызоваrange_sorted(M, N, LL)
на предыдущем шаге. - Мы сохраняем результат вызова
range_sorted(M, N, T)
в переменнойLL
. - С помощью
permutation(LL, L)
мы переупорядочиваем элементы спискаLL
в порядок убывания и сохраняем результат в переменнойL
. - Мы возвращаем
L
как результат вызова предикатаrange(M, N, L)
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д