Программирование на языке Пролог для искусственного интеллекта
Шрифт:
Рис. op3.7. Две интерпретации выражения
Между '
Такие правила помогают избежать неоднозначности при обработке выражений, в которых встречаются операторы с одинаковым приоритетом. Например, выражение
обычно понимается как
В качестве еще одного примера рассмотрим оператор
записано верно; однако, если
Рис. 3.8. Множество предопределенных операторов.
Для удобства некоторые операторы в пролог-системах определены заранее, чтобы ими можно было пользоваться сразу, без какого-либо определения их в программе. Набор таких операторов и их приоритеты зависят от реализации. Мы будем предполагать, что множество этих "стандартных" операторов ведет себя так, как если бы оно было определено с помощью предложений, приведенных на рис. 3.8. Как видно из того же рисунка, несколько операторов могут быть определены в одном предложении, если только они все имеют одинаковый приоритет и тип. В этом случае имена операторов записываются в виде списка. Использование операторов может значительно повысить наглядность, "читабельность" программы. Для примера предположим, что мы пишем программу для обработки булевских выражений. В такой программе мы, возможно, захотим записать утверждение одной из теорем де Моргана, которое в математических обозначениях записывается так:
Приведем один из способов записи этого утверждения в виде прологовского предложения:
Однако хорошим стилем программирования было бы попытаться сохранить по возможности больше сходства между видом записи исходной задачи и видом, используемом в программе ее решения. В нашем примере этого можно достичь почти в
полной мере, применив операторы. Подходящее множество операторов для наших целей можно определить так:Теперь правило де Моргана можно записать в виде следующего факта:
В соответствии с нашими определениями операторов этот терм понимается так, как это показано на рис. 3.9.
Рис. 3.9. Интерпретация терма
Подытожим:
• Наглядность программы часто можно улучшить, использовав операторную нотацию. Операторы бывают инфиксные, префиксные и постфиксные.
• В принципе, с оператором не связываются никакие действия над данными, за исключением особых случаев. Определение оператора не содержит описания каких-либо действий, оно лишь вводит новый способ записи. Операторы, как и функторы, лишь связывают компоненты в единую структуру.
• Программист может вводить свои собственные операторы. Каждый оператор определяется своим именем, приоритетом и типом.
• Номер приоритета — это целое число из некоторого диапазона, скажем, между 1 и 1200. Оператор с самым больший номером приоритета соответствует главному функтору выражения, в котором этот оператор встретился. Операторы с меньшими номерами приоритетов связывают свои аргументы сильнее других операторов.
• Тип оператора зависит от двух условий: (1) его расположения относительно своих аргументов, (2) приоритета его аргументов по сравнению с его собственным. В спецификаторах, таких, как
3.12. Если принять такие определения
то два следующих терма представляют собой синтаксически правильные объекты:
Как эти термы интерпретируются пролог-системой? Каковы их главные функторы и какова их структура?
3.13. Предложите подходящее определение операторов ("
а затем спрашивать:
3.14. Рассмотрим программу:
Как данная программа будет отвечать на ниже перечисленные вопросы, если '
(a)
(b)
(с)
(d)