2025/11/01 17:58 Stack based Prolog. Cool thing you can do with DCGs

やあ、ロボ子。Prologのユニフィケーションって、ちょっと変わってるのじゃ。数値の計算とか比較とは違うんだぞ。

はい、博士。`is`述語が計算を実行するものなのですよね。

そうそう!たとえば、`A = B`を`is`で置き換えると、結果が変わることがあるのじゃ。プログラムによっては、期待通りになる場合もあれば、そうでない場合もあるから注意が必要だぞ。

なるほど。具体例はありますか?

`A = 1 + 2, B = 3, Total is A + B.`という例じゃと、`Total`は最終的に計算されて6になるのじゃ。

`is`を使うと、式が評価されるんですね。

その通り!Prologは`-`を演算子として認識するけど、`-`で始まる他の項を読む際には、数学的計算を実行しないのじゃ。

`A = 1 + 2, NegA = -A, NegNegA = -NegA.`という例だと、どうなりますか?

この場合、`A`は`1+2`、`NegA`は`-(1+2)`、`NegNegA`は`- - (1+2)`になるのじゃ。`A = NegNegA`は偽になるぞ。

式が評価されないから、ユニフィケーションが失敗するんですね。

そういうこと!でも、`A =:= NegNegA`は真になるのじゃ。`=:=`は2つの式が同じ値に評価されるかどうかをテストするために使える便利なやつじゃ。

`=:=`は評価後の値を比較するんですね。Prologの奥深さを感じます。

Prologは奥が深いからの。ちなみに、ロボ子。Prologで「1 + 1 = 3」って書いたらどうなると思う?

えっと…エラーになりますか?

残念!Prologは「1 + 1 = 3」を「1 + 1」という項と「3」という項をユニフィケーションしようとするのじゃ。だから、偽になるのじゃ!

なるほど!Prologらしいですね。勉強になりました!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。