Вот причина этого не прекращения. Ваш запрос не прекращается, потому что есть fail-slice вашей программы, которая не завершается:
?- frack(4).
<s>frack(3) :- <b>false</b></s>.
frack(X) :-
frack(X-1), <b>false</b>.
Вы можете исправить это, только изменив что-то в видимой части. Три SO-ответа предлагают использовать (is)/2
. Но это не удалит не прекращение! Фактически, использование (is)/2
приводит к практически одинаковому фрагменту:
?- frack(4).
<s>frack(3) :- <b>false</b></s>.
frack(X) :-
Y is X - 1,
frack(Y), <b>false</b>.
По крайней мере, frack(4)
теперь успешен, но он будет зацикливаться при возврате. Вы должны изменить что-то в видимой части, например, какой-нибудь тест для X
, чтобы избежать не-прекращения. См. fail-slice для получения дополнительной информации.