循環参照と再帰によって私のプログラムが失敗するのはなぜですか?

私はこのシンプルなPrologプログラムを書いた。

man(socrates).
mortal(X) :- man(X).
immortal(X) :- immortal(X).

私はソクラテスが人であるかソクラテスが死人であるかといった通常の質問をしました。

?- man(socrates).
true.                    //we know for a fact that Socrates is a man
?- mortal(socrates).
true.                    //and it can logically be inferred that Socrates is mortal
?- immortal(socrates).
                         //but we can't seem to figure out if he's immortal

It crashed because of the recursive definition of
immortal. Circular references also make it crash or
error with Out of stack space.

少なくともこの場合は、プロロッグ氏がプログラムのルールから、ソクラテスが不滅であると推論することはできないと結論づけることはかなり些細なことだと私は思う。どうやって?私はそれがスタックを調べて、すでに横断されているルールを横断しているかどうかを見ることができると思います。

これがまだ実装されていない理由はありますか?私が見落としているようなやり方で問題があるのでしょうか、すでにこのような分析を行っているPrologの実装がありますか?

ベストアンサー

少なくともこの場合、Prolog氏はプログラムのルールから、ソクラテスが不滅であると推測することはできないと結論づけることはかなり些細なことだと思う。

Prologは効率のために不完全推論アルゴリズムを使用します。これは、プログラムが論理的な意味を持っているプログラミング言語であることを意味しています。あなたは、句を書く順番、巡回詞の定義を妨げる順序などに注意する必要があります。

あなたの述語 immortal の論理的意味については、

immortal(X) -> immortal(X)

これは同音異義語であり、論理的な意味を変えずにプログラム/理論から削除することができます。これは、手順上の意味を改善するのに役立つ場合は削除する必要があることを意味します(無限ループを取り除きます)。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です