Значение индикаторов режима создания экземпляра в аргументах предикатов Prolog

Глядя на документацию Prolog, предикатные подписи иногда записываются следующим образом:

foo(:Bar, +Baz, -Qux, ?Mop)

Что такое :, +, - и ? для и как их интерпретировать? Кроме того, являются ли они единственными, которые существуют или их больше?

Ответ 1

Эти префиксные операторы в этом контексте представляют собой режимы создания экземпляров, то есть они говорят вам, какие аргументы должны быть переменными или создаваться при вызове предиката. Они также сообщают вам, будет ли аргумент (возможно, дополнительно) инстанцированным вызовом. Они также могут использоваться, чтобы сказать вам, что аргумент будет каким-то образом интерпретироваться предикатом, который вы вызываете. Некоторые из этих режимов создания экземпляров являются стандартными, другие зависят от системы. Наиболее обычными являются:

- - аргумент должен быть несвязанным (вероятный выходной аргумент)

+ - аргумент должен быть связан (входной аргумент)

? - аргумент может быть либо связанным, либо несвязанным

@ - аргумент не будет далее инстанцироваться вызовом

: - аргумент будет каким-то образом интерпретирован (часто неоднозначным)

0 - аргумент будет интерпретироваться как цель и называется как таковой

N - где N - натуральное число; аргумент будет интерпретироваться как замыкание, которое будет состоять из N дополнительных аргументов для построения цели, которая будет называться

Различные системы предоставляют другие или разные режимы создания экземпляров. Например, для указания, что аргумент должен быть заземлен при вызове предиката или для указания, что аргумент должен быть индикатором предиката или который будет интерпретироваться как тело правила грамматики. Вам нужно будет обратиться к документации системы Prolog, которую вы используете для деталей.

Ответ 2

Объявления режима впервые появились в компиляторе DECsystem-10 в конце 1970-х годов. Руководство пользователя DECsystem-10 1978-09 является одним из первых описаний. Мотивация дана 1982-11-10:

Такая информация позволяет компилятору генерировать более компактный код улучшая использование хранилища времени выполнения. Сохранение времени выполнения хранение, в частности, часто может быть очень существенным. Режим декларации также помогают другим людям понять, как ваши программа работает.

DECsystem-10

+ — аргумент всегда будет NON-переменной

- — аргумент всегда будет переменной

? — без ограничений

Обратите внимание, что эти объявления относятся к каждой цели. В частности, они применяются к рекурсивным целям. Таким образом, следующее объявление режима плюс его определение подразумевает, что второй аргумент не является частичным списком. Таким образом, цель 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-Prolog: подменю Шаблон и режимы

Стандарт Prolog (ISO/IEC 13211-1:1995, 2007, 2012) использует следующий формат для определения встроенных предикатов. Он начинается с подпункта .1 Описание,.2 Шаблон и режимы,.3 Ошибки и необязательно продолжается .4 Примеры,.5 Загрузочный встроенный предикат (ы).

8.1.2 Шаблон и режимы

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

...

Режимы бетона:

+ — аргумент должен быть создан.

@ — например +, и аргумент остается неизменным.

- — аргумент должен быть переменной, которая будет создана, если цель будет успешной.

? — не требуется режим, аргумент может быть переменной или экземпляром.

Если предикат был вызван с другим режимом, создается instantiation_error или uninstantiation_error. Если тип не соответствует, создается type_error. Таким образом, программист может предвидеть многие ошибки, просто взглянув на подзаголовок Template и mode, не прочитав подробные условия ошибки.

Другие системы

Системы, которые отличаются от ISO, также отличаются друг от друга в их точной интерпретации режимов. Многие из них выполняют молчащий сбой в случае, если ошибка типа будет уместна. Они рассматривают объявления режима как средство для указания случаев, когда ожидается, что предикат будет работать с undefined, в противном случае. Часто - интерпретируется примерно следующим образом. Поскольку нет фактической ссылки, которая определяет значение, это то, что я собрал неофициально:

- — аргумент является "выходным аргументом". Это означает, что он будет унифицирован с итоговым термином после, цель была выполнена. Поэтому аргумент неуклонный. Часто с таким аргументом не связана никакая ошибка.