Prolog 写経記 その 49 agt/2
(ほぼ) 毎日淡々と Prolog を写経します.元ネタはこちら.
- 作者: ボグダンフィリピッチ,中島誠,伊藤哲郎
- 出版社/メーカー: 海文堂出版
- 発売日: 1990/08
- メディア: 単行本
- 購入: 4人 クリック: 33回
- この商品を含むブログ (68件) を見る
agt/2
を写経します.解説
agt(X, Y)
はアルファベット順にみてX
がY
より後ろにあるとき成功する.
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 引数の最初の文字が等しい場合.その場合は残りの文字を再帰的に調べます.
例
では使用例を写経しませう.
2 ?- agt('Word', 'Word'). No 3 ?- agt(predicate, pred). Yes 4 ?- agt('Jane', 'John'). No 5 ?- agt(-13.7, -13.7). No
最後の例が写経本の通り No
で終わっているのは比較対象がアトムでないからではなく,単に等しいから.
ちゃんちゃん.