Loops 序言,无限循环

Loops 序言,无限循环,loops,prolog,Loops,Prolog,我没有使用下面的代码来检查从476开始到520结束的所有学生ID schedule_errors(A,B,C):- Errors is 0, check_Courses(476,A,B,C,Errors). check_Courses(X,A,B,C,Errors):- . . . . . . Y is X+1, check_Courses(Y,A,B,C,Er). 问题是程序一直不稳定地运行,忽略我的退出循环谓词 check_Courses(5

我没有使用下面的代码来检查从476开始到520结束的所有学生ID

schedule_errors(A,B,C):-
    Errors is 0,
    check_Courses(476,A,B,C,Errors).

check_Courses(X,A,B,C,Errors):-
   . .
   . .
   . .
   Y is X+1,
   check_Courses(Y,A,B,C,Er).
问题是程序一直不稳定地运行,忽略我的退出循环谓词

check_Courses(520,A,B,C,Er):-
    write('Check complete').
我不明白我做错了什么。我尝试了一个类似的更简单的版本(只是数到10),效果很好

loop(10):-
    write('cd finished').

loop(X):-
    write(X), nl,
    Y is X+1,
    loop(Y).

我遗漏了什么?

一个重要的观察结果是
循环/1
也不会终止。您可以看到如下示例:

?- loop(1), false. 1 2 3 ... 8 9 cd finished10 11 12 13 14 ... 49 50 51 ... 32394 32395 ... 因此,在
check_courses/5
中,如果您在包含它的案例之后放置更具体的案例,那么文本上的第一个子句将始终首先被检索


把简单的案例放在更复杂的案例之前

我还使用了trace,当它达到520时,它似乎进入了check_过程(X,A,B,C,Errors):-而不是check_过程(520,A,B,C,Er):-并继续循环 ?- loop(1). ... 42642 42643 ...