Логическое программирование |
Логическое программирование — это технология, позволяющая довольно близко приблизиться к воплощению декларативного идеала, описанного в главе 7, согласно которому системы должны конструироваться путем представления знаний на некотором формальном языке, а задачи решаться путем применения процессов логического вывода к этим знаниям. Такой идеал выражен в следующем уравнении Роберта Ковальского: Алгоритм = Логика + Управление Одним из языков логического программирования, намного превосходящим все прочие по своей распространенности, является Prolog. Количество его пользователей насчитывает сотни тысяч. Он используется в основном в качестве языка быстрой разработки прототипов, а также служит для решения задач символических манипуляций, таких как написание компиляторов и синтаксический анализ текстов на естественном языке . На языке Prolog было написано много экспертных систем для юридических, медицинских, финансовых и других проблемных областей. Программы Prolog представляют собой множества определенных выражений, записанных в системе обозначений, немного отличающейся от используемой стандартной логики первого порядка. В языке Prolog прописные буквы применяются для обозначения переменных, а строчные — для обозначения констант. Выражения записываются с головой, предшествующей телу; символ : - служит для обозначения импликации, направленной влево, запятые разделяют литералы в теле, а точка обозначает конец высказывания, как показано ниже. criminal(X) :- american(X), weapon(Y), sells(X,Y,Z), hostile(Z). Язык Prolog включает "синтаксические упрощения" (syntactic sugar) для обозначения списков и арифметических выражений. Например, ниже приведена программа Prolog для предиката append (X, Y, Z), которая выполняется успешно, если список Z представляет собой результат дополнения списка Y списком X. append([] , Y, Y) . append([А|Х],Y,[A|Z]) :- append(X,Y,Z). На естественном языке эти выражения можно прочитать так: во-первых, дополнение списка Y пустым списком приводит к получению того же списка Y, и, во-вторых, [А | Z] — это результат дополнения списка Y списком [А | X], при условии, что Z — это результат дополнения списка Y списком X. Такое определение предиката append на первый взгляд кажется весьма подобным соответствующему определению на языке Lisp, но фактически является гораздо более мощным. Например, в систему можно ввести запрос append (А, В, [1,2] ) — какие два списка можно дополнить один другим, чтобы получить [1,2]? Система возвратит следующие решения: А=[] В=[1,2] А=[1] В=[2] А=[1,2] В=[] Выполнение программ Prolog осуществляется по принципу обратного логического вывода с поиском в глубину, при котором попытка применения выражений выполняется в том порядке, в каком они записаны в базу знаний. Но некоторые описанные ниже особенности языка Prolog выходят за рамки стандартного логического вывода.
Решения, принятые при проектировании языка Prolog, представляют собой компромисс между стремлениями обеспечить декларативность и вычислительную эффективность (по крайней мере, эффективность в той ее трактовке, которая существовала в период разработки языка Prolog). |