1

私は Prolog インタープリターを実装しており、組み込みの数学関数 (合計、積など) を組み込みたいと考えています。たとえば、次のような知識ベースを使用して計算できるようにしたいと考えています。

NetForce(F) :- Mass(M), Acceleration(A), Product(M, A, F)
Mass(10) :- []
Acceration(12) :- []

それで、次のようなクエリを作成できるはずです?NetForce(X)。私の質問は、このような機能をインタープリターに組み込む正しい方法は何ですか?

特に、私が直面している問題はSumProduct、 などを評価するために、最初にすべての引数を評価する (つまり、数値定数にバインドする) 必要があることです。たとえば、上記の to コードは適切に評価されるはずですが、並べ替えられたルールは次のようになります。

NetForce(F) :- Product(M, A, F), Mass(M), Acceleration(A)

タームが処理されるときにMandAがバインドされないためです。Product私の現在のアプローチは、単に項を並べ替えて、数式が最後に現れるようにすることです。これは単純なケースでは機能しますが、ハッキリしているように見えます。また、複数の数学用語や再帰がある状況では問題が発生することが予想されます。より良い解決策はありますか?

4

3 に答える 3

2

あなたが説明している機能は、制約拡張として既存のシステムに存在します。有理数には CLP(Q) があり、実数には CLP(R) があります。実際には浮動小数点数です。最後に、CLP(Z) に拡張されることが多い CLP(FD) があります。例を参照してください library(clpfd)

いずれにせよ、Prolog の実装をゼロから始めるのは簡単なことではありません。実装したいものを調査する時間はありません。はるかに低レベルの詳細が殺到するからです。したがって、より経済的なアプローチを使用して、実際に何をしたいのかを明確にする必要があります。

既存のシステムで制約言語を研究して実装するかもしれません。または、メタインタープリター ベースのアプローチを使用することもできます。または、Prolog システムを最初から実装したい場合もあります。しかし、すべてにおいて成功するとは期待しないでください。

もう 1 つの労力を節約するには、既存の標準構文を再利用します。使用する構文では、追加のパーサーを作成する必要があります。

于 2013-11-14T20:59:30.850 に答える
0

あなたの述語は句の順序に依存しません。これは非常に重要です。述語の使用モードを決定する必要があります - NetForce() の使用モードは何ですか? Force のような述語を設計する場合は、次のようにします。

force(Mass,Acceleration,Force):- Force is Mass * Acceleration.

これには、+、+、- の使用モードがあります。つまり、あなたは私に質量と加速度を与え、私は力を与えます。

そうでなければ、変数を統合するために定義した事実に依存していることになります。最初にそれらを Product に渡すと、それらは統合と統合を続け、停止することはありません。

于 2013-11-14T20:50:07.547 に答える