Предикат range(?M, ?N, ?L), истинный тогда и только тогда, когда L - список целых чисел - Prolog

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

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

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

Решение задачи: «Предикат range(?M, ?N, ?L), истинный тогда и только тогда, когда L - список целых чисел»

textual
Листинг программы
  1. range(M, N, L) :-
  2.   nonvar(L),
  3.   !,
  4.   sort(L, LL),
  5.   range_sorted(M, N, LL).
  6. range(M, N, L) :-
  7.   range_sorted(M, N, LL),
  8.   permutation(LL, L).
  9.  
  10. range_sorted(N,N,[N]).
  11. range_sorted(M,N,[M|T]):-
  12.   (nonvar(T),!; M < N),
  13.   MM is M + 1,
  14.   range_sorted(MM, N, T).

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

  1. range(M, N, L) - это определение предиката, который будет проверять, является ли список L последовательностью чисел от M до N.
  2. Предикат range имеет три аргумента: M - начало диапазона, N - конец диапазона, L - список чисел.
  3. Если список L уже не является переменным (то есть был определен), то мы пропускаем первые два шага и переходим к шагу 5.
  4. С помощью sort(L, LL) сортируем список L в порядке возрастания и сохраняем результат в переменной LL.
  5. Если список L уже отсортирован (то есть LL равен L), то мы пропускаем следующие два шага и переходим к шагу 7.
  6. В противном случае, мы рекурсивно вызываем range_sorted(M, N, LL), чтобы отсортировать список L и сохранить результат в LL.
  7. С помощью permutation(LL, L) мы переупорядочиваем элементы списка LL в порядке убывания и сохраняем результат в переменной L.
  8. Если M равно N (то есть диапазон пуст), то мы добавляем N в список L и завершаем рекурсию.
  9. Если M меньше N, то мы рекурсивно вызываем range_sorted(M+1, N, T), где T - это результат вызова range_sorted(M, N, LL) на предыдущем шаге.
  10. Мы сохраняем результат вызова range_sorted(M, N, T) в переменной LL.
  11. С помощью permutation(LL, L) мы переупорядочиваем элементы списка LL в порядок убывания и сохраняем результат в переменной L.
  12. Мы возвращаем L как результат вызова предиката range(M, N, L).

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


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

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

12   голосов , оценка 4.083 из 5

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

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

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