我做了以下代码,从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).
我缺少什么?
答案 0 :(得分:4)
一个重要的观察结果是loop/1
不会终止。您可以看到以下内容:
?- loop(1), false. 1 2 3 ... 8 9 cd finished10 11 12 13 14 ... 49 50 51 ... 32394 32395 ...
请注意,您在Prolog中陈述条款的文本顺序。
如果您交换loop/1
的两个子句,那么您没有一个解决方案,只有无穷无尽的输出:
?- loop(1). ... 42642 42643 ...
因此,在check_courses/5
中,如果您在包含它的案例之后提出更具体的案例,那么将始终首先尝试文本第一个子句。
在更复杂的案例之前提出简单的案例!