终止[用户]。在Prolog中使用EOT字符

时间:2017-11-07 05:34:47

标签: prolog

我正在编写一个使用不同编程语言的Prolog解释器的包装器。我没有详细介绍,但它基本上生成了一个符合要求的Prolog程序,并将程序从标准输入提供给解释器。我是Prolog的新手。

问题是,我找不到从标准输入中读取规则的[user].术语的规范。具体来说,它如何检测输入的结束。

实现此目的最直观的方法是发送EOT字符(Ctrl-D),但它似乎不起作用。下面是一个说明性示例,将^ D替换为实际的EOT字符。假设此文件保存在input.pl中。我打算以编程方式生成这样的代码,并通过标准输入将其提供给后台prolog进程。

[user].
factorial(0,1).
factorial(N,F) :- (>(N,0),is(N1,-(N,1)),factorial(N1,F1),is(F,*(N,F1))).
^D
factorial(3,W).

当我运行cat input.pl | <prolog>其中<prolog>是Prolog解释器(swipl,yap等)时,它似乎无法识别^ D.为什么这样,我该如何解决这个问题?在终端^ D工作正常。

上面的例子应该返回“W = 6”。 SWI抱怨Syntax error: illegal_character。 Yap似乎忽略了^ D,只是解析所有内容并返回yes

当然我可以将程序写入临时文件并告诉解释器查阅该文件,但速度很慢。

1 个答案:

答案 0 :(得分:5)

代替end_of_file.^D。这适用于许多Prolog实现,因为它们的实际读取是使用read/1执行的。从历史上看,从DECsystem 10 Prolog开始,系统只有read/1但没有at_end_of_stream/0和相关的内置谓词。实际上,一些程序员在Prolog源文件中使用end_of_file.来允许将任意文本附加到Prolog源。