http://www.logos.t.u-tokyo.ac.jp/klic/software/klic/lang/node2.html
とりあえず、1.3章まで読みました。

ガードという概念は、GHCが発祥なのか、それとも、他の言語から論理型言語に
持ってきたのかは、謎なのだけど、今のところ、ゆるい関数型言語というか、Haskellって感じ。
とても似てます。でも、型に厳格でなくて、ガードの処理の順番が決まっていないので
動作が処理系によって異なる。というのが面白いところです。

このあと、いろいろと説明すればよいんでしょうねぇ。
1.2では、構文と実行機構の基本てことで

not(In, Out):- In = 0 | Out = 1.
not(In, Out):- In = 1 | Out = 0.

こういうプログラムが上げられてます。

dでかくとこんな感じです。

void not (in int In, out int Out) {
	if (In == 0) Out = 1;
	if (In == 1) Out = 0;
}

とにかく、返り血ないので、汚れなくてすみます。って違うよ。
うーんHaskellだと

not (in,out) = 
 | in = 1 -> (in, 0)
 | in = 0 -> (out, 0)

かな?あまりやってないんで間違ってるかも。

not (0,out) = (0,1)
not (1,out) = (1,0)

こうとか。

ocamlだと

not (in,out) =
  match (in) with
  | 0 -> (in, 1)
  | 1 -> (in, 0)

というかんじでいいんだっけ?分からなくなってきた。

unifyを基本としてるので、関数の返り値という概念ではなくて、
値がどれか指定して、どれかが戻ってくると言う、
dでいう、inや、outを指定して関数を呼び出す形になっています。
なので、haskellとかで書くと、タプル使えばいいかなぁと思ってこう書いてみました。
そして、haskellocamlなんかのように、ガードを使って場合わけできます。
:- とか.で終わるというのがなんとも、prologてきだなと思うところです。
C言語ライクなのが好きな私としてはこんな感じにして欲しい。

not(In, Out){ | In = 0 -> Out = 1 }
not(In, Out){ | In = 1 -> Out = 0 }

とか思いました。
なんか、nemerleちっくな。

not(In, Out) :- In = 1 | Out = 0.

という節は

not(1, Out) :- true | Out = 0.

と略記でき、

さらに

not(0, Out) :- Out = 1.

と書けるそう。

same(X, Y, R) :- X = Y | R = same.

というものを

same(X, X, R) :- true | R = same.

と、変数同士のunifyもできると。
何もしないtrueで終了だと。

same(X,X,X).

となるとか。

ああ、なんか、自分の文章はやっぱり、分かりにくいな。
まぁいいか。
恥ずかしがってると何もかけなくなるしこれでいいや。
とにかく、関数型に似てるなぁと思いますが、
非決定性ambアミバで、手がなくて秘孔つけない所がいいのだけど、悪いんだろうなという感じです。
Haskellのバグの出にくいところの一つが厳密型チェックで場合わけでない物はないように書くことを
強制されないのは、いいことなのか、悪いことなのかと言う。。。