Я пытаюсь выяснить, есть ли у меня бесконечный цикл в моей программе на Прологе, или я просто плохо написал его, поэтому он медленный. Я пытаюсь решить проблему цепочек квадратных сумм от dailyprogrammer сабреддит. Для заданного числа N найдите такой порядок чисел от 1 до N (включительно), чтобы сумма каждой пары соседних чисел в этом порядке была полным квадратом. Наименьшее N, для которого это верно, равно 15 с порядком [8, 1, 15, 10, 6, 3, 13, 12, 4, 5, 11, 14, 2, 7, 9]
. Это код, который я пытаюсь использовать для решения проблемы:
is_square(Num):- is_square_help(Num, 0).
is_square_help(Num, S):- Num =:= S * S.
is_square_help(Num, S):-
Num > S * S,
T is S+1,
is_square_help(Num, T).
is_square_help(Num, S):- Num < S * S, fail.
contains(_, []):- fail.
contains(Needle, [Needle|_]).
contains(Needle, [_|Tail]):- contains(Needle, Tail).
nums(0, []).
nums(Num, List) :- length(List, Num), nums_help(Num, List).
nums_help(0, _).
nums_help(Num, List) :-
contains(Num, List),
X is Num - 1,
nums_help(X, List).
square_sum(Num, List) :-
nums(Num, List),
square_sum_help(List).
square_sum_help([X, Y|T]) :-
Z is X + Y,
is_square(Z),
square_sum_help(T).
В настоящее время, когда я запускаю square_sum(15, List).
, программа не завершается. Я оставил его в покое примерно на 10 минут, и он просто продолжает работать. Я знаю, что есть проблемы, на решение которых уходит много времени, но другие, как сообщается, генерируют ответы порядка миллисекунд. Что я здесь делаю неправильно?