Операторы - тоже функторы

Некоторые функторы удобнее записывать, как операторы.
Например, можно записать

         +(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































Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: