6

Prolog - Programming for Artificial Intelligence で、Bratko は 58 ページで次のように述べています。

「Prolog でのマッチングは、論理の統一と呼ばれるものに対応します。ただし、ほとんどの Prolog システムでは効率上の理由から、マッチングは統一に正確に対応しない方法で実装されるため、統一という言葉は避けます。適切な統一には、そのようにする必要があります。 -呼び出された発生チェック: 与えられた変数が与えられた用語で発生しますか?発生チェックはマッチングを非効率にします."

私の質問は、miniKanren での統合がこの効率の低下に悩まされているかどうか、またはこの問題はどのように解決されているかということです。

4

2 に答える 2

5

ここにはいくつかの誤解があります。まず、ISO predicate を使用して、Prolog でも健全な統合を利用できますunify_with_occurs_check/2

第 2 に、このサウンドの統合は、一部の Prolog システムで、すべての統合に対してデフォルトで有効にすることができます。たとえば、occurs_checkSWI-Prolog の Prolog フラグを参照してください。

第三に、発生チェックを有効にすると、チェックを無効にするよりもプログラムの順序が高速になる例を簡単に作成できます。

第 4 に、一致チェックという用語を使用して発生チェックを省略した統合を説明することは、非常に悪い考えです。一致とは、関数型言語における一方向の統合を意味します。Prolog では、発生チェックが無効になっている場合でも、統合は常に全方向で機能します。

したがって、質問の Prolog 部分については、Prolog システムがサポートしている場合は、発生チェックを有効にしてプログラムをテストすることを強くお勧めします。通常、発生チェックが必要な統合は、Prolog プログラムのプログラミング エラーを示します。このため、たとえば、システムが例外をスローするような方法でフラグを設定することができます。

于 2015-11-17T09:58:44.943 に答える