Prologは本当に閉世界仮説に基づいていますか?
閉世界仮説の下で、
現在真実であることが知られていないことは誤りです
Prologのセマンティクスは、閉世界仮説に従うとよく言われます。たとえば、次のようになります。
Prologは閉世界仮説(CWA)に基づいています。つまり、命題がファクトデータベースになく、ファクトデータベースから導出できない場合、それは真実ではありません。
ただし、このように動作するわけではありません。CWAの下で、私は期待します
?- a.
false.
しかし、代わりに、SWI-Prologでは、次のようになります。
?- a.
ERROR: Undefined procedure: a/0 (DWIM could not correct goal)
何故ですか?PrologがCWAに基づいていると言うのは間違っていますか?
回答
Prologのコンテキストで閉世界仮説(CWA)について話すときは、(ランタイム)システムの未知の述語と既知の述語を区別する必要があります。どちらの場合も、句の有無にかかわらず述語。
不明な述語を呼び出すと、デフォルトで、述語存在エラーが発生します。に設定できるunknown
デフォルト値がの標準フラグがあります。それはあなたが明らかに探している行動をあなたに与えるでしょう。シル、フラグをデフォルト値のに設定したままにしておくことを強くお勧めします。これにより、プログラミング述語(述語名やアリティのタイプミスなど)を簡単に検出できるようになります。error
fail
error
何が述語になり、既知の実行時には?述語ディレクティブまたは述語節。最もよく知られている例はdynamic/1
ディレクティブです。コードが次のテキストのみで構成されている場合:
:- dynamic(foo/1).
次に、コンパイルしてロードした後、次のことが期待できます。
?- foo(_).
no.
しかし、他のディレクティブも同じ効果があります(たとえばmultifile/1
、discontiguous/1
それが標準の準拠Prolog実装であると仮定すると!)。
したがって、既知の述語の場合、PrologでのCWAの解釈は単純です。つまり、真であると証明できないことは偽です。IEの失敗によって否定され、ないと同じ論理否定。Prologという名前は論理プログラミングに由来しますが、Prologは実用的で実用的なプログラミング言語を目指しています。
Prologに欠けているのは(そしてLogtalkなどによって提供されている)、動的、マルチファイル、または...として宣言することを強制されることなく、または述語を提供することを要求することなく、述語を宣言できることです(この例を参照)。これにより、より単純で明確なCWAセマンティクスが提供されます。句なしで宣言された述語を呼び出すと失敗します(問題のあるフラグをいじる必要はありません)。宣言されていない述語を呼び出すと、述語存在エラーが発生します。unknown
お役に立てれば。失敗として否定を検索すると、さらに明確になるはずです。
a
命題になるには、クエリが言語自体であるa/0
必要があります。つまり、述語として定義されている必要があります。言語のすべてのnullの述語は命題です。最初に言語に追加せずに、新しい用語を述語として照会することはできません。
以下のためにa/1
あなただけとしてそれを定義するときa(b).
、それは言語であり、その後、クエリはa(X), dif(X,b)
プロローグシステムがそれを満たす任意の他の用語を知っているし、他には存在しない密接な世界を想定していないので失敗します。