これは簡単な質問です。この例は、Prolog の教科書で見たことがあります。カットを使用して if-then-else を実装しています。
if_then_else(P, Q, R) :- P, !, Q.
if_then_else(P, Q, R) :- R.
このプログラムが何をしているのか、なぜ便利なのか説明できる人はいますか?
これは簡単な質問です。この例は、Prolog の教科書で見たことがあります。カットを使用して if-then-else を実装しています。
if_then_else(P, Q, R) :- P, !, Q.
if_then_else(P, Q, R) :- R.
このプログラムが何をしているのか、なぜ便利なのか説明できる人はいますか?
このプログラムについて注意すべき最も重要なことは、それは間違いなく良い関係ではないということです.
たとえば、純粋な論理プログラムから、結果を渡すと条件が成立したかどうかを導き出すことができると期待しています。これはもちろん、最初に条件をチェックし、他のすべてが条件に依存する手続き型プログラミングとは対照的です。
また、他のプロパティが侵害されます。たとえば、条件が実際にバックトラックするとどうなるでしょうか? 条件の最初の解だけでなく、各解の結論を見たいとします。あなたのコードは、これらの追加のソリューションを切り離しています。
他の場合にもリレーションを使用したいと思います。たとえば、コード内の余分なif-then-else 構造を検出したいとします。これらは、次のようなクエリに対するソリューションです。
?- if_then_else(NoMatter, Same, Same).
純粋な関係であればif_then_else/3
、それを使用してそのようなクエリに答えることができます。現在実装されているため、このようなクエリでは正しくない結果が得られます。
詳細については、 logical-purityおよびif_/3
を参照してください。