Saya mencoba mencari tahu apakah saya memiliki loop tak terbatas dalam program Prolog saya, atau apakah saya menulisnya dengan buruk, jadi lambat. Saya mencoba menyelesaikan masalah rantai jumlah persegi dari dailyprogrammer subreddit. Diberikan bilangan N, carilah urutan bilangan 1-N (inklusif) sedemikian rupa sehingga jumlah setiap pasangan bilangan yang berdekatan dalam pengurutan tersebut adalah kuadrat sempurna. N terkecil yang dimilikinya adalah 15, dengan urutan [8, 1, 15, 10, 6, 3, 13, 12, 4, 5, 11, 14, 2, 7, 9]
. Ini adalah kode yang saya coba gunakan untuk menyelesaikan masalah:
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).
Saat ini, ketika saya menjalankan square_sum(15, List).
, program tidak berhenti. Saya membiarkannya selama sekitar 10 menit, dan terus berjalan. Saya tahu bahwa ada masalah yang membutuhkan waktu lama untuk diselesaikan, namun masalah lain dilaporkan menghasilkan jawaban dalam hitungan milidetik. Apa yang saya lakukan salah di sini?