IF/Prologでは、オペレ−タは不可欠なものではないということに注意して下さい。オペレ−タは、構文をわかりやすくするために使われます。以下の2つの等価な項のうち、最初の方が簡単でわかりやすくなっています。
Z is 4 + 5 * 3. is(Z, '+'(4, '*'(5,3))).
オペレ−タは、位置、優先順位、結合性の3つの属性を持ちます。
(優先順位)
優先順位は、違う優先順位のオペレ−タを持つ項の解釈のうち、どれを 優先するかを決定するために整数0-1200が使われます。
例えば "a+b*c" は、 a+(b*c) あるいは (a+b)*c と解釈できます。
優先順位の低い項が最も強く結合されます。括弧で囲まれた、あるいは 複合項でない項の優先順位は0です。上記のa+(b*c)という解釈は、"+" が"*"より高い優先順位の場合に選ばれます。(a+b)*cという解釈は"*"が"+"より高い優先順位の場合に選ばれます。
(位置)
位置は、引数に対してオペレ−タをどこに置くかを定義します。以下の 3つの位置をとることができます。
PREFIX(前置) op 項 オペレ−タが単一の引数の「前」に現れる INFIX(中置) 項 op 項 オペレ−タが2つの引数の「間」に現れる POSTFIX(後置) 項 op オペレ−タが単一の引数の「後ろ」に現れる
(結合性)
結合性は、同じ優先順位のオペレ−タを持つ項の解釈のうち、どれを選択するかを決定するために使われます。
例えば"a+b-c"は、a+(b-c)あるいは(a+b)-cと解釈できます。
位置と結合性を表わす属性演算子の分類は、以下のように表記されます。"f"はオペレ−タを表し、"x"と"y" は引数を表します。"x"は、オペレ−タより優先順位の低い引数を表し、"y"はオペレ−タに等しいか、あるいは優先順位の低い引数を表します。
yfx 中置 左から結合 xfy 中置 右から結合 xfx 中置 結合しない fx,fy 前置 xf,yf 後置
式の評価の順序は、式の結合性とオペレ−タの優先順位の両方に依存します。優先順位の低い項が最初に結合されます。複合項でない項や、括弧で囲まれた項の優先順位は0です。
左から結合するオペレ−タ(例えば+,-)では、右側に優先順位の低い引数がきます。式"a+b-c"は、"+"と"-"が左から結合するように定義されているので、"(a+b)-c"と解釈できます(yfx)。
右から結合するオペレ−タでは、左側の引数の主関数子が低い優先順位でなければなりません。"+"と"-"が右から結合する場合(xfy)には、"a+b-c"は、"a+(b-c)"と解釈されます。
xfxは、オペレ−タを結合できないように定義します。つまり、2つの引数中の両方のオペレ−タが、先頭のオペレ−タより低い優先順位にならなければなりません。項"a+b-c"は、"+"がxfxと定義されている場合には違法になります。つまり解釈できないということです。このような使い方は、構文エラ−になります。
括弧は、定義された優先順位を無視するために使われます。"+"は、"*"より高い優先順位ですが、括弧が"+"のオペレ−タを隠すため優先順位が0になり、項"(a+b)*c"は正しく解釈されます。
前置オペレ−タや後置オペレ−タも、同様です。
定義済みの演算子優先順位表
1200 xfx :- , --> 1200 fx ?- , :- 1100 xfy ; 1000 xfy , 900 fy not 700 xfx is , =.. , @>= , @=< , @> , @< 700 xfx \= , \== , = , >= , =< , > , < , =\= , == , =:= 500 yfx - , + , /\ , \/ 500 fx - , + , \ 400 yfx // , / , * , div , << , >> 300 xfx mod 200 xfy ^