次の理論があるとします。
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)
と、結果はtrue
とnoOrphan(david)
になります(の親false
を定義していないためdavid
)。?michael
david
noOrphan/1
これはおそらく Prolog のバックトラッキング メカニズムの結果ですが、Prolog は、肯定的な方法 (0,2,4,...) の否定の深さ、または否定的な方法 (1,3) で検索しているかどうかを検証する状態を維持できます。 ,5,...) 深い否定。