Шаг 20.
Основы логического программирования.
Раздел предикатов

    На этом шаге мы рассмотрим раздел предикатов.

    Если в разделе clauses программы на Прологе вы описали собственный предикат, то вы обязаны объявить его в разделе predicates (предикатов); в противном случае Пролог не поймет, о чем вы ему "говорите". В результате объявления предиката вы сообщаете, к каким доменам (типам) принадлежат аргументы этого предиката.

    Предикаты задают факты и правила. В разделе же predicates все предикаты просто перечисляются с указанием типов (доменов) их аргументов. Эффективность работы Пролога значительно возрастает именно из-за того, что вы объявляете типы объектов (аргументов), с которыми работают ваши факты и правила.

Как объявить пользовательский предикат

    Объявление предиката начинается с имени этого предиката, за которым идет открывающая (левая) круглая скобка, после чего следует ноль или больше доменов (типов) аргументов предиката:

predicateName(argument_type1 OptionalName1,
   argument_type2 OptionalName2,..,
   argument_typeN OptionalNameN)

    После каждого домена (типа) аргумента следует запятая, а после последнего типа аргумента - закрывающая (правая) скобка. Отметим, что, в отличие от предложений в разделе clauses, декларация предиката не завершается точкой. Доменами (типами) аргументов предиката могут быть либо стандартные домены, либо домены объявленные вами в разделе domains. Можно указывать имена аргументов OptionalNameK - это улучшает читаемость программы, и не сказывается на скорости ее исполнения, т. к. компилятор их игнорирует.

Имена предикатов

    Имя предиката должно начинаться с буквы, за которой может располагаться последовательность букв, цифр и символов подчеркивания. Регистр букв не имеет значения, однако мы не советуем вам использовать заглавные буквы в качестве первой буквы имени предиката. Имя предиката может иметь длину до 250 символов.

    В именах предикатов запрещается использовать пробел, символ минус, звездочку и другие алфавитно-цифровые символы. Корректные имена Пролога могут включать символы, перечисленные в таблице 1.

Таблица 1. Символы, используемые в именах предикатов в Прологе
Название символов Примеры символов
Заглавные буквы А, B, ..., Z
Строчные буквы a, b ..., z
Цифры 0, 1, ..., 9
Символ подчеркивания _

    Имена предикатов и аргументов могут состоять из любых комбинаций этих символов при условии, что вы подчиняетесь правилам построения соответствующих имен. В таблице 2 приведены корректные и некорректные имена предикатов.

Таблица 2. Имена предикатов в Прологе
Корректные имена предикатов Некорректные имена предикатов
Fact [fact]
is_a *is_a*
has_a has/a
PatternCheckList Pattern-Check-List
choose_Menu_Item Choose Menu Item
PredicateName Predicate<Name>
first_in_10 >first_in_10

Агументы предикатов

    Аргументы предикатов должны принадлежать доменам, известным Прологу. Эти домены могут быть либо стандартными доменами, либо некоторыми из тех, что вы объявляли в разделе доменов.


    Рассмотрим несколько примеров.

    1. Если предикат my_predicate(symbol, integer) объявлен в разделе predicates следующим образом:

   predicates
      my_predicate(symbol,integer)
то вам не нужно в разделе domains декларировать домены его аргументов, т.к. simbol и integer - стандартные домены. Однако если этот же предикат вы объявите так:
   predicates
      my_predicate(name,number),
то необходимо объявить, что name (символический тип) и number (целый тип) принадлежат к стандартным доменам symbol и integer:
   domains
      name=symbol
      number=integer
   predicates
      my_predicate(name,number)

    2. Следующий фрагмент программы показывает несколько различных объявлений доменов и предикатов:

   domains
      person,activity=symbol
      car,make,color=symbol
      mileage,years_on_road,cost=integer predicates
      likes(person,activity)
      parent(person,person)
      can_buy(person,car)
      car(make, mileage,years_on_road,color,cost)
      green(symbol)
      ranking(symbol,integer)

    Этот фрагмент сообщает следующую информацию об этих предикатах и их аргументах:

    На следующем шаге мы рассмотрим раздел доменов.




Предыдущий шаг Содержание Следующий шаг