質問

属性を持つオブジェクトのセットと、オブジェクトのセットに適用されると、それらのオブジェクトのサブセットを提供する一連のルールがあります。理解しやすいように、具体的な例を示します。

私のオブジェクトは人物であり、それぞれに 3 つの属性があります。出身国、性別、年齢層 (すべての属性は個別です)。「すべて米国の男性」など、この大きなオブジェクトのセットのサブセットに対応するルールをたくさん持っています。

私は、ルールから人のサブセットにマッピングできる既存の Java 「推論エンジン」または類似のものを探しています。あるいは、独自の推論エンジンを作成する方法についてのアドバイスを探しています。ルール エンジンについて読んだことがありますが、この用語はビジネス ルールを外部化するエキスパート システムにのみ使用されるようで、通常は高度な形式の推論は含まれません。ここでは、対処しなければならないより複雑なシナリオの例をいくつか示します。

  1. ルールの結合が必要です。したがって、「すべての男性を含める」と「10 ~ 20 歳の米国人をすべて除外する」の両方が提示された場合、私は米国外の男性と、10 歳未満の米国内の男性にのみ興味があります。 20歳のグループ。

  2. ルールには異なる優先順位 (明示的に定義) が設定される場合があります。したがって、「すべての男性を除外する」というルールは、「すべての米国男性を含める」というルールをオーバーライドします。

  3. ルールが矛盾している可能性があります。したがって、「すべての男性を含める」と「すべての男性を除外する」の両方を設定することもできます。その場合、優先順位によって問題を解決する必要があります。

  4. ルールは対称的です。したがって、「すべての男性を含める」は「すべての女性を除外する」と同じです。

  5. ルール (またはサブセット) には、メタ ルール (明示的に定義) が関連付けられている場合があります。これらのメタ ルールは、元のルールが適用される場合、または推論によってサブセットに到達する場合に適用する必要があります。したがって、「米国を除外する」というメタ ルールが「すべての男性を含む」ルールに付加され、エンジンに「すべての女性を除外する」ルールを提供すると、「すべての女性を除外する」サブセットが推論できるはずです。これは「すべての男性を含む」サブセットと同等であるため、「米国を除外する」ルールが追加で適用されます。

おそらく項目 5 がなくても生きていけますが、言及されている他のプロパティはすべて必要です。ルールとオブジェクトは両方ともデータベースに保存されており、いつでも更新される可能性があるため、必要に応じて「推論エンジン」をインスタンス化し、後で破棄する必要があります。

役に立ちましたか?

解決

Java用のプロログのようなSLDソルバーが埋め込まれています。私のお気に入りのアプローチは使用することです Scalaのミニカンレン, 、それはきれいであり、Scalaを使用してクエリの結果を怠lazに処理することができますが、私はそれを深く使用していません。見る Java用の埋め込みプロログインタープリター/コンパイラ 他のオプションとロスの答え。

SLDソルバーは、Prologが持っているいくつかの追加機能がある場合、すべての基準を処理します。

  1. ルールの接続:基本的なSLDゴール処理。
  2. ルールには異なる優先順位がある場合があります。Prologのカットルールは、クエリが決定可能である場合、否定の表現を許可します。
  3. ルールは矛盾する可能性があります。繰り返しますが、カットを使用すると、優先度の高い目標が満たされている場合、より低い優先度の条項が適用されないようにすることができます。これを行う方法はいくつかあります。
  4. ルールは対称です。カットを使用すると、決定可能な述語に対してこれが簡単に保証されます。
  5. ルール(またはむしろサブセット)には、それらに関連付けられたメタルール(明示的に定義されている)がある場合があります。あなたの例は、これが4に相当することを示唆しているようですので、ここであなたが何であるかを理解していません。

説明論理ベースのツールを介したSLDソルバーの利点と短所は次のとおりです。

  1. プログラマティックパワー、柔軟性:一般に、モデリングの困難に対するプログラミングソリューションを見つけることができます。説明ロジックでは、モデルを再考する必要がある場合があります。しかし、もちろん、ダクトテープがないということは、説明論理ソリューションがあなたをきれいにすることを強制することを意味します。これは良い規律かもしれません。
  2. 堅牢性:SLDソルバーは非常によく理解されているテクノロジーですが、説明ロジックツールは、博士論文の出生から多くのステップではないことがよくあります。
  3. セマンティックツールの欠如:説明ロジックには、1次ロジックとモデルロジックとの優れたリンクがあり、それらについて推論する非常に豊富なテクニックセットを提供します。 Prologの柔軟性は通常、これを非常に難しくします。

説明論理に関する特別な専門知識がない場合は、SLDソルバーをお勧めします。

他のヒント

あなたが説明しているケースでは、前方チェーンではなく、後方を追跡することを望んでいると思います(DroolsのようなRetEシステムは、デフォルトの動作において、前方チェーンです)。

チェックアウト トゥプロロジー. 。 Java、100%Pure Javaで簡単に縛り、間違いなくあなたが望む推測を行うことができます。ルールセットを特徴付けるために、Prologについて十分に理解する必要があります。

プロバ 推論を行い、複雑なルールシステムを処理することもできます。

これは、私にとって説明のロジックと知識の基盤のように聞こえます。概念、役割、個人があります。

説明のロジックベースの推論として問題を展開したい場合は、問題をモデル化して、その推論を実行する必要があります。

いくつかの無料の推論者がいますfaveraibe、リストを見つけることができます ここ.

ただし、これはむしろ複雑でありながら強力なアプローチであることに注意してください。

あなたは特別な見方をしたいかもしれません Kaon2掘る Javaを使用する場合。

私はあなたがある種を使うことができると信じています ID3アルゴリズム オブジェクトの初期状態から一連のルールを抽出します。具体的なJavaの実装はわかりませんが、WikipediaはRubyからCまでのさまざまな実装を指しています(複数のハイパーリンクを投稿することはできません:-))が、学習するのは難しいアルゴリズムではありません。

ルール形式で表現できる決定ツリーを構築すると、それを使用して、オブジェクトがどのクラスに属しているかを確認できます。米国からのすべての男性、10〜20のすべての女性に...データベース内のオブジェクトは、決定ツリーを再構築できます。

わかりました、これは愚かな答えかもしれません。しかし、私はとにかく試してみます....あなたはBeanshellを使用してこのようなものを作ることができます:

  • Inicialsetにあるセット要素を返し、パラメージに一致するSECT(Inicialset、Paramname、Paramvalue)のようなもの)を作成します。

  • 素敵なBeanshellスクリプトを書くのに役立つ定数を作成します。

これにより、ルールを簡単なスクリプトとネストルールとして記述できます。

したがって、この

ルールの接続が必要です。したがって、「すべての男性を含む」と「10〜20歳のすべての米国人を除外する」の両方を提示した場合、私は米国以外の男性と10の外にある米国内の男性にのみ興味があります - 20歳のグループ。

このようなスクリプトになります:

originalSet = getOriginalSet(); //Get all from DB

//elements in originalSet that have gender=male
males = select(originalSet, PARAM.GENDER, GENDER.MALE);

//elements in males that have age in [10,20]
youngMaleGuys = select(males, PARAM.AGE, AGE.10_20);

//Exclude from
males.removeAll(youngMaleGuys);

notYoungUSMaleGuys = select(males, PARAM.COUNTRY, COUNTRY.US);

males.removeAll(notYoungUSMaleGuys);

return resp;

もちろん、これはひどいです。私は今それを作りました。しかし、非常に素敵なコマンドを書いて、これをより読みやすくする方法を見つけることができます。

それほど速くはありませんが、マンテンと読みやすい(私は思う)。そして、あなたは注文を心配する必要はありません

それでおしまい。私は試した。 :)

最も強力な Java ベースのプロダクション ルール エンジン (推論エンジン) の 1 つは、JBoss DROOLS です。

http://jboss.org/drools

ただし、正直に言うと、アプリケーションがよほど複雑でない限り、ルール エンジンを使用するのはやりすぎです。一方、アプリケーションが大きくなりすぎて、競合するルールが多すぎる場合は、結果を提供できなくなります。

顧客や問題の領域をより適切に制御できる場合は、推論エンジンを完全に回避する方が良いでしょう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top