Prolog基礎
定数・変数
定数
数値
10進数の数値は,普通に書ける.小数点を書かなければ,整数値とみなされる.?- X is 10. X = 102進数,8進数,16進数は,0b, 0o,0xでそれぞれ,書ける
?- A is 0b10, B is 0o10, C is 0x10. A = 2, B = 8, C = 162から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 = aformatを使えばよい.
?- 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
数値比較演算子(左辺・右辺とも展開される)
演算子 | 説明 |
---|---|
=:= | 等しい |
=\= | 等しくない |
< | 小なり |
> | 大なり |
=< |
小なりイコール |
>= |
大なりイコール |