Предикат 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).