プロローグは、存在する場合、私に解決策を与えません

Alex028502

私は7週間で7つの言語に取り組んでいますが、プロローグについて理解できないことがあります。私は次のプログラムを持っています(彼らのウォレスとグルミットプログラムに基づいています):

/* teams.pl */

onTeam(a, aTeam).
onTeam(b, aTeam).
onTeam(b, superTeam).
onTeam(c, superTeam).

teamMate(X, Y) :- \+(X = Y), onTeam(X, Z), onTeam(Y, Z).

このようにロードします

?- ['teams.pl'].
true.

しかし、それは私に次の解決策を与えません

?- teamMate(a, X).
false.

それはより単純なものを解決することができます(それは本に示されています):

?- onTeam(b, X).
X = aTeam ;
X = superTeam.

そして解決策があります:

?- teamMate(a, b).
true ;
false.

何が足りないのですか?私はgnuprologとswiplの両方で試しました。

...そしてもっとあります...

「自分のチームメイトになることはできません」という制限を移動して終了すると、次のようになります。

/* teams.pl */

onTeam(a, aTeam).
onTeam(b, aTeam).
onTeam(b, superTeam).
onTeam(c, superTeam).

teamMate(X, Y) :- onTeam(X, Z), onTeam(Y, Z), \+(X = Y).

それは私が期待する解決策を私に与えます:

?- ['teams.pl'].
true.

?- teamMate(a, X).
X = b.

?- teamMate(b, X).
X = a ;
X = c.

何が得られますか?

user1812457

マットによって答えはあなたにいくつかの高レベルの考慮事項とソリューションを提供します。私の答えは、あなたにとって興味深いかもしれないし、そうでないかもしれない根本的な理由についての詳細です。

(ちなみに、Prologを学んでいる間、私はほとんど同じ質問し、同じユーザーから非常によく似た答えを得ました。素晴らしいです。)

プルーフツリー

質問があります:

2人のプレーヤーはチームメイトですか?

Prologから回答を得るには、クエリを作成します。

?- team_mate(X, Y).

ここで、XとYはどちらも自由変数または束縛です。

述語(事実と規則)のデータベースに基づいて、Prologは証拠見つけようとしあなたに解決策を提供します。Prologは、プルーフツリーの深さ優先走査を実行してプルーフを検索します

最初の実装で\+ (X = Y)が何よりも優先されるため、ツリーのルートノードにあり、次の目標の前に評価されます。そして、XまたはYが自由変数である場合、X = Y 成功する\+ (X = Y) 必要があります。つまり、失敗する必要があります。したがって、クエリは失敗する必要があります。

一方、XまたはYが自由変数である場合は成功しますが、後でそれらを互いに統合しようとすると失敗する必要があります。その時点で、Prologは、プルーフツリーの別のブランチにプルーフが残っている場合はそれを探す必要があります。dif(X, Y)

(プルーフツリーを念頭に置いて、実装方法dif/2を考えてみてください:dif/2a)の引数に何らかの状態を追加するか、b)解決戦略を変更しなくても可能だと思いますか?)

そして最後に、最後に置い\+ (X = Y)て、両方XYが評価されるまでに粉砕されるように注意する、統合は単純な比較のようになり、失敗する可能性があるため、否定は成功します。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

私のループは2回実行されており、これに対する解決策を正しく答えることができません

TypeErrorを解決する方法:Pythonに数値データが存在する場合、「プロットする数値データがありません」

ログインパスワードと登録パスワードを比較できません。誰が私にそれを愛するための解決策を与えることができますか?

プーリング層と前の畳み込み層の深さは同じである必要があります。しかし、それは同じではありません、親切に私に解決策を教えてください

誰かがfile_get_contentsで私のウェブサイトのページを取得した場合にログに記録する解決策はありますか?

MERNスタックプロジェクトをGithubに完全にアップロードできないのはなぜですか?(他の場所で解決策を見つけることができません)

ortoolsによるvrpの問題は私に解決策を与えていません

タイププロパティ ''を解決する方法はタイプ 'IntrinsicAttributes&Function'に存在しませんか?

Xcode 13では、プロジェクトで成果物を含む「製品」グループが表示されない場合があることに気づきました。解決策はありますか?

最初のインターネット接続が成功する前にプログラムが開始された場合、プログラムはホスト名を解決できません

プロパティ 'navigation'を解決する方法はタイプ 'Readonly <{}>&に存在しません

HTML経由でグーグルクロームで日本語のテキストを表示する解決策はありませんか

プロジェクトルートに.npmrcが存在する場合、npmにログインできません

タイプスクリプトエラーを解決する最良の方法-プロパティはタイプに存在しません

タイプスクリプトエラーを解決する最良の方法-プロパティはタイプに存在しません

私のアプリで正しくオーバーフローした解決策の解決策が見つかりません

cプログラムは私にエラーを与えません

グーグルマップを実装する際のエラーの解決策は何ですか(未定義のプロパティ 'innerHTML'を読み取ることができません)

react nativeは私のネイティブアプリケーションにビデオを表示しません、解決策は何ですか?

コードが正しい場合でも、AndroidFirebaseのログインと登録アプリがクラッシュします。これに対する解決策は何ですか

BodyParserは解析しませんが、すべてが私には正しく見えます。`未定義のプロパティを読み取れません`を解決する方法

私のangularJSファイルのアップロードが機能しません。不正な要求エラーが表示されます。それを解決する方法は?私はJavaスプリングを使用しています

「タイプ 'Vue'にプロパティが存在しません」エラーを解決します

タイプスクリプトを使用する場合、プロパティ「テーマ」は存在しません

私のラップトップはローカルディスクCを見つけることができません、それを解決する方法は?

sharedpreferencesに複数のintキー値を格納する場合の問題、解決策はありますか?

Neovimはtmuxでcolorschemeを失います。私が見る過去の解決策はすべて私にはうまくいきません

lombokエラー「ログを解決できません」を解決するにはどうすればよいですか?

私のプログラムは、実行されますが、それは私に何も出力を与えません

TOP 一覧

  1. 1

    Unity:未知のスクリプトをGameObject(カスタムエディター)に動的にアタッチする方法

  2. 2

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  3. 3

    Ansibleで複数行のシェルスクリプトを実行する方法

  4. 4

    tkinterウィンドウを閉じてもPythonプログラムが終了しない

  5. 5

    Crashlytics:コンパイラー生成とはどういう意味ですか?

  6. 6

    GoDaddyでのCKEditorとKCfinderの画像プレビュー

  7. 7

    Windows 10 Pro 1709を1803、1809、または1903に更新しますか?

  8. 8

    Chromeウェブアプリのウェブビューの高さの問題

  9. 9

    モーダルダイアログを自動的に閉じる-サーバーコードが完了したら、Googleスプレッドシートのダイアログを閉じます

  10. 10

    Windows 10の起動時間:以前は20秒でしたが、現在は6〜8倍になっています

  11. 11

    Reactでclsxを使用する方法

  12. 12

    ファイル内の2つのマーカー間のテキストを、別のファイルのテキストのセクションに置き換えるにはどうすればよいですか?

  13. 13

    MLでのデータ前処理の背後にある直感

  14. 14

    グラフからテーブルに条件付き書式を適用するにはどうすればよいですか?

  15. 15

    Pythonを使用して同じ列の同じ値の間の時差を取得する方法

  16. 16

    mutate_allとifelseを組み合わせるにはどうすればよいですか

  17. 17

    ネットワークグラフで、ネットワークコンポーネントにカーソルを合わせたときに、それらを強調表示するにはどうすればよいですか?

  18. 18

    テキストフィールドの値に基づいて UIslider を移動します

  19. 19

    BLOBストレージからデータを読み取り、Azure関数アプリを使用してデータにアクセスする方法

  20. 20

    PowerShellの分割ファイルへのヘッダーの追加

  21. 21

    ソートされた検索、ターゲット値未満の数をカウント

ホットタグ

アーカイブ