Что означает +, + mode в Прологе? - PullRequest
3 голосов
/ 27 ноября 2011

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

Ответы [ 3 ]

4 голосов
/ 27 ноября 2011

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

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

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

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

% somepredicate/2 : somepredicate(+Input1, +Input2)
4 голосов
/ 28 ноября 2011

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

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

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

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

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

В этом смысле оба вышеуказанных запроса являются +, +.

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

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

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

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

Подробнее о режимах см. этот ответ .

3 голосов
/ 27 ноября 2011

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

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

...