問題タブ [negation-as-failure]

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 に答える
5091 参照

prolog - Prolog で失敗としての否定はどのように機能しますか?

Prolog がこのプログラムをどのように解決するか知りたい:

「失敗としての否定」をグーグルで検索しましたが、混乱しています!

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

prolog - プロローグ否定と論理否定

次のプログラムがあるとします。

およびクエリ (false を返す):

Xトレースすると、が にインスタンス化されtom、述語a(tom)が成功し、したがって\+ a(tom)失敗することがわかります。

私はいくつかのチュートリアルで、\+Prolog の not ( ) は単なるテストであり、インスタンス化を引き起こさないことを読みました。

  1. 誰かが私のために上記の点を明確にしてもらえますか? インスタンス化を見ることができるように。

  2. not (失敗としての否定) と論理否定には違いがあることを理解しています。どのような場合に同じように動作し、いつ異なる動作をするかを説明している良い記事を参照できますか?

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

exception - 単純な失敗ではなく、Prolog で例外をスローするのはなぜですか?

私は Prolog でプログラミングしていますが、時々失敗したいのですが、代わりに例外が発生します。なぜそれらの違いが必要なのか理解できません。何かが実行できなかった場合、それは述語が成功しなかったことを意味するため、単純な失敗です。何か不足していますか?

0 投票する
3 に答える
750 参照

answer-set-programming - ASPで否定を失敗として理解する方法は?

次のプログラムがあるとします。

プログラムの回答セットを取得するために clingo を実行すると、次のようになります。

グラウンダーは最初にすべての変数を定数にインスタンス化することがわかっているので、グラウンディング後のプログラムは次のようになります。

私はGelfondの本を読んで、回答セットを取得するための3つのルールを提供しています:

  1. Π の規則を満たします。言い換えれば、ルールの本体を信じるなら、ルールの頭を信じてください。

  2. 矛盾を信じないでください。

  3. 「強制されていないものは信じない」という「合理性の原則」を遵守してください。</p>

ここにルールがあります:

失敗として否定を得たnot holiday(tomorrow)

この本に示されているように:

シンボルnotは、デフォルトの否定 (または失敗としての否定) と呼ばれる新しい論理接続詞です。not l は、「l が真実であるとは信じられない」と読まれることがよくあります。これは、l が偽であると信じられていることを意味するものではないことに注意してください。合理的な推論者が陳述pもその否定も信じないということは、実際にはごく普通のことであると考えられ¬pます。

次に、ルール 1 に基づいて、 、どちらも信じてはならないのでbelieve in the head of a rule if you believe in its body、体を信じるべきですか?not holiday(tomorrow).holiday(tomorrow).¬holiday(tomorrow).

答えによると、私は信じるべきです¬holiday(tomorrow).

  • では、なぜこの否定を失敗として必要とするのでしょうか?
  • 古典的な否定をそのまま使えますか?
0 投票する
1 に答える
129 参照

clojure - Clojure core.logic : nafc と Ground

Clojure の core.logic で単純なデータベースを表しています。

page(p) と link(p,q) の 2 つの述語があります。

page(p) は、p という wiki 内のページの存在を表します

link(p,q) は、ページ p にページ q へのリンクが含まれていることを表します。

私は今、このデータベースにクエリを実行して見つけようとしています

  • a) 壊れたリンク (つまり、ページ q がないページ p のリンク)、および
  • b) 孤立したページ (リンクのないページ)

これらのクエリの私のコードは次のとおりです。

壊れたリンクは期待どおりに機能していますが、孤児は :- シンボルのリストを表示しています。

これは nafc の制限と関係があると思います。ドキュメントによると:

実験的: 失敗制約としての否定。ゴール c への引数はすべてグラウンドでなければなりません。根拠のない引数がある場合、この制約の実行は遅れます。

そして、これらは「地面」ではないため「遅延」しています。

ここで地面が実際に何を意味するのか誰か説明できますか. 「自由変数がない」ことは知っていますが、このコンテキストでそれが何を意味するのかまだよくわかりません。

次に、この孤立したクエリをどのように記述すればよいですか?

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

prolog - (\=)/2 の純粋な Prolog 実装を求める

失敗としての否定は、通常、不純であると見なされます。失敗としての否定に必要な Prolog インタプリタは、SLD の拡張である SLDNF を実現する必要があります。

述語(\=)/2は、たとえばライブラリ (reif) で使用されます。次のように失敗として否定を介してブートストラップできますが、多くの場合組み込みです。

(\=)/2純粋な述語として実装することは可能でしょうか? 純粋な Prolog のみ、つまり一次ホーン節のみを使用していますか?