ฉันกำลังพยายามคิดว่าฉันมีวงวนไม่สิ้นสุดในโปรแกรม Prolog ของฉันหรือว่าฉันเพิ่งเขียนมันได้ไม่ดี ดังนั้นมันจึงช้า ฉันกำลังพยายามแก้ปัญหา square sum chains จาก dailyprogrammer subreddit เมื่อระบุตัวเลข 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 นาที และมันก็ยังคงทำงานต่อไป ฉันรู้ว่ามีปัญหาที่ใช้เวลานานในการแก้ไข แต่มีรายงานว่ามีบางปัญหาที่สร้างคำตอบในเวลาเสี้ยววินาที ฉันทำอะไรผิดที่นี่?