Скачиваний:
201
Добавлен:
17.06.2016
Размер:
2.69 Mб
Скачать

Детерминизм и отсечение.

Если бы предикат friend, определенный в предыдущей программе, не со-

держал отсечений, то это был бы недетерминированный предикат (предикат,

способный произвести множественные решения при помощи поиска с возвра-

том). Во многих реализациях Пролога программисты должны быть особенно

внимательными с недетерминированными предложениями из-за сопутствующих им

дополнительных требований к ресурсам памяти во время работы программы.

Однако Турбо Пролог выполняет проверку на недетерминированные предложе-

ния, облегчая ваше бремя программиста.

Тем не менее, в целях отладки (а также в других целях), может ока-

заться необходимым ваше вмешательство; для этого существует директива

компилятора check_determ. Если вставить эту директиву в самое начало

программы, то Турбо Пролог будет выдавать предупреждение в случае обнару-

жения недетерминированных предложений в процессе компиляции. Нажатие фун-

кциональной клавиши F10 вызывает игнорирование этого предупреждения, в то

время как нажатие любой другой клавиши приводит к прекращению компиляции.

Вы можете превратить недетерминированные предложения в детерминиро-

ванные, вставляя отсечения в тело правил, определяющих данный предикат.

Например, помещение отсечений в предложения, определяющие предикат

friend, делает этот предикат детерминированным, поскольку с этими отсече-

ниями обращение к friend может возвратить одно и только одно решение.

Пример, использующий отсечение

Этот пример демонстрирует, как можно эффективно использовать отсече-

ние для управления поиска с возвратом при попытке Турбо Пролога согласо-

вать целевое утверждение.

Этот пример ипользует систему управления окнами Турбо Пролога. Пре-

дикаты управления окнами поименованы так, что легко понять их назначение.

Если вы хотите получить больше информации о предикатах управления окнами,

обратитесь к главе 14, "Окна в вашей программе".

/* Program CH05EX09.PRO - использование отсечения

для эффективного управления программой */

predicates

repeat

action(integer,string)

test(string)

goal

makewindow(1,7,7,"interaction window",0,2,10,45),

repeat,

shiftwindow(1),

clearwindow,

write("0. Enter 0 to end\n"),

write("1. Enter 1 to create a window and input\n

a new string\n"),

write("2. Enter 2 to remove the window and text\n"),

write("3. Enter 3 to write to existing window\n\n"),

write("Selection? "),

readint(Int),n1,

action(Int,Text),

Int = 0,!, /* Это отсечение предотвратит поиск с

возвратом, даже если вы не создали строки */

test(Text).

clauses

action(0,"EXIT"):-!, /* Это отсечение предотвращает просмотр

Турбо Прологом других опций */

exit.

action(1,Str):-

existwindow(2),

write("You have a window that already exists.\n"),

write("Do you wish to clear it.(y/n) "),

readchar(Ans),!,

Ans='y', /* Если вы ответите "yes" на вопрос, то это

отсечение предотвратит поиск с возвратом

ко второму предложению action(1) . */

n1,

shiftwindow(2),

clearwindow,

write("Enter your string\n"),

readln(Str).

action(1,Str):-!, /* Это отсечение предотвращает просмотр

Турбо Прологом других опций */

n1,

makewindow(2,7,7," simple window control ",12,3,12,40),

write("Enter your string\n"),

readln(Str).

action(2,"window removed"):-

existwindow(2),

!, /* Если окно было введено, это отсечение предотвратит

выполнение второго предложения action(2) */

shiftwindow(2),

removewindow,

clearwindow.

action(2,"ERROR"):-!,

clearwindow,

write("You must first create a window\n"),

write("Press any key to continue "),

readchar(_).

action(3,Str):-

existwindow(2),!,

shiftwindow(2),

clearwindow,

write("Enter your string\n"),

readln(Str).

action(3,Str):- !,

write("There is no window. Do you\n"),

write("want to create one?(y/n) "),

readchar(ANS),

ANS='y',n1,

makewindow(2,7,7," simple window control ",12,3,12,40),

write("Enter your string\n"),

readln(Str).

action(_,"ERROR"):-

write("Not a valid option\n"),

write("Press any key to continue").

test(Text):-

write(Text).

repeat.

repeat:-repeat.

Соседние файлы в папке Документация