Prolog 写経記 その 53 abs/2

(ほぼ) 毎日淡々と Prolog を写経します.元ネタはこちら.

Prologユーティリティライブラリ

Prologユーティリティライブラリ

今日は abs/2 を写経します.
実は昨日の fac/2 よりも abs/2 の方が前なのですが,見落としてました...
心より恥じる.

解説

abs(X, Abs)X の絶対値を返すか,あるいは AbsX の絶対値かどうかを調べる.

ふむ.

モード

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

いい感じ♪