序言,无尽循环



我没有按照代码检查从 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中,如果您在包含它的案例之后放置一个更具体的案例,那么文本上的第一个子句将始终首先被尝试 。

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

最新更新