我没有按照代码检查从 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).
我错过了什么?
一个重要的观察结果是,loop/1
也不会终止。例如,您可以看到这一点,如下所示:
?- 循环(1),假。 1 2 3 ... 8 9 光盘完成10 11 12 13 14 ... 49 50 51 ... 32394 32395 ...
请注意,您在Prolog中陈述条款的文本顺序很重要。
如果交换loop/1
的两个子句,那么你得到的不是单一的解决方案,只有源源不断的 输出:
?- 循环(1)。 ... 42642 42643 ...
因此,在check_courses/5
中,如果您在包含它的案例之后放置一个更具体的案例,那么文本上的第一个子句将始终首先被尝试 。
将简单的案例放在更复杂的案例之前!