Предикат range(?M, ?N, ?L), истинный тогда и только тогда, когда L - список целых чисел - Prolog
Формулировка задачи:
Доброго времени суток.
Помогите, пожалуйста со следующей задачей:
Напишите предикат range(?M, ?N, ?L), истинный тогда и только тогда, когда L - список целых чисел, расположенных между M и N включительно (предикат должен допускать различное использование, когда не менее двух из трех аргументов конкрети-зованы). Указание. Используйте предикаты var(+X) и nonvar(+X).
В чем суть: у меня получилось написать код, в тех случаях когда все 3 параметра конкретизированы и когда конкретизированы только N и L. помогите разобраться с остальными двумя случаями. Заранее спасибо.
Листинг программы
- range(N,N,[N]).
- range(M,_,[H|_]):- M is H,!.
- range(M,N,[H|T]):- H >= M , H =< N, H1 is H + 1, range(H1,N,T).
Решение задачи: «Предикат 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)
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д