実行すると、しかし...スタックは迅速による無限再帰に埋め、次の例をProlog無限再帰はスタックをいっぱいにしませんか?
is_pos_integer(X):- is_pos_integer(Y),X is Y+1.
is_pos_integer(0).
を、次の例を使用し、バックトラックするために要求された(使用;)、いっぱいにすることなく、同じ無限再帰を打ちますスタック...
is_pos_integer(0).
is_pos_integer(X):- is_pos_integer(Y),X is Y+1.
は、私はどちらかの関数は末尾再帰的であると信じて、そうしない理由秒1 ない原因........... StackOverflowのでしょうか? (yaaaaoww .... サングラス)
どのようなクエリとどのようなPrologシステムでですか? – Eyal
はい、どちらも*再帰的テールです!そして:テールコールの最適化は、*選択ポイント*が残っている場合にのみ適用されます!最初の例では、選択肢を追跡する必要があります。また、もう一つの基本的な注記:Prologシステムの** CLP(FD)**制約で正の整数を記述する方が一般的には優れています。例えば、 'positive_integer(I):-I#> 0.' – mat