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

1.2.1. Синтаксис фактов и правил

Для того, чтобы начать писать Пролог-программу, следует определиться, какие отношения (предикаты) в ней будут. Имена предикатов выбираем согласно смыслу программы. В синтаксисе Пролога предикат имеет следующий вид:

functor(d1,d2,...) :– cond1, cond2,... .

Здесь functor – имя предиката;

functor(d1,d2,...) – голова дизъюнкта;

d1, d2,... – аргументы предиката;

cond1, cond2,... – условия истинности дизъюнкта (в свою очередь, предикаты), где запятые обозначают связку “ И ”;

":–" - обозначение "ЕСЛИ".

Важно понимать, что имена предикатов и их размерность («арность») произвольны и зависят только от целей их использования.

Рассмотрим конкретное предложение:

P :- Q, R.

где P, Q, R – некоторые предикаты. Для выяснения истинности P следует сначала выяснить истинность Q, затем истинность R. Таким образом, запятая между целями обозначает конъюнкцию целей. Однако в Прологе возможна и дизъюнкция целей: должна быть истинной по крайней мере, одна из целей. Дизъюнкция обозначается точкой с запятой:

P :- Q; R.

Смысл такого предложения тот же, что и смысл следующей пары предложений:

P :- Q.

P :- R.

Таким образом, логическая функция «ИЛИ» может быть записана двумя способами.

Для обозначения логических связок можно также использовать более привычные: if, and, or, но в этом случае запись программы получится длиннее.

Если опущены условия, то functor(d1,d2,...) описывает факт.

В качестве первого примера рассмотрим следующую задачу. Опишем мир увлечений некоторого круга лиц. Следующим утверждениям на английском языке:

Ellen likes reading.

John likes football.

Tom likes baseball.

Eric likes reading.

Mark likes tennis.

соответствуют факты Пролога:

likes( ellen, reading ).

likes( john, football ).

likes( tom, baseball ).

likes( eric, reading ).

likes( mark, tennis ).

Имена людей записали строчными буквами, чтобы отличить их от имен переменных, которые в Прологе начинаются с прописной буквы. Разумеется, как будет видно далее, в Прологе есть возможность записывать имена как они того заслуживают. Некоторое множество фактов, задающих объекты и отношения между ними, уже образует простую программу на Прологе. Таким образом, вопрос: "Что любит Джон?" сводится к поиску объекта X, который отношение likes (нравится) связывает с Джоном; этот объект и будет служить ответом на запрос:

? likes( john, X ).

X = football.

(В языке PDC Prolog вместо знака вопроса, обозначающего цель, записывается ключевое слово Goal).

Отметим, что при определении отношения между объектами существенен порядок, в котором эти объекты входят в отношение:

likes( john, football ) отличается от likes( football, john ).

Факты – важная часть программы искусственного интеллекта, без них нельзя достичь цели. Можно сказать, что каждая цель опирается на свои факты. После записи фактов обычно следуют правила. Правило всегда выражает некоторый общий закон. Попробуем добавить один такой закон: «Всякий Х, любящий читать – умный». Его запись в виде правила:

clever ( X ) :- likes ( X, reading ).

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

? clever (X).

Система найдет два решения:

X=ellen

X= eric

Правило Пролога можно представить как небольшую процедуру с локальными переменными. Основное отличие такой процедуры от процедуры, написанной на процедурном языке: предикат может выполнять несколько функций, в зависимости от состояния аргументов (конкретизированы они или нет). Одно и то же отношение может быть использовано несколькими способами: если его аргументы известны, то проверяется выполнимость отношения на этих аргументах; если же некоторые аргументы неизвестны. То вычисляется множество наборов значений этих переменных, которые удовлетворяют отношению. Например, если имеется предикат square («площадь»), связывающий длину и высоту геометрической фигуры с третьим значением (например, площадью прямоугольника):

square( A, B, S ),

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

? square( 5, 4, S ),

Можно задавать и другие цели:

? square( X, 4, S ),

? square( X, Y, 20 ).

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