自分のためのTips、誰かの為にもなるといいな・・・

Prolog基礎


定数・変数

定数

数値

10進数の数値は,普通に書ける.小数点を書かなければ,整数値とみなされる.
?- X is 10.

X = 10
2進数,8進数,16進数は,0b, 0o,0xでそれぞれ,書ける
?- A is 0b10, B is 0o10, C is 0x10.

A = 2,
B = 8,
C = 16
2から36進数までは,基数を指定して書ける.Edinburgh Prolog Standardらしい.
?- X is 3'10.

X = 3
小数点をつけると浮動小数点数になる.
?- X is 10.0.

X = 10.0 
指数表現でも書ける
?- X is 2e3, Y is 1.5e4.

X = 2000.0,
Y = 15000.0

アトム

アトムは,名前を表す記号で,プログラム中の小文字で始まる全ての文字列.および,引用符 ' で囲まれたもの(引用アトム).
また,特殊文字からなるものもある.漢字などもアトム.
引用アトムには,「\」によるエスケープ文字が使えるが使える.
この説明は,大雑把でいい加減なので,正確に知りたければ他の情報を参考にする事.
?- atom(abc).

Yes

文字と文字列

実際の文字と文字列は,アトムである.
ここで,説明するのは文字コードとしての文字列表現について.
文字コードは,以下のように書ける.
?- X = 0'A.

X = 65
次は,エスケープを使う例
?- X = 0'\n.

X = 10
文字列を文字コードのリストとして書くことができる.ダブルクォーテーションで括るだけ.
?- X = "ABC".

X = [65, 66, 67]
文字列処理といった場合,文字コードに対する処理なのか,アトムに対する処理なのか考えてみるといいかもしれない.
アトムをリスト化して,一文字ずつ扱うこともできるし(atom_chars),コードのリストを扱う事も出来る.

でも結局変換は,可能で,文字コードを文字として出力する場合,
先にアトムに変換するか,
?- atom_codes(X, "a"), write(X).
a

X = a 
formatを使えばよい.
?- format('~c ~s', [0'a , "b"]).
a b

変数

変数は,大文字またはアンダースコアで始まる.

基本的な構文

And と Or

ANDはコンマ,ORはセミコロン.簡単な例.
hoge(X,Y) :- X > Y, write('ok!'); write('ng!').

同じ内容のORを,以下のように書ける.
hoge(X,Y) :- X > Y, write('ok').
hoge(X,Y) :- write('ng').

入れ子にしたい場合,括弧を使えば良い.
hoge(X,Y,Z) :-
  X < Y, (
    Y < Z, write('xyz');
    X < Z, write('xzy');
    write('zxy')
  );
    X < Z, write('yxz');
    Y < Z, write('yzx');
    write('zyx').
if文のように使うことができる.

If と Else

次のように定義されている.
If -> Then; _Else :- If, !, Then.
If -> _Then; Else :- !, Else.
If -> Then :- If, !, Then.
上のAnd と Or による条件分岐より分かりやすく表現できる.使用例.
X > 10 -> write('Large'); write('small').

true と fail

trueは常に成功,fail は常に失敗.
?- true; write('Hello').

Yes
?- fail; write('Hello').
Hello

Yes

repeat

repeatは常に成功.さらに,バックトラックの無限の分岐点となる.
次の例は,C(67)が入力されるまで,入力を読み続ける.
?- repeat, get(67)
|: A
|: B
|: C

Yes

否定

例えば,上の条件分岐の条件を反転してみる
\+ X =< 10 -> write('Large'); write('small').
not(X =< 10) -> write('Large'); write('small').
notは,古い形で \+ を使うのが推奨されているみたい.

演算子

割り算

整数
X is Y // Z
実数
X is Y / Z
 余り
X is Y mod Z

数値比較

等しい

is は,右辺だけ展開される,
?- 6 is 2 * 3.

Yes
?- 2 * 3 is 6.

No
型まで一致しないとダメ.(integer, float)
?- 6 is 4 * 1.5.

No
?- 6.0 is 4 * 1.5.

Yes
=:= 左右とも展開され,数値の一致を見ている.
?- 2 * 3 =:= 4 * 1.5.

Yes

数値比較演算子(左辺・右辺とも展開される)

演算子 説明
=:= 等しい
=\= 等しくない
< 小なり
> 大なり
=<
小なりイコール
>=
大なりイコール



最終更新 2007/12/14 01:43:20 - yohei
(2007/10/03 23:46:22 作成)


検索

最近気になる言葉
LINQ
atコマンド
最近更新したページ
2015/7/16
2008/9/15
2008/1/30
2007/12/14
2007/11/14
2007/10/25
2007/9/23
2007/5/30