user-defined+operators

op/3 and current_op/3
These predicates allow the operator table to be altered or inspected.

is true, with the side effect that > || fx || prefix || no || > || fy || prefix || yes || > || xf || postfix || no || > || yf || postfix || yes || > || xfx || infix || no || > || yfx || infix || left || > || xfy || infix || right || It is forbidden to alter the priority or type of ','. It is forbidden to have an infix and a postfix operator with the same name, or two operators with the same class and name. The initial operator table is given by //Template:// //Errors://
 * 1) if  is 0 then  is removed from the operator table, else
 * 2)  is added to the Operator table, with priority (lower binds tighter)  and associativity determined by according to the rules:
 * Specifier || Type || Associativity ||
 * Priority || Specifier || Operator(s) ||
 * 1200 || xfx || :- --> ||
 * 1200 || fx || :- ?- ||
 * 1100 || xfy || ; ||
 * 1050 || xfy || -> ||
 * 1000 || xfy || ',' ||
 * 900 || fy || \+ ||
 * 700 || xfx || = \= ||
 * 700 || xfx || == \== @< @=< @> @>= ||
 * 700 || xfx || =.. ||
 * 700 || xfx || is =:= =\= < =< > >= ||
 * 500 || yfx || + - /\ \/ ||
 * 400 || yfx || * / // rem mod << >> ||
 * 200 || xfx || ** ||
 * 200 || xfy || ^ ||
 * 200 || fy || - \ ||
 * 1)  is a variable -- [|instantiation_error]
 * 2)  is a variable -- [|instantiation_error]
 * 3)  is a partial list or a list with an element  which is a variable -- [|instantiation_error]

//Template:// //Errors://
 * 1)  is neither a variable nor an operator priority -- [|domain_error(operator_priority, Priority)]
 * 2)  is neither a variable nor an operator specifier -- [|domain_error(operator_specifier, Op_specifier)]
 * 3)  is neither a variable nor an atom -- [|type_error(atom, Operator)]