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