Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программы классификации 49 9 Программа классифи...doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
944.13 Кб
Скачать

1.2. Организация вычислительного процесса

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

А :– В1, В2, ... , Вn. ,

которая интерпретируется : "А является истинным, если В1, В2, ..., Вn являются истинными". Таким образом, значок “ :- “ соответствует обозначению «если». Предикат, содержащий условия истинности, является правилом. Когда n=0, т.е. говорят, что отсутствуют условия истинности, то такое предложение выражает факт, и это записывается "А." (точка в конце записи предиката обязательна). Поскольку факт не содержит условий истинности, в Прологе факт всегда является истинным.

В данной форме записи часть выражения, стоящая слева от знака “ :- “, называется головой дизъюнкта (в нашем примере "А"), а выражение, стоящее после этого значка, называется телом дизъюнкта, т.е. В1, В2, ... , Вn – это тело, или хвост дизъюнкта.

Пролог-программа должна иметь цель, поскольку вычисление такой программы всегда начинается от цели. Достичь цели всегда означает, что она логически следует из правил программы. Можно рассматривать программу как запись аксиом, а цель – теорему, которую следует доказать. Если получен запрос (т.е. цель, которую нужно удовлетворить), Пролог пытается определить его истинность двумя способами. Во-первых, цель успешно удовлетворяется (т.е. считается истинной), если она сопоставляется с существующим фактом (так как факты всегда являются истинными). Во-вторых, цель считается истинной, если она сопоставляется с головой “А” правила " А, если В1, ... , Вn " и если подцели В1, ... , Вn могут быть завершены успешно. В случае успешного сопоставления Пролог выдает ответ "yes", т.е. цель согласована. Термин «сопоставление» обозначает совпадение цели с головой факта или правила и относится к одному из двух базовых механизмов логического вывода. Другой базовой операцией является унификация.

Унификация она применяется в том случае, если предикат имеет аргументы.

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

1.2.2. Использование переменных

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

Рассмотрим вышеприведенный пример:

родитель(«царь Петр I», «царевич Алексей»).

Спросим эту небольшую программу, чьим родителем является царь Петр I:

? родитель( «царь Петр I», X ).

Чтобы ответить на вопрос, нужно вместо X подставит константу «царевич Алексей». В этом случае переменная X конкретизируется константой. В этом примере имела место унификация. Понятие унификации пришло из математической логики, где ему соответствует подстановка значений вместо переменных при выводе логической формулы. В Прологе унификация представляет собой универсальный механизм сопоставления с образцом для передачи параметров2. В результате унификации переменная Х получила конкретное значение.

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

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

Немного о присваивании. Читатель уже понял, что один из способов придать значение переменной – передать ее как параметр (аргумент) предиката. Другой способ похож на классическое присваивание, поскольку использует знак равенства. Но все-таки следует помнить, что в Прологе нет оператора присваивания, а есть похожий на него предикат логического сравнения, обозначаемый знаком равенства. Поэтому понятно, что сопоставление вида N = N + 1 бессмысленно: величина никогда не может быть равной самой себе, увеличенной на единицу. Надо использовать другую переменную: N1= N + 1, но зато можно записать: N + 1 = N1.

Рассмотрим, как выполняется сопоставление в последнем случае. Пусть N конкретизировано числом 3, N1 – числом 4. В этом случае сопоставление закончится «истинно». Если N конкретизировано тем же числом, а N1 не конкретизировано, то в результате сопоставления N1 получит значение 4, и предикат тоже завершится «истинно». Несложно сообразить, какие конкретизации переменных дадут ложное сопоставление.

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