Некоторые функторы удобнее записывать, как операторы.
Например, можно записать
+(1, 2)
или
+ / \ 1 2Удобнее записать 1+2, т.е. в виде оператора. Причем надо понимать, что это не операция сложения, а операторная запись структуры. Такие операторы называются инфиксными.
Аналогично операторная запись
2*a+b*c
может быть представлена в виде структуры:
+(*(2, a), *(b, c))
Это и производит Пролог при трансляции операторных выражений. Надо четко понимать, что операторы - это другая форма записи структуры.
Арифметика
В Прологе выполняются следующие операции:
+
-
*
/
mod - остаток от целочисленного деления.
Чтобы арифметическое выражение рассчитывалось, необходимо использовать встроенный оператор is, который заставляет выполнять арифметические операции.
?-X is 2+1.
X=3
?-Y is 2*(5+6).
Y=22
В функции могут быть переменные, но они должны иметь значение к моменту ее вычисления.
f(X, Y, Z):-Z is X*X + Y*Y.
Зададим вопрос
?- f(2, 3, R).
R=13
Определим:
sum(X1, X2, X):-X is X1 + X2.
Тогда
?-sum(2, 3, X).
X=5
?- sum(1, 1, X1), sum(X1, X1, X).
4.
|
|
Операции сравнения
Операции сравнения используются при сравнении чисел.
В языке Пролог есть операции сравнения вида:
X > Y
X < Y
X >= Y
X =< Y
X = Y
X \= Y
(с побочным эффектом)
?- 100 > 4. yes | ||
age(mary, 20).
age(ann, 23).
age(bob, 25).
?- age(X, Y), Y>21.
X=ann;
X=bob;
?- age(X, Y), Y>21, Y<=23.
X=ann;
Определим отношение "выше" higher/2
higher(point(X1, Y1), point(X2, Y2):-Y1>Y2.
?- higher(point(1, 1), point(2, 2).
no
Если наоборот - то будет yes.
Сопоставление
Главной операцией в процессе выполнения Пролог - программы, является сопоставление (согласование, унификация) термов.
Например,
Рarent(pam, bob).
?- parent(pam, bob).
Yes
Цель согласуется.
?-parent(pam, X).
X=bob
Атомы и переменные тоже согласуются, но X конкретизируется и принимает значение bob
Но если взять два составных терма - структуры.
a(b, C, d(e, F, g(h, i, J)))
a(B, c, d(E, f, g(H, I, j)))
согласуются ли они? Что будет с переменными после согласования? Как они будут конкретизированы?
Сопоставление - это процесс, на вход которого подаются два терма и процесс проверяет, соответствуют ли эти термы друг другу.
Если термы не сопоставимы, значит, сопоставление терпит неудачу.
Если термы сопоставимы, тогда пpоцесс сопоставления находит конкретизацию переменных, делающих эти термы тождественными, и завершается удачей.
Какие же правила определяют сопоставимость двух термов S и Т?
1. Если S и Т константы, то S и Т сопоставимы, только, если они являются одним и тем же объектом, т.е.:
2 сопоставляется с 2
bob сопоставляется с bob
2. Если S переменная, а Т -произвольный объект, то ни сопоставимы и S приписывается значение T. Наоборот, если Т -переменная, а S -произвольный объект, то T приписывается значение S.
Говорят,что T конкретизируется значением S, т.е.:
|
|
data(M, D, 1992).
data(may, 3, Y).
3. Сопоставимые переменные конкретизируются:
М=may
D=3
Y=1992
в обоих термах.
4. Если S и Т - структуры, то они сопоставимы, если
(а) S и Т имеют одинаковый главный функтор
и (b) все их соответствующие компоненты сопоставимы.
Результирующая конкретизация определяется сопоставлением компонент.
Если сопоставить структуры
a(b, C, d(e, F, g(h, i, J)))
a(B, c, d(E, f, g(H, I, j)))
то получим
B=b
C=c
E=e
F=f
H=h
I=i
J=j
Рассмотрим более сложный пример:
triangle(point(2, 5), A, point(B, 8)) triangle(X, point(2, 8), point(5, 8))После конкретизации
X=point(2, 5)
A=point(2, 8)
B=5
Если Y представляет собой не конкретизированную переменную, а переменная X конкретизированную, то X и Y согласуются и принимают значение Х:
X=2
Y=2
Переменные Z и A обе не конкретизированы. Они согласуются и становятся сцепленными. Если две переменные сцеплены, то при конкретизации одной из них, второй переменной автоматически будет присвоено то же самое конкретное значение, что и первой. Как это было с X и Y.
2.8. Второе значение операции “=” в Прологе
В Прологе операция “=” кроме сравнения выполняет сопоставление двух термов, с конкретизацией переменных.
Если термы согласуются, то результат - истина.
?-a(B,c(x,D))=a(d,c(X,3)).
Yes
B=d
X=x
D=3
Аналогично, \= дает истину, если термы не согласуются.
?-a(x)\=a(d).
Yes