Программирование на языке Пролог для искусственного интеллекта | страница 54
Выражения рассматриваются Прологом просто как дополнительный способ записи, при котором не вводятся какие-либо новые принципы структуризации объектов данных. Если мы напишем >а + b
, Пролог поймет эту запись, как если бы написали >+(а, b)
. Для того, чтобы Пролог правильно воспринимал выражения типа >а + b*с
, он должен знать, что >*
связывает сильнее, чем >+
. Будем говорить, что >+
имеет более низкий приоритет, чем >*
. Поэтому верная интерпретация выражений зависит от приоритетов операторов. Например, выражение >а + b*с
, в принципе можно понимать и как
>+( а, *( b, с) )
и как
>*( +( а, b), с)
Общее правило состоит в том, что оператор с самым низким приоритетом расценивается как главный функтор терма. Если мы хотим, чтобы выражения, содержащие >+
и >*
, понимались в соответствии с обычными соглашениями, то >+
должен иметь более низкий приоритет, чем >*
. Тогда выражение >а + b*с
означает то же, что и >а + (b*с)
. Если имеется в виду другая интерпретация, то это надо указать явно с помощью скобок, например >(а+b)*с
.
Программист может вводить свои собственные операторы. Так, например, можно определить атомы >имеет
и >поддерживает
в качестве инфиксных операторов, а затем записывать в программе факты вида:
>питер имеет информацию.
>пол поддерживает стол.
Эти факты в точности эквивалентны следующим:
>имеет( питер, информацию).
>поддерживает( пол, стол).
Программист определяет новые операторы, вводя в программу особый вид предложений, которые иногда называют директивами. Такие предложения играют роль определений новых операторов. Определение оператора должно появиться в программе раньше, чем любое выражение, использующее этот оператор. Например, оператор имеет можно определить директивой
>:- op( 600, xfx, имеет).
Такая запись сообщит Прологу, что мы хотим использовать "имеет" в качестве оператора с приоритетом 600 и типом '>xfx
', обозначающий одну из разновидностей инфиксного оператора. Форма спецификатора '>xfx
' указывает на то, что оператор, обозначенный через '>f
', располагается между аргументами, обозначенными через '>х
'.
Обратите внимание на то, что определения операторов не содержат описания каких-либо операций или действий. В соответствии с принципами языка ни с одним оператором не связывается каких-либо операций над данными (за исключением особых, редких случаев). Операторы обычно используются так же, как и функторы, только для объединения объектов в структуры и не вызывают действия над данными, хотя само слово "оператор", казалось бы, должно подразумевать какое-то действие.