Программирование на языке пролог
Шрифт:
&.LOAD TEST
Другая важная команда – это LOAD.Далее следует имя файла. Ввод этой команды приводит к чтению содержимого файла TEST.LOGи дополнению этим содержимым базы данных, подобно тому, как это делалось при consult.Теперь можно задавать вопросы:
&.?((likes john bertrand))
?
&.?((likes john alfred))
&.
Заметим, что отрицательный
&. LIST(likes)
((likes john alfred))
((likes alfred john))
((likes bertrand john))
((likes david bertrand))
((likes john x) (likes x bertrand))
В некоторых случаях для того, чтобы получить ответ на заданный вопрос, приходится прибегать к помощи встроенных предикатов. Предикат РР обеспечивает выдачу его аргументов на терминал, а предикат FAIL вызывает неудачное согласование целевого утверждения.
&.?((likes john х) (РР х) (FAIL))
alfred
david
?
Так мы получили два ответа на вопрос: «Кто нравится Джону?». Если мы хотим добавить к базе данных новые утверждения с терминала, нам не нужно прибегать к помощи специальных команд – мы можем просто ввести эти утверждения. Синтаксис утверждений микро-Пролога будет рассмотрен в следующем разделе.
&.((likes timothy bertrand))
&.?((likes john x) (PP x) (FAIL))
alfred
david
timothy
?
Чтобы выйти из микро-Пролога и вернуться в СР/М, достаточно задать команду QT, за которой следует поставить точку:
&. QT.
А›
Синтаксис микро-Пролога существенно отличается от синтаксиса, рассматриваемого в данной книге, однако освоить его можно довольно быстро. Основная идея заключается в том, что существует всего один вид терма – список. Если мы хотим построить терм с функтором fи четырьмя аргументами, то для этого используется список из пяти элементов, куда fвходит в качестве головы, а остальные элементы соответствуют четырем аргументам в порядке их следования. Таким образом то, что в базовом синтаксисе было бы записано в виде:
f(a,g(2,3),c)
на микро-Прологе должно быть записано как:
(f a (g 2 3) с)
Здесь мы сталкиваемся также и с иным синтаксисом задания списков, где списки заключены в круглые скобки, а элементы списков разделяются пробелами.
Утверждения представляются как списки термов, где первый терм – это заголовок утверждения, а остальные термы – цели, которые,
((alter (zl|z2) (x|y)) (change zl x) (alter z2 у)
Это – второе утверждение для предиката alter(преобразовать) из разд. 3.4. Заметим, что вертикальная черта имеет здесь то же значение, что и в базовом синтаксисе.
Микро-Пролог может обрабатывать числа с плавающей точкой с точностью до восьми значащих цифр и с порядком (по основанию 10) в диапазоне от -127 до 127. Имена атомов (называемые в микро-Прологе «константами») могут содержать до 60 литер, а терм не может содержать более 64 переменных. Эти ограничения на практике не вызывают трудностей.
Микро-Пролог предоставляет множество средств, помогающих при разработке программ за терминалом. Предикаты LOADи SAVEпозволяют, соответственно, читать и записывать программы в файлы на диске. Мощный строчный редактор и структурный редактор позволяют вносить изменения в тексты программ, не выходя из Пролог-системы. Выполнение микро-Пролог-программы может быть прервано путем ввода комбинации «CONTROL С».
Имена и назначение встроенных предикатов сильно отличаются от рассмотренных в данной книге. Ниже приводится краткое описание некоторых из предусмотренных средств.
Тип терма можно проверить с помощью предикатов NUM, CON, VAR,которые согласуются с базой данных, соответственно, в случае чисел, констант (атомов) и переменных. Кроме того, предикат SYSпроверяет, является ли константа именем встроенного предиката, предикат 1NTобеспечивает проверку на целое число.
Для работы с базой данных используются предикаты: ADDCL(аналогичен assert), CL(аналогичен clause)и DELCL(аналогичен retract)В этих предикатах можно задавать дополнительный целочисленный аргумент Nс тем, чтобы можно было обрабатывать N– e утверждение процедуры.
Поскольку единственным видом терма в микро-Прологе является список, то предикат вида ' =..' здесь не нужен. Предикат STRINGпозволяет программисту создавать новые атомы и осуществлять доступ к внутренней структуре имени атома аналогично тому, как это делается с помощью предиката name.
Составные цели в микро-Прологе можно конструировать с помощью встроенных предикатов OR, NOTи IF.Предикат FAILвызывает немедленную неудачу в согласовании цели. Предусмотрено также и «отсечение», которое обозначается с помощью литеры '/'.
Арифметические действия реализуются посредством нескольких предикатов, вместо одного is. Арифметические предикаты максимально «обратимы», поэтому, например, цель
(SUM х у г)