Naming
This operator is called "power" in the ISO standard of 1995, page 119.
More on operators:
As Wouter Beek says:
Notice that the precedence of (**)/2 is xfx, which is different from that of (^)/2, which is xfy.
These operators also have the same precedence, 200 (pretty strong), same as the precedence of unary -
. (see op/3)
?- write_canonical( (Y = 2, X is 2 ** (-Y)) ). ','(=(A,2),is(_,**(2,-(A))))
What's interesting is that **
must be "alone" in a non-parenthesized expression (the operator is xfx, non-associative), whereas ^
can chain, associating to the right (the operator is xfy, right-associative):
?- write_canonical( x ** y ** z ). ERROR: Syntax error: Operator priority clash ?- write_canonical( x ** (y ** z) ). **(x,**(y,z))
But:
?- write_canonical( x ^ y ^ z ). ^(x,^(y,z)) true.