【问题标题】:Prolog - Infinite loop when closing SWI-prologProlog - 关闭 SWI-prolog 时的无限循环
【发布时间】:2019-01-07 00:54:11
【问题描述】:

我已经在 Prolog 中编写了以下代码:

go :- write(">>"), read(X), process(X).

并用 process/1 做各种事情。 要捕获我添加的任何未知命令:

process(Y) :- write("unknown command.\n"), go.

问题是在程序正常结束之前通过关闭窗口退出 SWI-Prolog 时,它会进入无限循环。 我试图在这样退出时搜索 SWI-Prolog 调用的内容,但找不到它以便将其包含在代码中。 对此部分的任何帮助或替代解决方法将不胜感激。 提前致谢!

【问题讨论】:

  • 有趣的阅读并感谢您的输入。我实现循环的方式是在每个过程中返回。该程序运行良好(据我所知),除非我关闭 SWI-prolog 的窗口。
  • 你处理过end_of_file吗?这是在 EOF 上读取的。
  • 这似乎解决了它。谢谢!我仍然是 prolog 的初学者...是否可以安全地假设关闭 SWI-prolog 会关闭流并给出 end_of_file 原子?
  • @Syrko:我不是初学者,但这个术语级 I/O 对我来说仍然很痛苦,也是。尽量避免它。而是重新查阅 Prolog 程序而不是阅读 - 如果可能的话。

标签: prolog


【解决方案1】:

你也需要处理end_of_file这个词。

在最后一个 Prolog 术语之后,即只有布局或 cmets 被读取到文件或流的末尾时,read/1 产生术语 end_of_file

由于(在许多当前系统中)读取文件末尾(在标准输入上)时要执行的操作是reset,因此后续读取也会产生此术语。因此,您的程序在抱怨它不知道命令end_of_file 时循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    相关资源
    最近更新 更多