Итак, мне говорят, что конкретный предикат должен работать в режиме +,+. Что это означает на Прологе?
Что означает режим +,+ в Прологе?
Ответы (3)
Когда кто-то хочет дать информацию о предикате в прологе, часто используются следующие соглашения:
арность: predicate/3 означает, что предикат принимает 3 аргумента.
параметры: predicate(+Element, +List, -Result) означает, что Element и List не должны быть свободными переменными и что Result должен быть свободной переменной, чтобы предикат работал правильно. ? используется, когда это может быть и то, и другое, @ упоминается в приведенном выше ответе, но на самом деле используется не так часто (по крайней мере, в документе swi-pl) и означает, что ввод не будет привязан во время вызова.
поэтому сообщение о том, что somepredicate работает в режиме +, +, является сокращением для того, чтобы сказать, что:
% somepredicate/2 : somepredicate(+Input1, +Input2)
Для того, чтобы дать вам определенный ответ, вам нужно сказать нам больше, чем просто +,+. Для предикатов, аргументами которых являются только атомы, все хорошо определено: 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)
.
Люди довольно часто путают эти понятия. Поэтому, когда вы говорите о списках или других составных терминах, полезно спросить, что имеется в виду.
Дополнительные сведения о режимах см. в этом ответе.
Это означает, что оба аргумента предиката будут входными аргументами (хотя и не чистыми входными данными).
Эта страница содержит краткое описание всех вызовов Prolog режимы.