Объявление режима, впервые появившееся в компиляторе DECsystem-10 в конце 1970-х годов. Руководство пользователя DECsystem-10 1978-09 является одним из первых описаний. Мотивацией дается 1982-11-10:
Такая информация позволяет компилятору генерировать более компактный код лучшего использования памяти во время выполнения. Сохранение времени хранения , в частности, часто может быть очень существенным. В режиме декларации также помогают другим людям понять, как работает ваша программа .
DECsystem-10
+
— аргумент всегда будет неизменяемой
-
— аргумент всегда будет переменная
?
— никаких ограничений
Примечание что эти заявления относятся к каждый гол. В частности, они применяются к рекурсивным целям. Таким образом, следующее объявление режима плюс его определение подразумевает, что второй аргумент не является частичным списком. Таким образом, цель member(A, [c|_])
будет не соответствовать. Таким образом, интерфейс и реализация несколько взаимозависимы, что может привести к довольно сложным случаям, когда необходимо учитывать унификации, выполненные самим предикатом.
:- mode member(?, +).
member(X, [X|_]). % member(X, [X,.._]) in DEC10
member(X, [_|L]) :-
member(X, L).
В случае декларация режим нарушается конкретной цели, декларация либо игнорируются, либо выдаст ошибку, которая в то время означало выписывая сообщение об ошибке и не удается. Переводчик DECsystem-10 всегда игнорировал объявления.
В конце 1970-х годов руководство пользователя DEC 10 привело к двум интерпретациям деклараций режима: первый из них является директивным, который вызывает ошибки в случае, если вызывающий абонент не выполняет режимы. Второй - полностью неформальный, игнорируя объявления режима во время выполнения. Первый используется в стандарте Prolog, последний найден в документации некоторых систем Prolog.
ISO/IEC-Пролог: Шаблон и режимы подраздела
Стандарта Пролога (ISO/IEC 13211-1: 1995, 2007, 2012) использует следующий формат для определения встроенных предикатов. Он начинается с подпункта .1 Описание, .2 Шаблон и режимы, .3 Ошибки и необязательно продолжается .4 Примеры, .5 Загруженный встроенный предикат (ы).
8.1.2 Шаблон и режимы
спецификация для обоих типов аргументов и которые
из них должен быть реализованным для встроенного предиката
быть удовлетворены. Случаи образуют взаимоисключающий набор.
...
режимы бетоны являются:
+
— аргумент должен быть создан.
@
— как +
, и аргумент остается неизменным.
-
— аргумент должен быть переменной, которая будет создана, если цель будет успешной.
?
— не требуется режим, аргумент может быть переменной или экземпляром.
Если предикат был вызван с другим режимом, создается instantiation_error
или uninstantiation_error
. Если тип не соответствует, то создается type_error
. Таким образом, программист может предвидеть много ошибок, просто взглянув на подзаголовок Шаблон и режим без чтения подробных условий ошибки.
Другие системы
системы, которые отличаются от ISO также отличаются друг от друга в их точной интерпретации режимов. Многие из них выполняют молчащий сбой в случае, если ошибка типа будет уместна. Они рассматривают объявления режима как средство для указания случаев, когда предикат, как ожидается, будет работать с неопределенным значением иначе. Часто -
интерпретируется примерно следующим образом. Поскольку фактическая ссылка не определяет значение, это то, что я собрал неофициально:
-
— аргумент является «выходным аргументом». Это значит, что он будет унифицирован с итоговым термином после гол был исполнен. Поэтому аргумент неуклонный. Часто с таким аргументом не связана никакая ошибка.
Является ли «префиксным оператором» язык документации? Я думаю, что это может быть ценным ответом для начинающих пользователей, и хотел бы сделать заголовок более дружелюбным к Goolge, если это возможно. –
В некоторых системах Prolog, а также в Logtalk символы режима создания подлинности действительно объявлены как операторы префикса, чтобы вы могли писать, например. ': - mode (length (? list,? integer), zero_or_more). Но эти символы также могут использоваться только в документации, а не в коде, который вы можете скомпилировать. Таким образом, более дружественный заголовок может быть чем-то вроде «символов режима создания пролога» или «Индикаторов режима создания пролога». –