首页 > 解决方案 > 序言,无限循环

问题描述

我按照代码执行了从 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).

我错过了什么?

标签: loopsprolog

解决方案


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

?- 循环(1),。
1
2
3
...
8
9
cd完成10
11
12
13
14
...
49
50
51
...
32394
32395
...

请注意,您在 Prolog 中陈述子句的文本顺序很重要。

如果交换 的两个子句loop/1,则不会得到单一的解决方案,只会得到源源不断的输出:

?- 循环(1)。
...
42642
42643
...

因此,在 中check_courses/5,如果您在包含它的案例之后放置一个更具体的案例,那么将始终首先尝试文本上的第一个子句。

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


推荐阅读