ABCDEFGHIJKLMNOPQRSTUVWXYZ
abedefghijklmnopqrstuvwxyz
0123456789
!"#$%&'()=~^|\{}[] _`@ +;*:,.?/
Читатель должен заметить, что данный набор более полон, чем приводившийся в начале главы. Некоторые из этих литер имеют специальное значение. Например, круглые скобки используются для выделения компонент структур. Однако, как мы увидим в последующих главах, любая литера может рассматриваться в Пролог-программе как и информационный элемент данных. Литеры могут печататься, вводиться с клавиатуры, сравниваться и принимать участие в арифметических операциях.
Литеры на самом деле интерпретируются как небольшие
целые числа из диапазона от 0 до 127. Каждой литере поставлено в соответствие некоторое целое число, называемое ее ASCII-кодом. Аббревиатура ASCII расшифровывается следующим образом: American Standard Code for Information Interchange (Американский стандартный код для обмена информацией) . Этот код широко используется на вычислительных машинах и в языках программирования во всем мире. Таблицу кодов ASCII можно найти почти в любом руководстве по работе на ЭВМ. Коды букв упорядочены в алфавитном порядке, так что выяснение порядка следования литер в алфавите сводится к сравнению их кодов с помощью операторов отношений, описываемых ниже в данной главе. Коды всех печатаемых литер больше 32.
Хотя польза кода ASCII в данный момент может быть для читателя и не очевидной, мы вновь вернемся к этому вопросу в разд. 3.2. и 3.5.
2.3. Операторы
+(x,*(y,z))Важно отметить, что операторы не вызывают выполнения каких-либо арифметических операций. Так, в Прологе 3+4и 7означают разные объекты. Терм 3+4- другой способ записи терма +(3,4), который является структурой. Позже будет описан способ интерпретации структур как арифметических выражений и вычисления их в соответствии с правилами арифметики.
Для начала необходимо знать, как читать арифметические выражения, содержащие операторы. Это требует знания трех свойств каждого оператора: его позиции,его приоритетаи его ассоциативности.В данном разделе будут описаны правила использования операторов Пролога с учетом этих свойств, но пока без излишних подробностей. В Пролог-программе можно определить много различных видов операторов, но мы будем иметь дело только с хорошо знакомыми атомами +, -, * и /.
Синтаксис терма, содержащего операторы, частично зависит от их позиций.Операторы, подобные знакам сложения (+), вычитания (-), умножения (*) и деления (/), записываются между своими аргументами и называются поэтому инфикснымиоператорами. Можно также помещать операторы перед их аргументами. Так, в выражении - х+уминус перед хобозначает арифметическую операцию изменения знака. Операторы, записываемые перед своими аргументами, называются префикснымиоператорами. Наконец, некоторые операторы могут помещаться после своего аргумента. Например, оператор вычисления факториала, употребляемый математиками, помещается после числа, для которого необходимо вычислить факториал. В математических обозначениях факториал хзаписывается как x! t где восклицательный знак обозначает операцию вычисления факториала. Операторы, записанные после своих аргументов, называются постфикснымиоператорами. Таким образом, позиция оператора указывает его место по отношению к своим аргументам. Все операторы, рассматриваемые в следующем разделе, являются инфиксными.
Теперь рассмотрим приоритет операторов. Когда нам необходимо проинтерпретировать терм х+y*zкак арифметическое выражение, мы знаем, что для того, чтобы получить правильное значение, нужно сначала перемножить уи z,а затем прибавить х.Этими знаниями мы обязаны школе, где нас научили, что умножения и деления выполняются до сложений и вычитаний; исключениями являются случаи, когда порядок операций задается скобками. С другой стороны, структурная форма +(x,*(y,z))явно показывает порядок выполнения операций, поскольку структура с функтором * является аргументом структуры с функтором +. Для того чтобы ЭВМ правильно произвела соответствующие вычисления, необходимо сначала выполнить умножение тогда в структуре с + будут известны значения аргументов. Таким образом, для использования
операторов необходимы правила, указывающие порядок выполнения операций. Именно этой цели служит приоритет.
Приоритет оператора определяет, какая операция выполняется первой. В Прологе каждый оператор связан со своим классом приоритета.Класс приоритета представляет собой целое число, величина которого зависит от конкретной версии Пролога. Однако в любой версии оператор с большим приоритетом имеет класс приоритета, более близкий к 1. Если классы приоритетов принимают значения из диапазона от 1 до 255, то оператор с первым классом приоритета выполняется первым, до выполнения операторов, принадлежащих (например) к классу 129. В Прологе операторы умножения и деления принадлежат к более высокому классу приоритетов, чем сложение и вычитание, поэтому терм а-b/сэквивалентен терму -(a,/(b,c)). Точное соответствие между операторами и классами приоритетов в данный момент не существенно, однако желательно запомнить относительный порядок выполнения операций.