7

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

私のオブジェクトは人であり、それぞれに3つの属性があります。出身国、性別、年齢層です(すべての属性は個別です)。「米国のすべての男性」のように、このより大きなオブジェクトのセットのサブセットに対応する一連のルールがあります。

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

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

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

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

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

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

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

4

6 に答える 6

3

Java には、組み込みの Prolog に似た SLD ソルバーがたくさんあります。私のお気に入りのアプローチは、Scala に mini-Kanren を使用することです。これはクリーンであり、Scala を使用してクエリの結果を遅延処理できるためですが、詳細には使用していません。他のオプションについては、Embedded Prolog Interpreter/Compiler for Javaと Ross の回答を参照してください。

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

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

記述ロジックベースのツールに対する SLD ソルバーの利点と欠点は次のとおりです。

  1. プログラムの力、柔軟性: 一般に、記述ロジックによってモデルの再考が必要になる可能性があるモデリングの問題に対するプログラミングの解決策を見つけることができます。しかし、もちろん、ダクトテープが存在しないということは、記述ロジックのソリューションによってクリーンであることを強制されることを意味し、これは良い訓練になるかもしれません。
  2. 堅牢性: SLD ソルバーは非常によく理解されているテクノロジですが、記述ロジック ツールは、博士論文での誕生から多くのステップを踏んでいないことがよくあります。
  3. セマンティック ツールの不在: 記述ロジックには、一次ロジックおよびモデル ロジックとの適切なリンクがあり、それらについて推論するための非常に豊富な一連の手法が提供されます。通常、Prolog の柔軟性により、これは非常に困難になります。

記述ロジックに関する特別な専門知識がない場合は、SLD ソルバーをお勧めします。

于 2010-10-22T09:18:58.603 に答える
2

あなたが説明しているケースでは、フォワード チェーンではなく、バックワード チェーンを使用することをお勧めします (Drools のような RETE システムは、デフォルトの動作でフォワード チェーンです)。

tuPrologをチェックしてください。Java と簡単にバインドでき、100% 純粋な Java であり、必要な推論を確実に行うことができます。ルール セットを特徴付けるには、Prolog について十分に理解する必要があります。

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

于 2010-10-19T14:39:00.957 に答える
0

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

http://jboss.org/drools

正直なところ、アプリケーションがもっと複​​雑にならない限り、ルールエンジンを使用するのはやり過ぎです。一方、アプリケーションが大きくなりすぎて、競合するルールが多すぎると、結果を提供できなくなります。

顧客または問題のドメインをより適切に制御できる場合は、推論エンジンを完全に回避することをお勧めします。

于 2010-09-23T12:27:09.707 に答える
0

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

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

于 2010-06-23T10:26:52.833 に答える
0

This pretty much sounds like description logic and knowledge bases to me. You have concepts, roles and individuums.

If you want to roll out your problem as description logic-based reasoning, you should be fine modeling your problem and execute a reasoner on it.

There are some free reasoners availaibe, a list can be found here.

Note however, that this is rather a complex yet powerful approach.

You might want to have a special look at KAON2 and DIG when using Java.

于 2010-05-24T14:08:31.770 に答える
0

わかりました、これはばかげた答えかもしれません。しかし、とにかく試してみます.... BeanShell を使用して、次のようなものを作成できます。

  • inicialSet にあり、パラメーターに一致するセット要素を返す単純なセレクター コマンド ( select(initialSet, paramName, paramValue) のようなもの) を作成します。

  • 適切な BeanShell スクリプトを作成するのに役立ついくつかの定数を作成します。

このようにして、ルールを単純なスクリプトとして記述し、ルールをネストすることができます。

したがって、この

ルールの結合が必要です。したがって、「すべての男性を含める」と「10 ~ 20 歳のグループのすべての米国人を除外する」の両方が提示された場合、私は米国外の男性と 10 ~ 20 歳以外の米国内の男性のみに関心があります。 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;

もちろん、これはだめです。今できました。しかし、非常に優れたコマンドを記述して、これをより読みやすくする方法を見つけることができます。

それほど速くはありませんが、管理と読み取りは簡単です(私はそう思います)。そして、あなたは注文について心配する必要はありません

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

于 2010-09-16T19:48:17.267 に答える