gpt4 book ai didi

prolog - 终止[用户]。 Prolog 中带有 EOT 字符

转载 作者:行者123 更新时间:2023-12-02 00:52:18 25 4
gpt4 key购买 nike

我正在为使用不同编程语言的 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 .

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

最佳答案

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

关于prolog - 终止[用户]。 Prolog 中带有 EOT 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47150643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com