Наконец, рассмотрим свойство
На практике в выражениях, понимание которых затрудняется правилами приоритета и ассоциативности, люди стремятся использовать круглые скобки. В нашей книге этот прием тоже будет использоваться, однако для полного понимания операторов надо знать синтаксические правила.
Напомним, что структура, образованная арифметическими операторами, подобна любой другой структуре. На самом деле никакие арифметические действия не выполняются до тех пор, пока не встретится предикат 'is'(есть), описанный в разд. 2.5.
2.4. Равенство и установление соответствия
В Прологе существует особый предикат
?- X = Y.
(произносится
Внутри всякого утверждения Xвсегда равно X, и это свойство использовано нами при определении предиката равенства.
При согласовании с базой данных цели вида X = Y, где Xи Y– любые термы, в которых могут содержаться неконкретизированные переменные, действуют следующие правила:
• если Xпредставляет собой неконкретизированную переменную, а переменная Yконкретизирована (какое именно значение ей дано, неважно), то Xи Yравны. Кроме того, Xстанет конкретизированной – ей будет дано то же значение, что и Y. Например, следующий вопрос приведет к тому, что Xбудет присвоено значение в виде структуры: ехать(клерк, велосипед):
?- ехать(клерк, велосипед) = X.
• целые числа и атомы всегда равны самим себе. Например, попытки согласовать следующие целевые утверждения дадут результаты, показанные справа:
полицейский = полицейский /* верно */
бумага = карандаш /* ложно */
1066=1066 /* верно */
1206=1583 /* ложно */
• Две структуры равны, если они имеют один и тот же функтор и одинаковое число аргументов, причем все соответствующие аргументы равны. Например, при согласовании следующего целевого утверждения Xбудет присвоено конкретное значение велосипед:
ехать(клерк,велосипед) = ехать(клерк,Х).
Структуры могут быть вложены одна в другую на любую глубину. Если такие вложенные структуры проверяются на равенство, проверка займет больше времени, поскольку необходимо проверить все структуры. Попытка согласовать следующую цель:
a(b,C,d(e,F,g(h,i,J)))=a(B,c,d(E,f,g(H,i,j))).
будет успешной,
апеременные
В,
С,
F,
Е,
Jбудут конкретизированы, им будут присвоены соответственно значения
b,
с,
f,
e,
j. Что произойдет, если мы попытаемся приравнять две неконкретизированные переменные? Это специальный случай первого из вышеприведенных правил. Так, цель будет согласована и две переменные станут
ничего_не_делать(Х,Y):- Х = Y.
Целевое утверждение X=Y всегда верно (т. е. согласуется с базой данных), если один из аргументов неконкретизирован. Более простой способ записи такого правила заключается в использовании того факта, что переменная равна самой себе:
ничего_не_делать(Х,Х).
Пролог предоставляет также предикат '\=' соответствующий
Упражнение 2.1.Скажите, верны ли следующие целевые утверждения, какие переменные будут конкретизированы и какие им будут даны значения: