10

次の理論があるとします。

a(X) :- \+ b(X).

b(X) :- \+ c(X).

c(a).

それは単に真であると言いますが、これはもちろん正しいのですa(X)が、存在b(X)しないため真です (否定は有限の失敗として)。b(X)が存在せず、 が存在する場合にのみ存在するためc(X)c(a)これは真であると言えます。しかし、なぜPrologが答えを提供しないのか疑問に思っていましたX = aか? たとえば、いくつかのセマンティクスを紹介します。

noOrphan(X) :- \+ orphan(X).

orphan(X) :- \+ parent(_,X).

parent(david,michael).

もちろん、クエリを実行するnoOrphan(michael)と、結果はtruenoOrphan(david)になります(の親falseを定義していないためdavid)。?michaeldavidnoOrphan/1

これはおそらく Prolog のバックトラッキング メカニズムの結果ですが、Prolog は、肯定的な方法 (0,2,4,...) の否定の深さ、または否定的な方法 (1,3) で検索しているかどうかを検証する状態を維持できます。 ,5,...) 深い否定。

4

2 に答える 2

8

もっと簡単なことから始めましょう。と言う\+ X = Y。ここで、否定されたゴールは事前定義された組み込み述語です。したがって、物事はさらに明確です。Xそして、Y異なるはずです。ただし、成功する\+ X = Yため、失敗します。X = Yしたがって、目標が失敗した正確な条件の下で痕跡は残りません。

したがって、\+ \+ X = Yは期待される ではなく、空の回答を生成しますX = Y詳細については、この回答を参照してください

このような単純なクエリがすでに問題を示していることを考えると、ユーザーが定義した目標をあまり期待することはできません。

一般的なケースでは、最初に否定によって実際に何を意味するのかを再考する必要があります。その答えは、一見したよりもはるかに複雑です。プログラムp :- \+ p.p成功するか失敗するかを考えてみてください。真実であるべきかp、そうでないべきか?ここには、最小モデルを使用するという Prolog の見解に適合しなくなった 2 つのモデルが実際にあります。これらは、Answer Set Programming (ASP) などのロジック プログラミングへの新しい分岐点を開いたことによる考慮事項です。

しかし、プロローグに固執しましょう。否定は、目標が十分にインスタンス化され、定義が階層化されている場合など、非常に制限されたコンテキストでのみ使用できます。残念ながら、否定された目標を安全に実行するための一般的に受け入れられている基準はありません。ゴールが変数フリー (グラウンド) になるまで待つこともできますが、これは非常に多くの場合、あまりにも長く待たなければならないことを意味します。

したがって、事実上、一般否定は、純粋な Prolog プログラムと一緒にはあまりうまく機能しません。Prolog の核心は、言語の純粋で単調なサブセットです。ただし、Prolog (またはそれぞれの拡張機能) の制約部分内では、否定は非常にうまく機能する可能性があります。

于 2013-10-15T14:13:01.987 に答える
3

質問を誤解している可能性があり、最後の段落がわかりません。

とにかく、どのが孤児ではないかを検出する完全に有効な方法があります。あなたの例では、知っていることをコンピューターに伝えるのを忘れています。

person(michael).
person(david).
% and a few more
person(anna).
person(emilia).

not_orphan(X) :- \+ orphan(X).
orphan(X) :- person(X), \+ parent(_, X).

parent(david, michael).
parent(anna, david).

?- orphan(X).
X = anna ;
X = emilia.

?- not_orphan(X).
X = michael ;
X = david ;
false.

この定義は間違いなく少し奇妙であるため、「孤児」をどのように正確に定義したいのかわかりませんが、それは重要ではありません。

結論としてmichael、明示的に述べない限り、Prolog がそれを認識し、david他のすべての人が人間であることを期待することはできません。また、人にのみ適用される関係であることを明示的に述べる必要がありorphanます。not_orphanモデリングしている世界には、次のものも含まれる可能性があります。

furniture(red_sofa).
furniture(kitchen_table).
abstract_concept(love).
emotion(disbelief).

そして、それらを家族の問題から除外する方法が必要です。

それが役立つことを願っています。

于 2013-10-15T04:30:27.167 に答える