2013-10-09 2 views
7

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

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

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

ответ

7

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

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

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

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

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

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

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

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

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

+0

Является ли «префиксным оператором» язык документации? Я думаю, что это может быть ценным ответом для начинающих пользователей, и хотел бы сделать заголовок более дружелюбным к Goolge, если это возможно. –

+1

В некоторых системах Prolog, а также в Logtalk символы режима создания подлинности действительно объявлены как операторы префикса, чтобы вы могли писать, например. ': - mode (length (? list,? integer), zero_or_more). Но эти символы также могут использоваться только в документации, а не в коде, который вы можете скомпилировать. Таким образом, более дружественный заголовок может быть чем-то вроде «символов режима создания пролога» или «Индикаторов режима создания пролога». –

6

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

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