Prolog,无限循环

时间:2018-05-17 12:06:20

标签: 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(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 个答案:

答案 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中,如果您在包含它的案例之后提出更具体的案例,那么将始终首先尝试文本第一个子句。

在更复杂的案例之前提出简单的案例!