ECLiPSe CLPでユーザー定義の算術演算子を定義して is で計算してもらえるようにする方法です。
ちなみにisで既定で計算対象となる述語は ここ を参照してください。
ここでは演算子の右と左の数字を直角三角形の高さと幅として、斜辺の長さを計算してくれる my_opという演算子を定義して実際に使ってます。
プログラム:
1 2 3 4 |
:- export op(200 ,yfx ,my_op). my_op(Number1,Number2,Result):- Result is sqrt(Number1 * Number1 + Number2 * Number2). |
実行結果:
1 2 3 |
?- A is 3 my_op 4. A = 5.0 Yes (0.00s cpu) |
演算子の木構造や優先度に関しては以下の記事など参考になります。
[PROLOG] compound term
[Prolog]演算子のカンマとそうでないカンマ、ドット演算子と演算子でないドット(ピリオド)
opのyfxは3つ以上数字がある場合に木構造が左に伸びてくか右に伸びてくかを決定する部分で、
例えば引き算で 6 – 2 -1 と記述した場合、
(6-2)-1 なのか
6-(2-1) なのかで答え変わってきますが、想定しているのは前者です。
このような演算子は yfxで定義します。
200の数字は演算子の優先順位です。200はECLiPSeでは+や-と同じ優先度です。小さいほど優先度が高い。ここは深く考えないでこの数字にしてしまいましたがちゃんと使う場合はまじめな検討が必要です。current_op/3という術語で演算子の優先度や結合の情報(yfxなど)が確認できます。
SWI-PROLOGでも多分同様のことできるとは思うのですが、やり方わかりませんでした。情報求ム。