私は Prolog インタープリターを実装しており、組み込みの数学関数 (合計、積など) を組み込みたいと考えています。たとえば、次のような知識ベースを使用して計算できるようにしたいと考えています。
NetForce(F) :- Mass(M), Acceleration(A), Product(M, A, F)
Mass(10) :- []
Acceration(12) :- []
それで、次のようなクエリを作成できるはずです?NetForce(X)
。私の質問は、このような機能をインタープリターに組み込む正しい方法は何ですか?
特に、私が直面している問題はSum
、Product
、 などを評価するために、最初にすべての引数を評価する (つまり、数値定数にバインドする) 必要があることです。たとえば、上記の to コードは適切に評価されるはずですが、並べ替えられたルールは次のようになります。
NetForce(F) :- Product(M, A, F), Mass(M), Acceleration(A)
タームが処理されるときにM
andA
がバインドされないためです。Product
私の現在のアプローチは、単に項を並べ替えて、数式が最後に現れるようにすることです。これは単純なケースでは機能しますが、ハッキリしているように見えます。また、複数の数学用語や再帰がある状況では問題が発生することが予想されます。より良い解決策はありますか?