問題タブ [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.

0 投票する
2 に答える
392 参照

prolog - リストを扱うときのPrologの「-」記号はどういう意味ですか?

私はこの質問への答えを読んでいました、

上記のコードは、構文List-Listを使用しています。何が起こっているのかはある程度理解できますが、ここで「-」記号/述語が何をしているのかを正確に知りたいです。また、これはSWI固有ですか?

0 投票する
1 に答える
169 参照

prolog - プロローグのカット動作が意味をなさない

特定のカットに関して、(私にとって)非常に奇妙な動作に遭遇しました。私が理解したことから、実行がカットを通過すると、カットの上に戻ることはできません。しかし、それはまさにこのコードが行うことです。誰かがなぜこれを行うのか説明できますか?

コードは次のとおりです。

カットがない場合、この特定の入力に対する出力は次のようになります。

ここで、次のカットを追加すると:

私はそれが戻ってくることを期待します

3 番目の節のカットを通過すると、トレースを戻すことはできなくなります。

代わりに以下を返します。

なぜこうなった?文字通りカットを飛び越えて、節 4 の実行を開始します。なぜですか?

節 2 までカットを移動すると、節 4 が実行されるのはなぜですか。

以下のみを生成します。

節 2 ではカットが機能するのに、節 3 では機能しないのはなぜですか? これは私には意味がありません。

0 投票する
2 に答える
680 参照

prolog - プロローグ プログラムが誤った結果を返すクエリの検索

この Prolog プログラムでは、3 番目の引数が最初の 2 つの数値引数の最大値になるように定義しています。

このプログラムはうまく機能すると思います。しかし、それは間違った結果をもたらす可能性があると言われています。いつ、なぜなのか分かりますか?

0 投票する
2 に答える
2669 参照

prolog - Bubblesort Prolog プログラムのカットについて説明してください。

私は現在、Bratko Prolog の本に取り組んでおり、バブルソート プログラムを見ています。なぜ cut( !) が必要なのか理解できないようです。カットがそこになく、Prolog がバックトラックするとしたら、どうして悪い答えを見つけることができるでしょうか? 切り抜きをすると、Prolog は最初に正しい答えを返しますが、代わりに間違った答えも返すからです。

私が見ているように、どのようにしてスワップがソートされていないリストを返すことができますか? そして、ソートされていないリストがゴールに到達する可能性はありますかbubblesort(Sorted, Sorted)

もちろん、最初のリストも変更されている場合を除きます...それを理解することはできません。

Prolog BubbleSort プログラム:

カットを残すと、次のようになります。

なんとなくわかる気がしますが、よくわかりません。ある時点でswap(List, List1)、2 番目のバブル ソート述語に移動してゴールに到達することをバックトラックして、ソートされた 2 つのリストが等しいのではないでしょうか?

英語では、これはバブルソートがスワップを実行できなくなるまでスワップを続行する必要があるが、その後終了する必要があるという意味ですか? それとも、スワップが成功するたびに、その成功を後戻りしても意味がないということですか?

0 投票する
4 に答える
551 参照

prolog - すべての異なるパスをバックトラックせずに、Prolog に statisfying 句が存在するかどうかを確認する方法は?

私が次のものを持っているとしましょう:

ダイアンの兄弟を尋ねると、チャーリーとイブが 2 回見つかります。1 回はボブから、もう 1 回はアリスからです。私はそれぞれ一度だけ欲しい。
バックトラックを完全に防ぐため、ここでカットを使用できるとは思いません。私が望むのは、存在するかどうを確認する方法です。

言い換え


いくつかのカットを試しましたが、うまくいきませんでした。結果のリストが空でないかどうか
を試しfindall/3てみましたが、それはAまたはBを統一しません.(parent(X, A), parent(X, B))


setof/3以下で提案されているように使用すると機能しますが、質問で使用するのではなく、 の定義に組み込む方法を本当に見つけたいと思っていますsibling/2。私は本当に次のことができるようになりたいです:

またはこれ


以下で述べたように、この特定のケースに対する解決策があります。私が望んでいること、そして私が報奨金を設定しているのは、一般的な解決策です。

それ以外の

やりたい

Aとを一体化するものB

を定義するにはどうすればよいexists/1ですか?

0 投票する
2 に答える
10757 参照

prolog - Prolog が 1 つのソリューションを返すようにし、クエリ オプションの表示を停止する

私はプロローグが初めてで、1つの答えが見つかった後にクエリを停止する方法を試しています。私はこのコードを使用しています:

結果は次のとおりです。

Prolog に「true ?」の出力を停止させる方法がわかりません。代わりに「はい」と出力するだけです。if/else コンストラクトと format 関数を使用してみましたが、それでも「true ?」と出力されます。何か案は?

0 投票する
2 に答える
517 参照

prolog - プログラミングでカットはそんなに悪いですか?

私は今学期、Prolog を学習している AI コースを受講しています。私たちの講師は、私たちの課題でカットを使用するのを避けるように努めるように私たちに言いました. ただ気になるのは、なぜカットが罪とみなされるのか(講師の言葉)?私はそれが一種の近道であることを理解していますが、それらが私のプログラムにどのように影響するかを正確に知って使用しています.