Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Еламан_II.docx
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
67 Кб
Скачать
☆

37) Основные понятия Пролога – отсечения

В данной ситуации нам пригодится встроенный предикат, который по-английски называется cut, по-русски - отсечение, а в программе на Прологе он обозначается восклицательным знаком " !". Этот предикат предназначен для ограничения пространства поиска, с целью повышения эффективности работы программ. Он всегда завершается успешно. После того, как до него дошла очередь, он устанавливает "забор", который не дает "откатиться назад", чтобы выбрать альтернативные решения для уже "сработавших" подцелей. То есть для тех, которые расположены левее отсечения. На цели, расположенные правее, отсечение не влияет. Кроме того, отсечение отбрасывает все предложения процедуры, расположенные после предложения, в котором находится отсечение .

С использованием отсечения наше решение будет еще короче:

max2(X,Y,X):-

X>Y,!./* если первое число больше второго,

то первое число - максимум */

max2(_,Y,Y). /* в противном случае максимумом будет

второе число */

В случае, если сработает отсечение, а это возможно, только если окажется истинным условие X>Y, Пролог-система не будет рассматривать альтернативное второе предложение. Второе предложение "сработает" только в случае, если условие оказалось ложным. В этой ситуации в третий аргумент попадет то же значение, которое находилось во втором аргументе. Обратите внимание, что в этом случае нам уже не важно, чему равнялся первый аргумент, и его можно заменить анонимной переменной.

Все случаи применения отсечения принято разделять на "зеленые" и "красные". Зелеными называются те из них, при отбрасывании которых программа продолжает выдавать те же решения, что и при наличии отсечения. Если же при устранении отсечений программа начинает выдавать неправильные решения, то такие отсечения называются красными.

Пример "красного" отсечения имеется в реализации предиката max2 (если убрать отсечение, предикат будет выдавать в качестве максимума второе число, даже если оно меньше первого). Пример "зеленого" отсечения можно получить, если в запись предикатаmax добавить отсечения (при их наличии предикат будет выдавать те же решения, что и без них).

В принципе, с помощью отсечения в Прологе можно смоделировать такую конструкцию императивных языков, как ветвление.

Процедура

S:-

<условие>,!,P.

S :-

P2.

будет соответствовать оператору if <условие> then P else P2, то есть если условие имеет место, то выполнить P, иначе выполнить P2. Например, в случае с максимумом, можно расшифровать нашу процедуру как "если X>Y, то M=X, иначе M=Y ".

43) Метод поиска в глубину

При решении многих задач, касающихся ориентированных графов, необходим эффективный метод систематического обхода вершин и дуг орграфов. Таким методом является метод поиск в глубину. Метод поиска в глубину является основой многих эффективных алгоритмов работы с графами. Предположим, что есть ориентированный граф  , в котором первоначально все вершины помечены меткой "   ". Поиск в глубину начинается с выбора начальной вершины   орграфа  , для этой вершины метка "   " меняется на метку "   ". Затем для каждой вершины, смежной с вершиной   и не посещаемой раньше, рекурсивно применяется поиск в глубину. Когда все вершины, которых можно достичь из вершины  , будут рассмотрены, поиск заканчивается. Если некоторые вершины остались не посещенными, то выбирается одна из них и алгоритм повторяется. Этот процесс продолжается до тех пор, пока не будут обойдены все вершины орграфа  .

Метод получил свое название - поиск в глубину, поскольку поиск не посещенных вершин идет в направлении вглубь до тех пор, пока это возможно. Например, пусть   является последней посещенной нами вершиной. Выбираем очередную дугу  (ребро), выходящую из вершины  . Возможна следующая альтернатива: вершина   помечена меткой "   ";вершина   помечена меткой "   ". Если вершина   уже посещалась, то отыскивается другая вершина, смежная с вершиной   ; иначе вершина   метится меткой "   " и поиск начинается заново от вершины  . Пройдя все пути, которые начинаются в вершине  , возвращаемся в вершину  , то есть в ту вершину, из которой впервые была достигнута вершина  . Затем процесс повторяется, то есть продолжается выбор нерассмотренных дуг, исходящих из вершины  , и так до тех пор, пока не будут исчерпаны все эти дуги.