Программирование на языке Пролог | страница 33



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 всегда верно (т. е. согласуется с базой данных), если один из аргументов неконкретизирован. Более простой способ записи такого правила заключается в использовании того факта, что переменная равна самой себе:


ничего_не_делать(Х,Х).


Пролог предоставляет также предикат '\=' соответствующий не равно. Целевое утверждение Х\=Y верно в тех случаях, когда не доказуемо утверждение X=Y, и наоборот. Таким образом, Х\=Y означает, что Xне может быть сделано равным Y.

Упражнение 2.1. Скажите, верны ли следующие целевые утверждения, какие переменные будут конкретизированы и какие им будут даны значения:

пилоты(А, Лондон) = пилоты(лондон, париж)

точка(Х,Y,Z) = точка(Х1,Y1,Z1) = слово(буква)

существительное(альфа) = альфа

'викарий' = викарий

f(X,X) = f(a,b)

f(X,a(b,c)) = f(Z,a(Z,c)

2.5. Арифметика

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

Рассмотрим сначала сравнение чисел. Для двух заданных чисел всегда можно сказать, равно ли одно число другому, меньше ли одно число другого, больше ли одно число другого. Пролог предоставляет некоторые «встроенные» предикаты, позволяющие