Что означает режим +,+ в Прологе?

Итак, мне говорят, что конкретный предикат должен работать в режиме +,+. Что это означает на Прологе?


person chutsu    schedule 27.11.2011    source источник
comment
См. также этот вопрос.   -  person SND    schedule 15.07.2016


Ответы (3)


Когда кто-то хочет дать информацию о предикате в прологе, часто используются следующие соглашения:

арность: predicate/3 означает, что предикат принимает 3 аргумента.

параметры: predicate(+Element, +List, -Result) означает, что Element и List не должны быть свободными переменными и что Result должен быть свободной переменной, чтобы предикат работал правильно. ? используется, когда это может быть и то, и другое, @ упоминается в приведенном выше ответе, но на самом деле используется не так часто (по крайней мере, в документе swi-pl) и означает, что ввод не будет привязан во время вызова.

поэтому сообщение о том, что somepredicate работает в режиме +, +, является сокращением для того, чтобы сказать, что:

% somepredicate/2 : somepredicate(+Input1, +Input2)
person m09    schedule 27.11.2011

Для того, чтобы дать вам определенный ответ, вам нужно сказать нам больше, чем просто +,+. Для предикатов, аргументами которых являются только атомы, все хорошо определено: p(+,+) означает, что предикат следует вызывать только с обоими аргументами, являющимися атомами.

Но если у нас есть, скажем, списки, все становится сложнее. В этом случае есть два значения. Рассмотрим member/2, который преуспевает для member(2,[1,2,3]).

Являются ли запросы member(2,[X]) или member(2,[X|Xs]) теперь +,+ или нет?

Прямая интерпретация, которая также используется в ISO Prolog, гласит, что (цитируя 8.1.2.2 Режим аргумента из ISO/IEC 13211-1:1995):

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

В этом смысле оба запроса выше +,+.

Однако есть и другая интерпретация, неявно предполагающая, что у нас есть доступ к определению предиката. Эта интерпретация проистекает из объявлений режима Пролога DEC-10, одной из первых систем Пролога. Итак, давайте посмотрим на member/2:

member(X, [X|_]).
member(X, [_|Xs]) :-
   member(X, Xs).

Режим member(+,+) теперь будет означать, что при выполнении цели этот режим будет применяться для всех подцелей. То есть member(2,[X]) будет +,+, тогда как member(2,[X|Xs]) нет из-за его подцели member(2,Xs).

Люди довольно часто путают эти понятия. Поэтому, когда вы говорите о списках или других составных терминах, полезно спросить, что имеется в виду.

Дополнительные сведения о режимах см. в этом ответе.

person false    schedule 28.11.2011

Это означает, что оба аргумента предиката будут входными аргументами (хотя и не чистыми входными данными).

Эта страница содержит краткое описание всех вызовов Prolog режимы.

person Ken Wayne VanderLinde    schedule 27.11.2011