Программирование на языке Пролог для искусственного интеллекта | страница 54



Выражения рассматриваются Прологом просто как дополнительный способ записи, при котором не вводятся какие-либо новые принципы структуризации объектов данных. Если мы напишем >а + b,  Пролог поймет эту запись, как если бы написали >+(а, b). Для того, чтобы Пролог правильно воспринимал выражения типа >а + b*с, он должен знать, что >* связывает сильнее, чем >+. Будем говорить, что >+ имеет более низкий приоритет, чем >*. Поэтому верная интерпретация выражений зависит от приоритетов операторов. Например, выражение >а + b*с, в принципе можно понимать и как

>+( а, *( b, с) )

и как

>*( +( а, b), с)

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

Программист может вводить свои собственные операторы. Так, например, можно определить атомы >имеет и >поддерживает в качестве инфиксных операторов, а затем записывать в программе факты вида:

>питер имеет информацию.

>пол поддерживает стол.

Эти факты в точности эквивалентны следующим:

>имеет( питер, информацию).

>поддерживает( пол, стол).

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

>:- op( 600, xfx, имеет).

Такая запись сообщит Прологу, что мы хотим использовать "имеет" в качестве оператора с приоритетом 600 и типом '>xfx', обозначающий одну из разновидностей инфиксного оператора. Форма спецификатора '>xfx' указывает на то, что оператор, обозначенный через '>f', располагается между аргументами, обозначенными через ''.

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