問題タブ [sicstus-prolog]
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.
prolog - SICStus Prolog: JIT の影響を受ける統計/2 値
更新: @PerMildner によって報告されたように、以下の問題 (SICStus Prolog 4.3. 2で発生) は、新しい SICStus Prolog 4.3 で解消されました。3 ! さすが!
私は SICStus Prolog 4.3.2 を使用していますが、これまで使用したことのないキーのいくつかを知るようになりました... これが私のコードです: statistics/2
call_keys_deltas/3
次のような述語の実行に関する情報を収集します。
には 2 つの選択ポイントがあると予想しています?- boolsA([0,0]).
が、?- boolsB([0,0]).
JIT の実行直後に得られる数値は、実行後に得られる数値とは異なります。
JITあり
/li>JITなし
/li>
上記の不一致は意図的なものなのだろうか... ありがとうございます!
prolog - プロローグ: ビットが設定されているかどうかのテスト
ここでは、密なビット ベクトルを表すために任意精度の整数を使用しています。サイズは数十から数千までの範囲です。
私のコードでは、特定のビットが設定されている (または設定されていない) かどうかを頻繁に確認する必要があるため、いくつかのバリエーションが他のバリエーションよりも大幅に高速かどうかを確認するために、いくつかのマイクロ ベンチマークを実行しました。
SWI と SICStus の両方で、上記のバリアントはすべて (ほぼ) 同等に高速です。
次に、SWI-Prolog マニュアルの次の興味深い部分に出くわしました。
getbit(+IntExprV, +IntExprI)
の- 番目のビットのビット値 (
0
または1
) に評価されます。両方の引数は、負でない整数に評価される必要があります。結果は と同等ですが、シフトされた値の具体化が回避されるため、より効率的です。IntExprI
IntExprV
(IntExprV >> IntExprI)/\1
将来のバージョンでは
(IntExprV >> IntExprI)/\1
、 への呼び出しに最適化され、getbit/2
移植性とパフォーマンスの両方が提供されます。
だから私はチェックアウトしましたgetbit/2
:
マイクロベンチマークには次のコードを使用しました。
私はこれらのランタイムをrun(runtime, 10000000, 1<<1000-1, 200)
観察しました:
次のように表示されます。
getbit/2
SWI-Prolog は500% 高速化されました。コマンドライン オプション
-O
により、SWI-Prolog は大幅に高速化されました。
SICStus で同様の高速化を実現するためのより良い定式化 (算術演算など) はありますか?
前もって感謝します!
prolog - SICStus Prolog は変更を無視します
私はプロローグにかなり慣れていません。SICStus を使用して、既に調べたファイルに変更を加えると、SICStus は変更を認識しません。唯一の方法は、ウィンドウを閉じて再度開始することです。しかし、ファイルに変更を加えるたびにウィンドウを閉じるのは煩わしいだけでなく、時間を浪費するため、明らかにこれは実用的ではありません。WindowsバージョンのSicstus 4.2.1を使用しています。これまでのところ、consult(file)、reconsult(file)、compile(file) のコマンドを試しましたが、違いはありませんでした。ウィンドウを閉じて開くまで、SICStus は行った変更を単に無視します。
たとえば、述語 test/2 があるとします。次に、それを削除してファイルを保存しました。次に reconsult(file) と入力します。私の期待は、SICStus が行われた変更を認識し、述語が存在しないと言うことでした。しかし、それはあたかも存在するかのように続きます。ウィンドウを閉じて最初からやり直した後でのみ、述語が存在しないと正しく文句を言うでしょう。
奇妙なことに、 reconsult(file) で新しく追加された述語は認識しますが、変更または削除された場合は認識しません。
prolog - SICStus Prolog: すべての解を見つける
すべてのソリューションを表示したり、SICSTus プロローグにあるソリューションの数を見つけたりする方法はありますか? たとえば、次のコードを使用して、地図の色付けの問題を解決できます。
現時点では、;
Prologがノーと言うまで、さらなる解決策を見るために毎回入力しています. プロローグにすべてのソリューションを一度に表示するように指示する方法はありますか? プロローグのように、問題には 5 つの解決策があることがわかります。
prolog - SWIProlog の SICStus の nvalue/2 に相当
CLP(FD) ライブラリのSICStusマニュアルには次のように書かれています。
nvalue(?N, +Variables)
ここVariables
で、 は有限境界または整数を持つドメイン変数のリストでありN
、整数またはドメイン変数です。N
が によって取得された個別の値の数である 場合は真ですVariables
。
これは、ソリューション内の個別の値の数を最小限に抑えたい場合に特に役立ちます。たとえば、さまざまなサイズのバッグに物を分配しようとしていて、バッグの数を最小限に抑えたい場合。
SWI Prologで同じことを達成するための同等の述語(または方法)はありますか?