2

データを解釈するためのルールベースのシステムを構築しようとしています。ただし、ルールを保存および解釈するためのロジックを構築する方法を決定する際に問題が発生しています。

現在、非常に複雑なデータベース構造がありますが、ルール データを保存するすべての側面を処理します。システムは、MS Outlook でユーザーがルールを追加できる方法を模倣できるようになるという考えです。

私の問題は次のとおりです。

  1. これらのルールをオブジェクト内に格納するには、どのパターンを使用する必要がありますか?
  2. ルールを実行するには、eval() または適切なオブジェクト指向を使用する必要がありますか?

ルールの例は次のとおりです。

エリアパークでは犬に首輪が必要

各要素 (犬、必須、首輪、エリア内、公園) は、解釈される個別のロジックです。

上記の質問に対する一般的なアドバイスをいただければ幸いです。

4

2 に答える 2

1

おそらくこの答えはあなたにとって取るに足らない/明白すぎるでしょうが、私はZendFrameworkアプリケーションである私の現在の既存のプロジェクトでそのようなものをどのように解決するかを考えました。filter-とvalidatorChainsZFが使用するものについて考えました。可能な入力オブジェクトの数、条件/制約の数、アクションの数が限られていると仮定します。その場合、最初にオブジェクトをインスタンス化し、一連の条件(バリデーター)に対して実行します。すべての条件が満たされた場合は、actionChainに対してオブジェクトを実行します。ここでは、いくつかのアクションを他のアクションよりも先に実行する必要があるため、おそらく何らかのアクション優先システムを実装する必要があります。「通知を送信する」そして「問題のオブジェクトを削除する」のように。したがって、ZFでは、すべての条件/制約に対してカスタムバリデーターを構築します。私はしません

データベースには、実際のルール用のテーブル、条件用のテーブル、およびアクション用のテーブルがあります。次に、ルールを必要なすべての条件およびアクションにリンクする2つの多対多のテーブルが存在する可能性があります。

于 2009-03-12T15:15:00.033 に答える
1

「現実世界」のコンテキストで説明したようなシステムを実装したことはありませんが、趣味のプロジェクトとしてかなりの量をプレイしました。私が好むアプローチは、 Prologのようなある種の論理言語を使用してアサーションを作成し、それらをチェックすることです。公園がどこにあるか、何かを持っているとはどういう意味か、犬とは何かについてのアサーションがあり、投稿の下部にある括弧内の例とほぼ同じルールを作成します。私の Prolog がさびすぎて、役立つ例を提供できなくて申し訳ありません... 私は自家製の推論言語であまりにも長い間遊んできました。

PHP5 についてはわかりませんが、ほとんどの言語に組み込むことができる Prolog インタープリターがあります。Prolog インタープリターが見つからない場合は、独自に作成したルール データ構造に対して前方連鎖推論を実行する単純なものをかなり短い順序でまとめることができます。自動推論に関するこれらのメモに興味があるかもしれません。

于 2009-03-12T14:31:15.957 に答える