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

Возврат вычисленного значения.

Как и процедуры Паскаля, правила и факты Пролога могут возвращать

информацию в цель, которая вызывает их. Это делается путем связывания пе-

ременных, которые были ранее не связанными. Факт

любит(билл,синди).

возвращает информацию в цель

любит(билл,Кого).

путем присваивания переменной Кого значения синди.

Правило может возвращать тем же способом результат вычислений. Здесь

приведен простой пример:

/* программа CH05EX15.PRO */

predicates

classify(integer,symbol)

clauses

classify(0,zero).

classify(X,negative) :- X<0.

classify(X,positive) :- X>0.

Певый аргумент classyfy должен всегда получать константу или связан-

ную переменную. Второй аргумент может быть связанной или свободной пере-

менной, он сопоставляется с символам zero, negative, pozitive в зависи-

мости от значения первого аргумента.

Здесь приведены несколько примеров правил которые могут возвращать

значения:

1. Вы можете узнать положительно ли 45, спросив:

Goal: classify(45,positive).

Yes

Так как 45 больше 0, только третье предложение classify может быть

успешным. Для того, чтобы сделать это, оно сопоставляет второй аргу-

мент с positive. Но второй аргумент уже равен positive, поэтому со-

поставление успешно, и вы получаете ответ Yes (да).

2. Наоборот, если сопоставление неуспешно, вы получаете ответ No

(нет).

Goal: classify(45,negative).

No

Что происходит при этом:

# Пролог проверяет первое предложение, но первый аргумент не равен 0

(а также второй не равен zero)

# Затем он проверяет второе предложение, означив Х 45, но проверка

45 < 0 неуспешна

# После этого он проверяет третье предложение, но в этот раз второй

аргумент не совпадает.

3. Для получения правильного ответа, а не Да или Нет, вы должны выз-

вать classify со свободным вторым аргументом.

Goal : classify(45,What).

What=positive

1 solution(s)

Что реально происходит в этом случае:

а. Цель classify(45,What) не сопоставляется с заголовком первого

предложения, так как 45 не сопоставляется с 0.

б. Опять, цель classify(45,What) сопоставляется с заголовком следую-

щего предложения, classify(X,negative), связывая Х с 45 и negative с

What. Но затем текст Х<0 неуспешен, так как Х равен 45 и неверно,

что 45<0, поэтому Пролог возвращается из этого предложения, освобож-

дая созданные связи.

в. Наконец, classify(45,What) сопоставляется с classify(X,

positive), связывая Х и 45 и What и positive, текст Х>0 правилен.

Так как это успешное решение, Пролог не выполняет поиск с возвратом;

он возвращается в вызывающую процедуру (которая в данном случае -

цель, которую вы задали). И так как переменная Х принадлежит к вызы-

вающей процедуре, эта процедура может использовать ее значение - в

данном случае автоматически напечатать ее значение.

Обзор.

В этой главе мы обсудили унификацию, поиск с возвратом, детерминизм,

предикаты not и fail, и cut (!), мы просмотрели важные части обучающей

информации до этого пункта с процедурной точки зрения.

1. Факты и правила Пролога получают информацию при вызове с аргумен-

тами, которые могут быть константами или связанными переменными; они

возвращают информацию в вызывающую процедуру путем означивания аргу-

ментов, которые являются несвязанными переменными.

2. Унификация это процесс сопоставления двух предикатов и присваива-

ния свободным переменным значений для того, чтобы сделать предикаты

идентичными. Этот механизм необходим так как Пролог может определить

какое предложение вызвать и присвоить значения переменным. В этой

главе представлены важные моменты, связанные с сопоставлением (уни-

фикацией).

а. Когда Пролог начинает попытки достичь цель, он начинает поиск

с начала программы.

б. Когда делается новый вызов, поиск для сопоставления также на-

чинается с начала программы.

в. Когда вызов завершается успехом, происходит возврат, и делает-

ся попытка доказать следующую подцель.

г. Если переменная была связана в предложении, единственный спо-

соб сделать ее снова свободной - это поиск с возвратом.

3. Поиск с возвратом - это механизм который указывает Прологу, где

искать решения для программы. Этот процесс дает Прологу возможность

перебрать все известные факты и правила для решения. В этой главе

даны четыре основных принципа поиска с возвратом:

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

б. Предикатные предложения проверяются в том порядке, в котором

они появляются в программе, сверху-вниз.

в. Когда подцель сопоставляется с заголовком правила, тело этого

правила должно после этого быть доказано. Тело правила состоит из

новых подцелей, которые должны быть доказаны.

г. Цель доказана, когда соответствующие факты найдены для каждой

листьевой вершины дерева целей.

4. Вызов, который может дать множество решений недетерминированный,

тогда как вызов, дающий одно и только одно решение - детерминирован-

ный.

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

ческого поиска в программе: это два предиката fail и not, и cut

# Предикат fail всегда дает неуспех, он вызывает поиск с возвра-

том для того, чтобы поискать другое решение.

# Предикат not дает успех, когда связанная с ним подцель не может

быть доказана.

# cut отменяет поиск с возвратом.

6. Очень легко представлять правила Пролога как определения проце-

дур. С процедурной точки зрения, правила могут действовать как пред-

ложения case, представляя собой булевы функции, действовать как опе-

ратор goto, (при использовании cut), и возвращать вычисленные значе-

ния.

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