Вопрос

В Прологе есть несколько специальных операторов, один из них — «is», однако недавно я наткнулся на операторы =:= и понятия не имею, как они работают.

Может ли кто-нибудь объяснить, что делает этот оператор, а также где я могу найти предопределенный список таких специальных операторов и что они делают?

Спасибо.

Это было полезно?

Решение

?- 2+3 =:= 6-1.
true.

?- 2+3 is 6-1.
false.

Также см. документы http://www.swi-prolog.org/pldoc/man?predicate=is/2

Другие советы

Я думаю, что приведенный выше ответ, тем не менее, заслуживает нескольких слов объяснения.

Небольшое замечание заранее:Арифметические выражения в Прологе — это просто термины («В Прологе все является терминами»), которые не вычисляются. автоматически.(Если у вас есть опыт работы с Lisp, подумайте о списках в кавычках).Так 3 + 4 это то же самое, что +(3,4), который ничего не делает сам по себе.Это ответственность отдельных предикатов за оценивать эти условия.

Несколько встроенных предикатов выполняют неявные вычисления, среди них такие операторы арифметического сравнения, как =:= и is.Пока =:= оценивает оба аргумента и сравнивает результат, is принимает и оценивает только свою верно аргумент как арифметическое выражение.

В левый Аргумент должен быть атомом, либо числовой константой (которая затем сравнивается с результатом вычисления правильного операнда), либо переменной.Если это граница переменная, ее значение должно быть числовым и сравниваться с правым операндом, как и в первом случае.Если это несвязанный переменной, результат вычисления правого операнда привязан к этой переменной. is в последнем случае часто используется для привязки переменных.

Чтобы взять пример из приведенного выше словаря Пролога:Чтобы проверить, является ли число N четным, вы можете использовать оба оператора:

0 is N mod 2  % true if N is even
0 =:= N mod 2 % dito

Но если вы хотите зафиксировать результат операции, вы можете использовать только первый вариант.Если X несвязан, то:

X is N mod 2   % X will be 0 if N is even
X =:= N mod 2  % !will bomb with argument/instantiation error!

Практическое правило:Если вам просто нужно арифметическое сравнение, используйте =:=.Если вы хотите получить результат оценки, используйте is.

Дополняя имеющиеся ответы, хотелось бы отметить несколько дополнительных моментов:

Оператор есть оператор

Прежде всего, оператор =:= является, как следует из названия, оператор.В Прологе мы можем использовать предикат current_op/3 чтобы узнать больше об операторах.Например:

?- current_op(Prec, Type, =:=).
Prec = 700,
Type = xfx.

Это означает, что оператор =:= имеет приоритет 700 и составляет тип xfx.Это означает, что это двоичный файл инфикс оператор.

Это означает, что вы может, если вы хотеть, напишите термин типа=:=(X, Y) эквивалентно как X =:= Yоба случая, функтор термина =:=, и арность срока составляет 2.Вы можете использовать write_canonical/1 чтобы убедиться в этом:

?- write_canonical(a =:= b).
=:=(а,б)

Предикат не является оператором

Все идет нормально!Все это было чисто синтаксический особенность.Однако то, что ты на самом деле спрашивать о том предикат (=:=)/2, чье имя =:= и это занимает 2аргументы.

Как уже объяснили другие, предикат(=:=)/2 обозначает арифметическое равенство из двух арифметических выражений.Это истинный если только его аргументы оценивать на тот же номер.

Например, давайте попробуем самый общий запрос, с помощью которого мы запрашиваем любое решение, используя переменные в качестве аргументов:

?- X =:= Y.
ОШИБКА:Аргументы недостаточно конкретизированы

Следовательно, этот предикат нет истинное отношение, поскольку мы не можем использовать его для создание Результаты!Это довольно серьезный недостаток этого предиката, противоречащий тому, что вы обычно называете «декларативным программированием».

Предикат действует только в самом специфический ситуация, когда оба аргумента полностью реализуются.Например:

?- 1 + 2 =:= 3.
истинный.

Мы называем такие предикаты модифицированный потому что их можно использовать только в частности режимы использования.Для подавляющего большинства новичков модифицированные предикаты являются кошмар  использовать, потому что они требуют от вас думать о своих программах процессуально, что поначалу довольно сложно, но и позже остается трудным.Кроме того, модифицированные предикаты строго ограничить общность ваших программ, потому что вы не можете использовать их по всем направлениям, в которых вы мог используйте чистые предикаты.

Ограничения являются более общей альтернативой.

Пролог также предоставляет много более общий арифметические предикаты в форме арифметики ограничения.

Например, в случае целые числа, попробуйте вашу систему Пролога Ограничения CLP(FD).Одно из наиболее важных ограничений CLP(FD) обозначает арифметические действия. равенство и называется(#=)/2.По полной аналогии с (=:=)/2, оператор (#=)/2 также определяется как инфикс оператор, и поэтому вы можете написать, например:

| ?- 1 + 2 #= 3.

yes

В качестве конкретного примера я использую GNU Prolog, и многие другие системы Prolog также предоставляют реализации CLP(FD).

Основная привлекательность ограничений заключается в их общность.Например, в отличие от (=:=)/2, мы получаем с предикат (#=)/2:

| ?- X   2 #= 3.

X = 1

|?- 1   Y #= 3.

Y = 2

И мы можем даже спросить самый общий запрос:

| ?- X #= Y.

X = _#0(0..268435455)
Y = _#0(0..268435455)

Обратите внимание, как естественно эти предикаты сливаются с Прологом и действуют как связи между целочисленными выражениями, которые можно запрашивать в все направления.

В зависимости от интересующей области я рекомендую использовать CLP(FD), CLP(Q), CLP(B) и т. д. вместо использования более низкоуровневых арифметических предикатов.

Также см , и Чтобы получить больше информации.

По совпадению, оператор =:= используется CLP(B) с полностью другое значение:

?- sat(A =:= B+1).
A = 1,
sat(B=:=B).

Это показывает, что вы должны различать операторы и предикаты.В приведенном выше случае предикат sat/1 истолковал данное выражение как пропозициональную формулу, и в этом контексте, =:= обозначает равенство логических выражений.

Я нашел свой собственный ответ, http://www.cse.unsw.edu.au/~billw/prologdict.html

Это базовый стандартный оператор-предикат ISO, который нельзя загрузить из унификации (=)/2 или синтаксического равенства (==)/2.Оно определено в разделе 8.7 «Арифметическое сравнение».И в основном он ведет себя следующим образом:

E =:= F :- 
    X is E, 
    Y is F, 
    arithmetic_compare(=, X, Y).

Таким образом, как левая часть (LHS), так и правая часть (RHS) должны быть арифметическими выражениями, которые вычисляются перед сравнением.Арифметическое сравнение позволяет сравнивать числовые типы.Итак, у нас есть:

   GNU Prolog 1.4.5 (64 bits)

   ?- 0 = 0.0.
   no

   ?- 0 == 0.0
   no

   ?- 0 =:= 0.0.
   yes

=:= — оператор сравнения. A1 =:= A2 завершается успешно, если значения выражений A1 и A2 равны.A1 == A2 завершается успешно, если условия A1 и A2 идентичны;

Первый оператор =:= равен проверке?напримервведите сюда описание изображения

это правда.но это возвращает ложьвведите сюда описание изображения

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top