問題タブ [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 - Prolog Constraints -> パズルグリッドを解く
皆さん、私はプロローグで制約を学び、この新しい知識を使って小さなパズルを実装しようとしています.
パズルの目的は単純です。各列の上/下、および各行の右/左にいくつかの数字がある正方形のグリッドがあります。値のドメインは 0 から Gridsize -1 になります。つまり、グリッド 7x7 は 0 から 6 までの数値を持つことができます。制約は次のとおりです。
- 各数値は、各行に 1 回、各列に 1 回のみ表示されます
- 上/右の数字は、それぞれ列/行の最初と最後の桁の合計です
- 下/左の数字は、それぞれ列/行の 2 番目と 2 番目の最後の桁の合計です
- ゼロは数字としてカウントされず、プログラム上で空白を表すためだけに使用されます
例:
TopConstraint = [7, 6, 4, 7, 3]
RightConstraint = [5, 5, 5, 5, 5]
BottomConstraint = [3, 4, 6, 3, 7]
LeftConstraint = [5, 5, 5, 5, 5]
この制約には 0 を指定することもできます。これにより、プログラムは単純に無視されます (合計は、他の制約に従っていれば、任意の数にすることができます)。
上記のリストに対する 1 つの解決策は、次のマトリックスです。
3 | 4 | 1 | | 2
1 | 3 | 2 | 4 |
2 | | 4 | 1 | 3
| 1 | 3 | 2 | 4
4 | 2 | | 3 | 1
問題は、制約がどうにか適用されず、プログラムが解決策を提供していないことです。
正しいドメインを配置し、すべての列/行セルを異なるものに配置した後(他の制限なしで、期待される解決策が得られます)、各セルに適用するこのコードがあります。合計制限:
put_restrictions(Sol, Gridsize, SumT, SumR, SumB, SumL):-
put_restrictions_row(Sol, Gridsize, SumR, SumL, 1),
put_restrictions_col(Sol, Gridsize, SumT, SumB, 1).
ここで、Gridsize は反復を行うための Gridsize であり、SumT、SumR、SumB、SumL はそれぞれ上記の制約リストであり、1 は反復カウンターを開始します。
したがって、この述語は私の問題がある場所です
コードはかなり自明だと思いますが、そうでない場合は、私がやろうとしていることは次のとおりです。
右側に制約がある場合:
- 行の最初と最後のセルが 0 でない場合、それらの合計は = 制限に
- 行の最初のセルが 0 の場合、行の 2 番目のセルと最後の = の合計が制限に -> 左の制限は、左から 3 番目のセルと最後から 2 番目のセルの合計になります。 .
問題の解決策が得られません。制約の関連付けで何が間違っていますか?
どんな助けでも大歓迎です。ここでprologNoobを助けてくれてありがとう:P
c - Prolog から C に任意のサイズの整数を渡す
現在、SICStus Prolog を C コードとインターフェースする方法を学んでいます。
SICStus Prolog バージョン 4 で、任意サイズの整数の「ハミング重み」の C 実装を持っている/使用したい/見たいです。
タームタイプをテストするための C 関数 (SP_is_integer) と、Prolog タームにアクセスするための C 関数 (SP_get_integer、SP_get_integer_bytes) が必要なようです。
ただし、SP_get_integer_bytes をポータブルで堅牢な方法で使用する方法がわかりません。それを実行する、よく練られたしっかりした C コードを教えてください。
prolog - SICStus Prolog JIT コンパイラ
SICStus Prolog 4.3 では、x86-64 プロセッサ用の JIT コンパイラが追加されました。
JIT コンパイラーに関して 2 つの質問があります。
まず、JIT コンパイラーの機能 (および制限、設計、および手法) に関するドキュメント (論文、ノート、またはメモ) はどこにありますか?
次に、JIT コンパイラーによって生成された x86-64 アセンブリー・コードを発行するように SICStus に指示できますか?
c - SICStus Prolog 4: Prolog から C に整数を渡す
SICStus Prolog 4 FFI から C へのロープをまだ学習中ですが、https://sicstus.sics.se/sicstus/docs/latest4/html/sicstus.html/ の例の述語 c1/2 について具体的な質問があります。 Foreign-Code-Examples.html#Foreign-Code-Examples .
ex.pl には次の行が含まれます。
ex.c には次のスニペットが含まれます。
これは小さい整数に対して機能します。
大きな整数では機能しません。
小さい整数と大きい整数の両方を正しく (そして効率的に) 処理するにはどうすればよいですか? IIRC の大きな整数は "SP_integers" として渡すことができないため、これらの値を項 ("SP_term_ref") として渡し、適切な動的型チェックを行う必要があります (データ抽出が続く可能性があります)。助けてください!
prolog - Prolog でのマイクロ ベンチマークのディメンション
述語 int_cntA/2 をマイクロベンチマークしたい ...
... 述語 int_cntB/2 に対して:
良い結果を得るために何を考慮する必要があるかについて 100% 確信があるわけではありません...興味深いディメンションとは何ですか?
これまでのところ、メタコールのパフォーマンスをベンチマークに含めるべきか、それとも生の数値処理に関するものにするべきかという結論に達しました。ループを障害駆動型にするかどうか。実行時に生成されるガベージを気にする必要がありますか?
次のコード スニペットは、単純なベンチマークの実装であり、生のパフォーマンスを目的としており、障害駆動型であり、ガベージを (したがって) 気にしません。
int_cntA/2 のコード:
int_cntB/2 のコード:
SICStus Prolog 4.3.1 を実行している Intel Core i7 Haswell マシンでは、さまざまなベンチマーク方法 (A、B、C) による最悪の場合のパフォーマンスの違いが 100% を超えています。
マイクロベンチマークのオーバーヘッドをさらに削減できるかどうか、またはどのように削減できるかについてのアイデアはありますか? ありがとうございました!
prolog - SICStus Prolog 4.3.2: clpfd に電源が入らない?
私の Prolog プログラムのいくつかは、 に基づく整数演算をすべてclpfdの対応するものに置き換えることができれば、かなりの利益を得ることができます。 (is)/2
だから私は力が欲しい... clpfdX is 10^3
...だから何かclpfd-yに置き換えることができる:)
clpfdをサポートする次の 5 つの Prolog プロセッサを検討してください。
GNU プロローグ1.4.4
/li>SWI-プロローグ7.3.14
/li>B-プロローグ8.1
/li>SICStus プロローグ4.3.2
/li>
アイデア/ヒント/アドバイスをお願いします。私に何ができる?おそらくいくつかのclpfd互換レイヤーを使用しますか?
前もって感謝します!