На этом шаге мы рассмотрим раздел предикатов.
Если в разделе clauses программы на Прологе вы описали собственный предикат, то вы обязаны объявить его в разделе predicates (предикатов); в противном случае Пролог не поймет, о чем вы ему "говорите". В результате объявления предиката вы сообщаете, к каким доменам (типам) принадлежат аргументы этого предиката.
Предикаты задают факты и правила. В разделе же predicates все предикаты просто перечисляются с указанием типов (доменов) их аргументов. Эффективность работы Пролога значительно возрастает именно из-за того, что вы объявляете типы объектов (аргументов), с которыми работают ваши факты и правила.
Объявление предиката начинается с имени этого предиката, за которым идет открывающая (левая) круглая скобка, после чего следует ноль или больше доменов (типов) аргументов предиката:
predicateName(argument_type1 OptionalName1, argument_type2 OptionalName2,.., argument_typeN OptionalNameN)
После каждого домена (типа) аргумента следует запятая, а после последнего типа аргумента - закрывающая (правая) скобка. Отметим, что, в отличие от предложений в разделе clauses, декларация предиката не завершается точкой. Доменами (типами) аргументов предиката могут быть либо стандартные домены, либо домены объявленные вами в разделе domains. Можно указывать имена аргументов OptionalNameK - это улучшает читаемость программы, и не сказывается на скорости ее исполнения, т. к. компилятор их игнорирует.
Имя предиката должно начинаться с буквы, за которой может располагаться последовательность букв, цифр и символов подчеркивания. Регистр букв не имеет значения, однако мы не советуем вам использовать заглавные буквы в качестве первой буквы имени предиката. Имя предиката может иметь длину до 250 символов.
В именах предикатов запрещается использовать пробел, символ минус, звездочку и другие алфавитно-цифровые символы. Корректные имена Пролога могут включать символы, перечисленные в таблице 1.
Название символов | Примеры символов |
---|---|
Заглавные буквы | А, B, ..., Z |
Строчные буквы | a, b ..., z |
Цифры | 0, 1, ..., 9 |
Символ подчеркивания | _ |
Имена предикатов и аргументов могут состоять из любых комбинаций этих символов при условии, что вы подчиняетесь правилам построения соответствующих имен. В таблице 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)
predicates my_predicate(name,number),
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)
Этот фрагмент сообщает следующую информацию об этих предикатах и их аргументах:
На следующем шаге мы рассмотрим раздел доменов.