Программирование на языке Пролог для искусственного интеллекта
Шрифт:
Программист может вводить свои собственные операторы. Так, например, можно определить атомы
Эти факты в точности эквивалентны следующим:
Программист определяет новые операторы, вводя в программу особый вид предложений, которые иногда называют директивами. Такие предложения играют роль определений новых операторов. Определение оператора должно появиться в
Такая запись сообщит Прологу, что мы хотим использовать "имеет" в качестве оператора с приоритетом 600 и типом '
Обратите внимание на то, что определения операторов не содержат описания каких-либо операций или действий. В соответствии с принципами языка ни с одним оператором не связывается каких-либо операций над данными (за исключением особых, редких случаев). Операторы обычно используются так же, как и функторы, только для объединения объектов в структуры и не вызывают действия над данными, хотя само слово "оператор", казалось бы, должно подразумевать какое-то действие.
Имена операторов это атомы, а их приоритеты — точнее, номера их приоритетов — должны находиться в некотором диапазоне, зависящем от реализации. Мы будем считать, что этот диапазон располагается в пределах от 1 до 1200. [1]
Существуют три группы типов операторов, обозначаемые спецификаторами, похожими на
(1) инфиксные операторы трех типов:
(2) префиксные операторы двух типов:
1
Чем выше приоритет, тем меньше его номер. — Прим. перев.
(3) постфиксные операторы двух типов:
Спецификаторы выбраны с таким расчетом, чтобы нагляднее отразить структуру выражения, в котором '
Рис. op3.7. Две интерпретации выражения
Между '
Такие
обычно понимается как
В качестве еще одного примера рассмотрим оператор
записано верно; однако, если
Рис. 3.8. Множество предопределенных операторов.
Для удобства некоторые операторы в пролог-системах определены заранее, чтобы ими можно было пользоваться сразу, без какого-либо определения их в программе. Набор таких операторов и их приоритеты зависят от реализации. Мы будем предполагать, что множество этих "стандартных" операторов ведет себя так, как если бы оно было определено с помощью предложений, приведенных на рис. 3.8. Как видно из того же рисунка, несколько операторов могут быть определены в одном предложении, если только они все имеют одинаковый приоритет и тип. В этом случае имена операторов записываются в виде списка. Использование операторов может значительно повысить наглядность, "читабельность" программы. Для примера предположим, что мы пишем программу для обработки булевских выражений. В такой программе мы, возможно, захотим записать утверждение одной из теорем де Моргана, которое в математических обозначениях записывается так:
Приведем один из способов записи этого утверждения в виде прологовского предложения:
Однако хорошим стилем программирования было бы попытаться сохранить по возможности больше сходства между видом записи исходной задачи и видом, используемом в программе ее решения. В нашем примере этого можно достичь почти в полной мере, применив операторы. Подходящее множество операторов для наших целей можно определить так:
Теперь правило де Моргана можно записать в виде следующего факта:
В соответствии с нашими определениями операторов этот терм понимается так, как это показано на рис. 3.9.
Рис. 3.9. Интерпретация терма