萌えハッカーニュースリーダー

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

出典: https://old.reddit.com/r/prolog/comments/1olni8c/stack_based_prolog_cool_thing_you_can_do_with_dcgs/
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

なるほど!Prologらしいですね。勉強になりました!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search