Prolog 写経記 その 49 agt/2

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

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

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

今日は agt/2 を写経します.

解説

agt(X, Y) はアルファベット順にみて XY より後ろにあるとき成功する.

agt ってぬーらぼのあの人じゃなくて,ASCII の greater than ですね.
Java でいうと... String#compareTo(String) で結果が 0 より大きい (>) みたいな.

モード

agt(+, +).

ふーん.またしても + 二つですか.

定義

では,こいつの定義を写経しませう.

agt(X, Y) :-
	name(X, L),
	name(Y, M),
	agt_ASCII(L, M).
agt_ASCII([_ | _], []).
agt_ASCII([X | _], [Y | _]) :-
	X > Y, !.
agt_ASCII([H | Q], [H | S]) :-
	agt_ASCII(Q, S).

agt/2 本体は昨日の age/2 と同様,アトムを文字コードのリストにしているだけ.
んで,次の agt_ASCII/2 が事実上の本体.
最初の節は終了条件で.
次の節は二つのリストの最初の文字が異なる場合.第 1 引数の最初の文字 X (の ASCII コード) が第 2 引数の最初の文字 Y (の ASCII コード)よりも大きければ成功.
最後の節は第 1 引数の最初の文字と第 2 引数の最初の文字が等しい場合.その場合は残りの文字を再帰的に調べます.

注記

agt は比較対象がアトムでないときは失敗する.

らじゃあ.
っていうか,SWI-Prolog ではうまくいかないわけですが.

では使用例を写経しませう.

2 ?- agt('Word', 'Word').

No
3 ?- agt(predicate, pred).

Yes
4 ?- agt('Jane', 'John').

No
5 ?- agt(-13.7, -13.7).

No

最後の例が写経本の通り No で終わっているのは比較対象がアトムでないからではなく,単に等しいから.
ちゃんちゃん.