私は述語がルールアトム/ 1述語がプロローグでどのように機能しますか?
edge(a,b).
edge(a,c).
edge(b,d).
edge(c,d).
edge(d,e).
edge(d,f).
edge(f,g).
あるProlog.whereで経路探索の問題を解決しようとしているがであります edge(X,Y) :- edge(X,Z), edge(Z,Y).
次に、私がコンパイルしてクエリを実行したとき | ?- edge(a,X)
。 Fatal Error: local stack overflow (size: 8192 Kb, environment variable used: LOCALSZ)
私は解決策を探して、我々のルールでatom(x).
,atom(y).
を含むことがスタックオーバーフローの問題を解決できることを発見しました。つまり、新しいルールが
edge(X,Y) :- atom(X), atom(Y), edge(X,,Z), edge(Z,Y).
で、はい、それは、スタックオーバーフローの問題を解決しなかった.but、私は(原子/ 1) 述語がここに私の問題を解決する方法を、まさにこのお知りになりたい?それは私たちに何をしますか変数X,Y
は、StackOverflowの問題を解決するには? 私はPrologの初心者であり、何か助けていただければ幸いです ありがとうございます。 :)
atom/1は必要ありませんが、(a)2つのノード間のパスを表す述語です。例については、[最近の投稿](https://stackoverflow.com/a/46615555/6101159)を参照してください。 – tas
'atom/1'は本当にあなたの問題を解決しますか?言い換えれば、 'edge(X、Y)'は実際には正しい解決法をすべてクエリに提供していますか?それがするのは、その引数が原子であることを保証することだけで、アンバインドされた変数にすることはできません。だから私は 'edge(X、Y)'がすべての正しい解を提供しているとは思わない。それはあなたが直接の事実を持っている解決策をもたらすだけです。つまり、有効なパスである 'edge(a、d)'は依然として失敗します。あなたの新しい 'edge(X、Y)'は、 'X'が束縛されていなければ' atom(X) 'が失敗するので常に失敗します。 – lurker
https://stackoverflow.com/questions/44443958/prolog-routing-between-2-points-and-making-a-list-of-it/44588639#44588639 ここで似たような問題があります。私の答えはあなたの問題に対する解決策。違いは、私が歩いたエッジを思い出していたことです。頂点を覚えておく必要があります。 – Armatorix