Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Compiler1.doc
Скачиваний:
100
Добавлен:
08.02.2015
Размер:
1.3 Mб
Скачать

Составные вопросы

Пролог умеет отвечать не только на такие примитивные вопросы, какие были приведены выше. Вопросы могут быть сложными, образующими логические выражения. Примером составного вопроса является вопрос вида "кто является родителем родителя?". Для того чтобы задать такой вопрос, определим понятие "родитель родителя" следующим образом.

Некто X является родителем родителя Z, если этот X – родитель некоторого Y, а этот Y является родителем дляZ. Это утверждение может быть записано в виде логического выражения, представляющего коньюнкцию. В Прологе операция И обозначается ключевым словомandлибо запятой:

родитель(X,Y) and родитель (Y,Z)

Найдем родителя и "деда" объекта g:

Тогда наш вопрос может выглядеть так:

?- родитель(X,Y), родитель(Y, g)

Реакция системы на этот вопрос будет заключаться в выдаче значений переменных XиY:

X = c

Y = f

Обратите внимание на то, что наш вопрос мог быть записан и в таком виде:

?- родитель(Y, g), родитель(X,Y)

Результат будет тем же самым, однако, как это будет видно далее, эффективность поиска в этом случае будет выше.

Правила

Введем отношение "отпрыск". Можно изобразить аналогичную вышеприведенной схему отношений и ввести еще 6 предложений-фактов. Однако значительно элегантнее определить отношение "отпрыск" (отношение, противоположное отношению "родитель") следующим образом:

С точки зрения формальной логики понятие "отпрыск" можно определить так:

Для любых X и Y Y является отпрыском X, если X родитель Y.

На Прологе это будет записано в виде следующего предложения:

отпрыск(Y,X) :- родитель(X,Y).

Подобные предложения называются правилами. Правило имеет условную часть (посылку –антецедент) и часть вывода (заключение –консеквент). Если в привычном виде правило записывается как

Если (антецедент) То (консеквент),

то в Прологе правило выглядит иначе – сначала записывается заключение, а затем посылка:

Заключение if Посылка

Посылка в Прологе называется теломправила, а заключение –головойправила.

(Голова) if (Тело)

Например, отношение родитель_родителяможет быть представлено в виде правила

родитель_родителя(X,Z) :- родитель(X,Y), родитель(Y,Z).

А отношение "сестра" может быть определено так:

сестра(X,Y) :-

родитель(Z,X),

родитель(Z,Y),

женщина(X).

Пролог с математической точки зрения

Пролог рассматривает факты и правила в качестве множества аксиом, а вопрос пользователя – как теорему. Пролог пытается доказать эту теорему, т.е. показать, что ее можно логически вывести из аксиом.

Для примера рассмотрим известный силлогизм Аристотеля:

Все люди смертны. Сократ-человек. Следовательно, Сократ смертен

Более формально:

(Все люди смертны = Для любого X: X человек => X смертен)

Х: Х человекХ – смертен

Сократ человек

Сократ смертен

На Прологе это будет выглядеть так:

смертен(X) :- человек(X).

человек(сократ).

?- смертен(сократ)

Да

Формализм языка пролог

Итак, подытожим вышеизложенное. С формальной точки зрения Пролог-программа состоит из предложений. Каждое предложение заканчивается точкой. Предложения Пролога состоят из головы и тела. Тело – список целей, разделенных запятыми. Запятые обозначают операцию конъюнкции.

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

  • Факты содержат утверждения, которые всегда истинны. Факт – это предложение, у которого тело пустое.

  • Правила содержат утверждения, истинность которых зависит от некоторых условий. Имеют голову и непустое тело.

  • С помощью вопросов пользователь спрашивает систему о том, какие утверждения являются истинными. Вопрос – это предложение, состоящее только из тела. Вопросы к системе состоят из одного или более целевых утверждений (целей).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]