Prolog 写経記 その 53 abs/2
(ほぼ) 毎日淡々と Prolog を写経します.元ネタはこちら.
- 作者: ボグダンフィリピッチ,中島誠,伊藤哲郎
- 出版社/メーカー: 海文堂出版
- 発売日: 1990/08
- メディア: 単行本
- 購入: 4人 クリック: 33回
- この商品を含むブログ (68件) を見る
abs/2
を写経します.実は昨日の
fac/2
よりも abs/2
の方が前なのですが,見落としてました...心より恥じる.
解説
abs(X, Abs)
はX
の絶対値を返すか,あるいはAbs
がX
の絶対値かどうかを調べる.
ふむ.
モード
abs(+, ?).
ふむ.
定義
では,こいつの定義を写経しませう.
abs(X, X) :- X >= 0, !. abs(X, Abs) :- Abs is -X, !.
ふむ.
例
では使用例を写経しませう.
3 ?- abs(-27.5, X). X = 27.5 Yes 4 ?- abs(110, -110). Yes
あれれ?
2 番目の例,写経本では冷たく No
と言われることになっているんですけど?
110 の絶対値が -110 だなんてそんなはずは...
うーみゅ,この定義はちょっとイマイチですね.
abs(X, X) :- X >= 0, !.
2 番目の例では X
は 0 以上で,わざわざカットも付いているので次の節は評価されないことを意図しているように見えなくもないのですが,実はそれ以前に第 1 引数と第 2 引数を同一化できないため,このケースではカットは働きませんね.
そして
abs(X, Abs) :- Abs is -X, !.
こちらにはガードがないので -X
が絶対値として求められてしまう,と.
ダメじゃん...
そんなわけで (どんなわけで?),こんな感じかなぁ.
abs(X, Abs) :- X >= 0, !, Abs is X. abs(X, Abs) :- Abs is -X, !.
その結果.
9 ?- abs(-27.5, X). X = 27.5 Yes 10 ?- abs(110, -110). No
いい感じ♪