Loading article…
JessはJavaコンピューティング プラットフォーム用のルール エンジンで、 Javaプログラミング言語で記述されています。これは、サンディア国立研究所のアーネスト フリードマン ヒルによって開発されました。[ 1 ]これはCLIPS言語の上位互換です。[ 1 ]最初に書かれたのは 1995 年後半です。[ 1 ]この言語は、エキスパート システムの自動化のためのルール ベースのプログラミングを提供し、エキスパート システム シェルと呼ばれることがよくあります。[ 1 ]近年では、同様の機能に依存するインテリジェント エージェントシステムも開発されています。
手続き型パラダイムでは、1 つのプログラムが一度だけ実行されるループを持ちますが、宣言型パラダイムでは、パターンマッチングと呼ばれるプロセスによって、一連のルールを事実のセットに継続的に適用します。ルールは事実のセットを変更したり、任意の Java コードを実行したりできます。ルールを実行するためにRete アルゴリズム[ 1 ]を使用します。
Jessのライセンスは、教育機関および政府機関での利用はフリーウェアですが、商用利用はライセンスが必要なプロプライエタリソフトウェアです。一方、Jessの基盤であり、開発の出発点となったCLIPSは、フリーかつオープンソースのソフトウェアです。
コード例:
; はコメントです( bind ?x 100 ); x = 100( deffunction max ( ?a ?b ) ( if ( > ?a ?b ) then ?a else ?b ))( deffacts myroom ( furniture chair ) ( furniture table ) ( furniture bed ) )( deftemplate car ( slot color ) ( slot mileage ) ( slot value ) )( assert ( car ( color red ) ( mileage 10000 ) ( value 400 )))サンプルコード:
( clear ) ( deftemplate blood-donor ( slot name ) ( slot type )) ( deffacts blood-bank ; 名前とそのタイプを [[working memory]] に格納します( blood-donor ( name "Alice" )( type "A" )) ( blood-donor ( name "Agatha" )( type "A" )) ( blood-donor ( name "Bob" )( type "B" )) ( blood-donor ( name "Barbara" )( type "B" )) ( blood-donor ( name "Jess" )( type "AB" )) ( blood-donor ( name "Karen" )( type "AB" )) ( blood-donor ( name "Onan" )( type "O" )) ( blood-donor ( name "Osbert" )( type "O" )) ) ( defrule can -give-to-same-type-but-not-self ; A > A、B > B、O > O、AB > AB は処理しますが、N1 > N1 は処理しません( blood-donor ( name ?name )( type ?type )) ( blood-donor ( name ?name2 )( type ?type2 &: ( eq ?type ?type2 ) &: ( neq ?name ?name2 ) )) => ( printout t ?name " can give blood to " ?name2 crlf ) ) ( defrule O-gives-to-others-but-not-itself ; O to O は上記のルールでカバーされます( blood-donor ( name ?name )( type ?type &:( eq ?type "O" ))) (献血者(名前?name2 )( type ?type2 &: ( neq ?type ?type2 )&: ( neq ?name ?name2 ) )) => ( printout t ?name " can give blood to " ?name2 crlf ) ) ( defrule A-or-B-gives-to-AB ; case O gives to AB and AB gives to AB already dealt of ( blood-donor ( name ?name )( type ?type &: ( or ( eq ?type "A" ) ( eq ?type "B" )))) ( blood-donor ( name ?name2 )( type ?type2 &: ( eq ?type2 "AB" ) &: ( neq ?name ?name2 ) )) => ( printout t ?name " can give blood to " ?name2 crlf ) ) ;(watch all) ( reset ) ( run )