Круглые скобки используются для изменения толкования термина при наличии операторов. Обратите внимание, что для синтаксического анализатора Prolog нет различия между simplify(U*(V),R2)
и simplify(U*V,R2)
:
| ?- write_canonical(simplify(U*(V),R2)).
simplify(*(_279,_280),_284)
yes
| ?- write_canonical(simplify(U*V,R2)).
simplify(*(_279,_280),_284)
yes
Таким образом, последние два предложения имеют одинаковую заголовок; в U*(V)
есть один оператор.
Теперь рассмотрим цель simplify(x*(4*x),R)
. Определение оператора для (*)/2
:
| ?- current_op(Priority, Type, *).
Priority = 400
Type = yfx
yes
Т.е. оператор левоассоциативный . Это означает, что, например, a*b*c
анализируется как *(*(a,b),c)
. Поэтому:
| ?- write_canonical(simplify(x*(4*x),R)).
simplify(*(x,*(4,x)),_285)
yes
| ?- write_canonical(simplify(x*4*x,R)).
simplify(*(*(x,4),x),_285)
yes