loops - 序言,无限循环
问题描述
我按照代码执行了从 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 cd完成10 11 12 13 14 ... 49 50 51 ... 32394 32395 ...
请注意,您在 Prolog 中陈述子句的文本顺序很重要。
如果交换 的两个子句loop/1
,则不会得到单一的解决方案,只会得到源源不断的输出:
?- 循环(1)。 ... 42642 42643 ...
因此,在 中check_courses/5
,如果您在包含它的案例之后放置一个更具体的案例,那么将始终首先尝试文本上的第一个子句。
把简单的案例放在更复杂的案例之前!
推荐阅读
- android - Android DarkMode:价值之夜不起作用
- android - 使用深色主题时如何使 Android CardView 可见
- javascript - 仅更新对象数组中的一个属性会做出反应
- ssis - 如何使用“关键字'FROM'附近的语法不正确”异常调试复合实体?
- javascript - 在数组映射中反应访问 setState
- sql-server - 使用存储过程将数据类型 varchar 转换为 int 时出错
- javascript - 处理 3 个微服务的竞争条件的正确方法。(Promise.all ?)
- shell - 回显输出未分配给 shell 脚本中的变量
- mysql - 将单个 MariaDB 转换为 Galera 集群
- phpmyadmin - 在 PhpMyAdmin 中创建用户时出现权限表中未找到所选用户的错误