prolog循環参照と再帰によって私のプログラムが失敗するのはなぜですか?私はこのシンプルなPrologプログラムを書いた。immortal(X).私はソクラテスが人であるかソクラテスが死人であるかといった通常の質問をしました。space.少なくともこの場合は、プロロッグ氏がプログラムのルールから、ソクラテスが不滅であると推論することはできないと結論づけることはかなり些細なことだと私は思う。やって?私はそれがスタックを調べて、すでに横断されているルールを横断しているかどうかを見ることができると思います。LasseV.Karlsenはい。"テーブルリング"を探していますが、少数のプロローグ実装だけがそれをサポートしています(例えばXSBやYAP)。答え少なくともこの場合、Prolog氏はプログラムのルールから、ソクラテスが不滅であると推測することはできないと結論づけることはかなり些細なことだと思う。Prologは効率のために不完全推論アルゴリズムを使用します。これは、プログラムが論理的な意味を持っているプログラミング言語であることを意味しています。あなたは、句を書く順番、巡回詞の定義を妨げる順序などに注意する必要があります。immortal(X)これは同音異義語であり、論理的な意味を変えずにプログラム/理論から削除することができます。これは、手順上の意味を改善するのに役立つ場合は削除する必要があることを意味します(無限ループを取り除きます)。salva源あなたの定義とその解釈方法:man(socrates).ソクラテスは男です。man(X).すべての人は死人です。immortal(X).すべての不滅は不滅です。Prologがそれらをどのように解釈するか:man(socrates).あなたがソクラテスの男性について尋ねるなら、私はそれが本当であることを知っています。man(X).あなたが誰かの死亡について私に尋ねるなら、私は彼の男らしいことをチェックします(そして、それが本当であれば死亡もそうです)。immortal(X).誰かの不滅について私に尋ねるなら、彼の不滅をチェックします。常に偽であると結論付けることができると仮定しました。Overflowに「再帰」バッジがあり、再帰バッジを取得する唯一の方法は、再帰バッジを取得することです。取得することは不可能です。定義を完全に省くほうが簡単でしょう。それは本質的に同じことを意味します。immortal(X):-False。!を宣言することができます。間違って、何年もPrologを使っていない)。JoeLehmann:あなたはもちろんコース外です。私は私のコメントを編集します。immortal(X):-False。宣言することができます。Olson:それは非常に異なっています。ISO-Prologで宣言された未定義の呼び出しは失敗しませんが、エラーをトラフします。間違っていれば、すべてのXが不滅であると言います。loopy(Y).あなたのMr.Prologは、虚偽の(Y)が既に呼び出されて失敗すると推測します。