Листинг 5.4.Программа, использующая cut для того, чтобы сделать процедуру детерминированной

predicates

x(integer)

clauses

x(1):-

!,

write(“a, b, c”),nl.

x(2):-

!,

write(“c”),nl.

x(_):-

Write(“ изучаем предикат cut.”).

Предикат сut позволяет сделать процедуру детерминированной.

Предикат cut предотвращает поиск с возвратом к следующим предложениям. Это отменяет точки отката, увеличивая эффективность выполнения программы. Конструкция очень похожа на switch(case).Для каждой цели существует своя веточка, которая единственная и будет работать при совпадении цели с головой именно этой веточки.

Обратите внимание: условие проверки записывается в заголовке правила(x(1), x(2) и так далее, а не в теле: x(Y):- Y=1,!,a, b, c.)- это увеличивает эффективность работы программы и упрощает чтение.

Использование зеленых и красных отсечений

Отсечения бывают зеленыеи красные.

Листинг 5.5. Использования зеленого отсечения в

Задаче нахождения минимума двух чисел

predicates

minimum(real,real,real)

clauses

minimum(X,Y,X):-

X<=Y,!.

minimum(X,Y,Y):-

X >Y,!.

goal: minimum(3,5,Min)

Min=3

goal: minimum(6,5,Min)

Min=5

-При выполнении одной арифметической проверки оказывается невозможным выполнение другой проверки. Отсечение, содержащееся в этой программе, отображает детерминированный характер ее. Это значит, что для каждой доказуемой цели к ее доказательству ведет применение лишь одного правила программы. Отсечение фиксирует выбор такого правила.

-Отбрасывает часть пространства поиска. Сведения, зафиксированные при отсечении, используются для сокращения дерева поиска, что уменьшает выполняемый путь обхода дерева и экономит время выполнения программы а также уменьшает объем используемой памяти.

Здесь имели место зеленые отсечения, то есть такие, добавление которых в программу не влияло на декларативный ее характер (Можно найти все решения, убирая заведомо лишние части дерева, которые все равно бы не привели к новым решениям. Удаление зеленого отсечения также не влияет на решения программы)

Замечание: программы с отсечением менее гибкие, чем без отсечения. Но если предполагается использовать программу только одним способом, то это не существенно.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: