Hatena::Groupbluespear

bluespearの勉強メモ

2008-06-18

[]SWI-Prologの基本的な使い方 10:23

SWI-Prolog限定なのかProlog仕様なのかわからないけど。後で調べる。

カレントディレクトリの変更, 確認

?- chdir('z\\prolog').

Yes
?- pwd.
z:\prolog

Yes

\は2重にしないとだめみたい。

ソースファイルの読み込み

?- ['source.pl'].

読み込まれた述語の表示

?- listing.

last([A], A).
last([A|B], C) :-
        last(B, C).


lastigai([A], []).
lastigai([A|B], [A|C]) :-
        lastigai(B, C).

[]基本的な文法 10:23

独特すぎて1週間ですっかり忘れてたのでメモ。よくわからずに書いてるので間違いが含まれてる可能性大。

Prologとは

論理言語であり、論理式で定義を行う。

関数定義

こんな感じ。

kei([],0).
kei([A|L], S) :- kei(L, SL),
                 S is A + SL.

頭部と体部をつなげる :- は、:=ではないので注意。これで15分悩んだ:p




変数

変数大文字から始まる。パターンマッチングに使う。

Prolog変数C言語でいうポインタの扱いらしい。要するにリファレンス

演算結果を変数にセットする is
?- X is 1 + 2.
X = 3

Yes

パターンマッチング = とは違う。

[]isと=の違い 10:23

isは計算しろ、という命令。

=は等しいということを示す。

f([], []).
f([X|L], [FX|FL]) :- FX is X*X,
                      f(L, FL).

?- f([3,4,5], X).
X = [9, 16, 25] 
f([], []).
f([X|L], [FX|FL]) :- FX = X*X,
                      f(L, FL).

?- f([3,4,5], X).
X = [3*3, 4*4, 5*5] 

ちなみに直接関数の中に計算式を入れるのと=は同じ。

f([], []).
f([X|L], [X*X|FL]) :- f(L, FL).

?- f([3,4,5], X).
X = [3*3, 4*4, 5*5] 

[]if then elseのようなことをする ! カットオペレータ 10:23

! (カットオペレータ)を用いる。

ここまで成立すると下の行にいかない。

abs(A, A) :- A > 0, !.
abs(A, MA) :- MA is -A.

max(X,Y,X) :- X>Y, !.
max(X,Y,Y).