問題タブ [pyclips]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
rule-engine - PyCLIPS: エラーから回復する方法
PyCLIPS を使用して、ECA サーバー (event-conditon-action) として機能するプログラムに CLIPS を統合しています。システム状態とともに、メッセージ バスでアクションを発行するルールをトリガーする場合とトリガーしない場合がある受信イベントがあります。
システム状態は、受信イベントに応じてスロットが変更されるインスタンスの形で現れます。
このソフトウェアは長寿命のサービスであることを意図していますが、ルールの実行中にエラーが発生した場合、たとえば名前の誤ったハンドラーによって次のようになります。
クリップ セッションが新しいメッセージに応答しなくなります。スロットは次を使用して更新されなくなりました:
clips.DebugConfig.WatchAll()
デバッグ出力がない場合でも、クリップでは何も起こりません。
例:
これを回避したり、この状態から回復したりする可能性はありますか?
python-2.7 - PyCLIPS を介して CLIPS から Python に大きな数値 (Python の int より大きい) を渡す
PyCLIPS は、非常に大きな数値を変換する前に int に変換しているようです。
変換はこちらPython -> CLIPS
しかし、ここでも変換 CLIPS -> Python
CLIPSにもPyCLIPSにも、長い間タイプがないというのは正しいですか? すべてが int にキャスト (切り捨て) されていますか? これはバグですか?
6442901632
python-call を介して CLIPS から python に値を渡すと、python の値になるため、私は尋ねています0x7fffffff
。または、私の 32 ビット Python が問題の原因ですか?
int
PyClips 経由で CLIPS から Python にPython より大きい値を渡すにはどうすればよいですか?
python-2.7 - Windows Python 2.7 32 ビット用の CLIPS 6.30 に基づく PyCLIPS のインストール
CLIPS バージョン 6.30 をベースにしたバージョンの PyCLIPSがあることを知りました。同じ (または同様の) PyCLIPS バージョンを pip 経由でインストールすることもできます。こちらを参照してください。
Linux では、どちらのアプローチも問題なく機能します。つまり、git clone + setup.py 経由でインストールするか、pip 経由でインストールします。Windows では、cygwin 64bit でのみ動作しました。pip install pyclips
失敗しました(「-DWIN_MVC」フラグがないためだと思います。以下のステップ7を参照してください)。
ただし、Windows 7 64ビットで正確にPython2.7 32ビットにするために、「通常の」Windows pythonでCLIPS 6.30に基づくPyCLIPSを使用したいと思います。Visual Studio Express 2008 をインストールしました。
私が試したこと:
- git クローンhttps://github.com/almostearthling/pyclips.git
- CDパイクリップス
- git チェックアウト pyclips-1.1_clips-6.30
- ファイルを削除する
clipssrc
- 公式リポジトリから CLIPS 6.30 ソースコードをダウンロードします
clipssrc
新しいフォルダを作成する フォルダ内に新しく作成されたpyclips
フォルダcore
フォルダの内容をフォルダに抽出しclipssrc
ます- の
setup.py
738 行あたりで、リストに追加'-DWIN_MVC'
します。CFLAGS
- Windows用のパッチユーティリティをインストールし、PATHに追加します
- Visual Studio Express 2008 (32 ビット) コマンド プロンプトを起動します。
pyclips
フォルダにcd- 走る
python setup.py build
- ビルドが完了した場合(そうすべきです)、経由でインストールします
python setup.py install
ビルドとインストールは完了しましたが、バージョン 6.30 より前の CLIPS で発生したように、大きな整数は依然としてエラーを引き起こします。2147483648
これは、CLIPS が( sys.maxint+1
python 2.7 32 ビットで)より大きい整数を処理できないことを意味します。
Visual Studio 2008 でのコンパイル中に、警告 " conversion from '__int64' to 'long', possible loss of data
" が表示されました。対応する変数の型を に変更しましたlong long
。警告は消えましたが、大きな整数のエラーはまだ存在しています。
CLIPS 6.30 ベースの PyCLIPS を Windows 7 64 ビットにインストールして、32 ビット Windows Python 2.7 で使用するにはどうすればよいですか?
編集 1: cygwin 32 ビットでインストールしようとしましたが、機能しませんでした。多分それは32/64ビットの問題ですか?クリップの 32 ビット バージョン (公式インストーラー経由でインストール) は、Windows 7 64 ビットで正常に動作します...
EDIT 2: sys.maxint を持つ python インタープリターでは動作するようですが、 sys.maxint を9223372036854775807
持つインタープリターでは動作しないようです2147483647
。興味深いことに、64 ビット Windows Python でさえ後者の値を持っています。
概要:
- cygwin Python 64 ビット、maxint: 9223372036854775807、エラーなし
- Cygwin Python 32 ビット、maxint: 2147483647、エラー
- Windows Python 2.7 32 ビット、maxint: 2147483647、エラー
- Windows Python 2.7 64 ビット、maxint: 2147483647、エラー
pytest - CLIPS (クリア) コマンドが失敗する/pyclips で例外がスローされる
pytest を使用していくつかの単体テストを作成した pyclips / clips プログラムがあります。各テスト ケースには、イニシャルが含まclips.Clear()
れ、その後に を介して実際のクリップ COOL コードが実行されますclips.Load(rule_file.clp)
。各テストを個別に実行すると正常に動作します。
それでも、pytest にすべてのテストを実行するように指示すると、一部はClipsError: S03: environment could not be cleared
. 実際、.py ファイル内のテストの順序によって異なります。後続のテスト ケースが例外をスローする原因となるテスト ケースがあるようです。
クリアが失敗するように、いくつかのクリップ コードがまだ「使用中」である可能性がありますか? 私はここでそれを読みました(clear)
CLIPS をクリアします。CLIPS 環境からすべての構成要素と関連するすべてのデータ構造 (ファクトやインスタンスなど) を削除します。クリアはいつでも安全に実行できますが、特定の構造は使用中に削除することができません。
これはここに当てはまりますか?(clear)
コマンドが失敗する原因は何ですか?
編集:
問題を絞り込むことができました。これは、次の状況で発生します。
test_case_A は test_case_B の直前に来ます。test_case_A には次のtest
ようなものがあります
しかし、f_bio_puts
に設定されています
(slot f_bio_puts (default [nil]))
したがって、[nil]
最初に設定されているスロット変数のタイプをテストすると、(clear)
コマンドが失敗するようです。何か案は?
編集2
何が問題を引き起こしているのかを知っていると思います。test
ラインです。クリップ ダイアログ ウィンドウで実行できるようにコードを調整しました。そして、経由でロードするときにこのエラーが発生しました(batch ...)
これがマスクされているのはpyclipsのバグだと思います。
clips - スロットが正しく設定されるまでパターン マッチング (エラー) を回避する
ルールの LHS にはR_blup
、
つまり、 が?s2
2 以上かどうかをチェックします。?s2
は という名前のインスタンス スロットに対応しますs2
。
残念ながら、エラーが発生します
Function >= expected argument #1 to be of type integer or float
(test ...
問題は、引数 #1 を設定s2
する前、つまり整数値または浮動小数点値を設定する前にコードが実行されることです。s2
別のルールによってトリガーされる python-call 内で整数に設定することになっていますR_blah
。
エラーは、別のルールに属する別の python-call の途中でトリガーされますR_xyz
。この python-call は、 を介してインスタンスを変更しますclips_instance.Slots["slot_name"] = some_value
。
これは通常どのように処理されますか?あまり好きではない 3 つの解決策があります。
- のデフォルト (整数) 値を設定します
s2
。 - 最初
(test ...
にチェックするように を変更します。nil
- 待機する別のチェック/ルールを
s2
追加nil
する
エラーを試す/除外する/渡すことは可能ですか?