問題タブ [prolog-coroutining]
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 - プロローグのガード条項?
それらは存在しますか?それらはどのように実装されていますか?
SWI-Prolog(、など)のcoroutining述語には、ガードの機能があります。それらは、好ましいPrologプログラミングスタイルにどのように適合しますか?freeze
when
dif
私は論理プログラミング(Prologとまったく)に非常に慣れておらず、それが純粋に宣言型ではなく、非常に単純な場合でも手続き上の考慮が必要であるという事実に多少混乱しています(またはの使用に関するこの質問を\==
dif
参照してください)。重要なものが欠けていますか?
prolog - プロローグでゴールを凍結
リストなどの変数が無制限になるまで目標を凍結したいのですが、今は
しかし、いくつかの操作の後に停止し、永遠に待機します。誰かがこれを修正する方法を教えてもらえますか?
prolog - 到達不能になった変数をブロックするfreeze/2ゴール
次のような小さなプログラムを作成して、到達不能になったときに目標に使用されたメモリfreeze(X,Goal)
が回収されるかどうかを判断しました。X
次のクエリを実行しましょう...
...さまざまなPrologプロセッサを使用して、メモリ消費を調べます。 なんという違いでしょう!
でさらに反復を実行すると?- length(Zs,1000), big_freeze_test(1,10000,Zs).
、次のような観察結果が得られました。
Ciao Prolog は
{ERROR: Memory allocation failed [in Realloc()]}
中止する前に報告します。sicstus-prologとb-prologは、マシンがフリーズするまで割り当てを増やします。
- swi-prologは、すべての反復を3.554秒で実行します。
- yapもすべての反復を実行しますが、36.910秒かかります。
SWI-Prolog と YAProlog では機能するが、他のものでは機能しない理由はありますか?
実行時間を考えると、SWI-Prolog が YAProlog よりも 1 桁以上優れているのはなぜですか?
私の直感は、「属性変数」と「ガベージ コレクション」の相互作用に傾いています。SWI-Prolog と YAProlog は、他の Prolog プロセッサとは異なる属性付き変数 API と実装を (共有?) 持っています。ありがとうございました!
prolog - Prolog コルーチン (freeze/2、when/2) と DCG の混合について
最近の質問「プロローグ二分探索木テスト - 不要な親の親ノード比較」に対する以前の回答で、プロローグ コルーチンを使用するミキシングを提案しました...lazy_chain/2
... dcg in_order//1
と一緒に...
... そのようです:
その範囲が で記述されたシーケンスの一部に限定されるように「プッシュ」する簡単な方法はありlazy_chain
ますか?phrase/3
in_order//1
今、私は...
...これは(もちろん)さらにインスタンス化すると失敗する可能性がありますZs
:
それを回避し、 list-differencelazy_chain
の一部に制限するにはどうすればよいですか?
concurrency - Prolog 遅延評価: LIFO または FIFO ウェイクアップ?
多くの Prolog システムにはfreeze/2
述語があります。この述語は、geler/2
Prolog-II よりも前に発明されたので、おそらくその名前を持つべきです。
同じ変数に条件があると仮定しますが、2 つの異なる目標があります。
G1 が最初に実行されるか、G2 が最初に実行されますか? G1 と G2 が新しいフリーズを生成し、それも起こされたらどうなるでしょうか。
G3 または G4 は常に G1 と G2 の間で実行されますか? それとも、G3 または G4 は G1 と G2 の後、または後で実行される可能性がありますか?
さよなら
prolog - ラムダ式を適用する逆、Prolog での eta+alfa 変換?
コルーティングには興味深い問題がいくつかあります。たとえば、未到達の凍結された目標を取り戻したいとします。しかし、巡回項をサポートしない Prolog システムには問題があります。すなわちフリーズ:
内部データ構造のループにつながります。簡単な回避策は、凍結された目標をカリー化することです。したがって、 predicate を使用する代わりに、次のように定義できるfreeze/2
predicateを使用します。guard/2
しかし、どのように定義できますfreeze/2
かguard/2
? 新しい変数を導入しないため、明らかな定義は機能しません。また、クロージャに V が含まれているという問題がまだ残っています ((\)/2
がラムダ抽象化であるラムダ ライブラリを想定)。
さよなら
prolog - リストの先頭の s(s(0)) を削除します
(これはその質問へのフォローアップです)。
どちらが正しいかの書き方lead1(Xs,Ys)
は、 iffは先頭の用語をすべて削除しYs
た接尾辞です。したがって、先頭の s を削除する代わりに、この質問は先頭の s の削除に関するものになりました。Xs
s(s(0))
0
s(s(0))
元の質問と比較して、難しさはここで and のケースを適切に処理することにs(X)
ありs(s(X))
ます。