問題タブ [prolog-cut]
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 - カットの使用、エラー: ローカル スタックが不足しています
これが私のコードです。最後の 3 つのルールに注目してください。
他の答えは気にしません。この質問に対する答えだけです。
costac と anne という名前を付けて、欲しいものを手に入れました。なぜなら、それは私のルールの最初の行だからです。私が試みる他のすべては失敗し、タイトルのエラーを与えます! カットを使用してみましたが、何も機能しませんでした。たとえば、私がメアリーとマイクを与えると、トレースすると、ステップに進ん(mother(X,Y), !,Ans = mother(X,Y));
でプロデュースがそれをmother(mary,anne)
無視し、次の2つに進み、そのことをループし続けることがわかります。
list - とは "!" プロローグで
誰かが「!」の意味を説明してくれませんか? プロローグで行う?わかりません。ここに、異種リストのいくつかのサブリストが山の側面を持っているかを数えるコードがあります。
munteMain
線形リストに山の側面があるかどうかを検証します。
prolog - 例を使用した Cut(!) 演算子の理解の問題 (Prolog 言語)
次のルールがあります。
このルールは、リストに繰り返し要素がないかどうかを決定するために作成され、メンバー ルールは、特定の要素がリストに属しているかどうかを決定します。私の質問は、このルールのカット演算子に関するものです。なぜなら、それが何をするかわからないからです。
私は次のトレースを作成しましたが?-noRepetition([a,b,b,c,d])
、問題に遭遇しました (おそらくカット演算子の理解不足に関連しています):
この場合、not member が true を返すため、カットが true であることが証明されたので、私は立ち往生していますが、このカットがプログラムが noRepetition (3 番目の目標) に行くのを妨げているのか、それとも何か他のことをしているのかはわかりません。実際にプログラムが noRepetition に移行するのを防ぐ場合、このルールは true と評価されますが、リストに繰り返しがあるため、これは当てはまりません。
prolog - プロローグ: 「if then else」、cut を使用
これは簡単な質問です。この例は、Prolog の教科書で見たことがあります。カットを使用して if-then-else を実装しています。
このプログラムが何をしているのか、なぜ便利なのか説明できる人はいますか?
prolog - カットを読む!プロローグで
Learn Prolog Now!を読んでいます。のカットに関する章と、同時に Bratko の人工知能のためのプロローグ プログラミング、第 5 章: バックトラッキングの制御。最初は、カットは他のプログラミング言語で知られている if-else 句を模倣する簡単な方法のように見えました。
false
ただし、行の下に記載されているように、このコードは、期待している場合でもすべての変数がインスタンス化される場合に失敗します。
理由は明らかです。最初のルールは失敗し、2 番目のルールにはもう条件が関連付けられていないため、成功します。私はそれを理解していますが、解決策が提案されています(ここではスウィッシュです):
そして、これをどう読むべきか、私は混乱している。私は、「これより前に来るすべてが真である場合、同じ述語を持つ他のルールを含めて終了を停止!
する」という意味だと思いました。!
ただし、これは正しくありません。これは、 のインスタンス化がY = Z
失敗した場合にのみ発生することを意味し、そのルールでは役に立たないからです。
では、カットは「人間的」な方法でどのように読み取られるべきでしょうか? そして、拡張として、max/3
上記の提案されたソリューションをどのように読むべきですか?
performance - このプロローグの目標をカットで解釈し、効率を改善する方法
以前の質問の回答とコメントを読んでいて、Bratko (人工知能のプロローグ プログラミング、p. 130) の例に与えられた説明を適用しようとしましたが、完全に理解しているかどうかはわかりません。以下に例を示します。
ツリーとコードを次のように読みました。
目標リストでは、C :- P, Q, R, !, S, T, U.
Prolog は通常どおり変数を 1 つずつインスタンス化して、最終的に に到達しようとしますtrue.
。P
との値が見つかりQ
、最初の試行がR
失敗した場合、Prolog はP
とが見つかったケースに戻り、可能であればQ
別のオプションを試すことができます。R
ただし、 もR
見つかって ( につながるP, Q, R = true.
)、!
いつものように成功した場合は、選択ポイントを破棄し、その時点から ( さえも) 戻るものは何もありませんC :- V.
。これが意味することは、 の結果が見つからない場合S
、ゴールC :- P, Q, R, !, S, T, U.
はすぐに失敗するということです。しかし、 PrologはまだバックトラックできますA :- B, C, D.
の他の値を見つけるB
。に別の一致が見つかった場合はB
、C
もう一度再試行されます。等々。
私の解釈が正しいと仮定すると、C :- P, Q, R, !, S, T, U.
の値に関係なく目標が成功または失敗した場合B
、どのように効率を改善しますか? 私の推測では、 のように書き直しA :- B, C, D.
ますA :- B, !, C, D
。
私の解釈は正しいですか?そして、いくつかの先験的な情報が与えられた場合、効率の改善についてはC
どうですか?