Io 使用Prolog输出任何字符串输入

Io 使用Prolog输出任何字符串输入,io,prolog,Io,Prolog,检查是否可以使用基本模型prolog(无模块)可靠地格式化字符串。我有以下代码,我认为可以工作,但没有: hello(_) :- write('\nEnter Name: '), read(Name), format('\nThe name you entered is: ~s', [Name]). 如果用户输入了Bob.,则会抛出错误,但如果用户输入了“Bob.或“Bob. ERROR: format/2: Illegal argument to format sequence

检查是否可以使用基本模型prolog(无模块)可靠地格式化字符串。我有以下代码,我认为可以工作,但没有:

hello(_) :-
  write('\nEnter Name: '),
  read(Name),
  format('\nThe name you entered is: ~s', [Name]).
如果用户输入了
Bob.
,则会抛出错误,但如果用户输入了
“Bob.
“Bob.

ERROR: format/2: Illegal argument to format sequence ~s: _G7118
我还尝试用
writeq
替换格式,如:

hello(_) :-
  write('\nEnter Name: '),
  read(Name),
  writeq(Name).
这不会引发错误,但最终打印的是
\u L143
,而不是
Bob

(注释太长)

不要像@Lougler解释的那样使用
阅读
,它不是用来输入“字符串”或“文本”或问题的答案。在走这条路之前,问问自己:“为什么?”

Prolog顶层是交互式命令行提示符。它不像在C或任何其他编译语言中,您需要实际制作解释器

因此,您的
hello/1
可能如下所示:

hello(Name) :-
    format("~w~n", [Name]).
当然,您仍然需要在提示符下说
hello(“Bob”)
hello(“Bob”)


如果您想在Prolog顶层上创建自己的解释器,这完全是另一回事。

正如其他人所说,
read/1
只读取有效的Prolog语法。要使用标准Prolog原语读取任意一行文本,必须逐个字符读取输入:

read_line(Cs) :-
    get_code(C),
    ( C == 0'\n -> Cs = []     % end of line
    ; C == -1   -> Cs = []     % end of input
    ; Cs = [C|Cs1], read_line(Cs1)
    ).
当您使用的是SWI Prolog(由您使用的format/2和(被其他人删除的)SWI Prolog标记指示)时,您还可以使用

read_line(String) :-
    current_input(Input),
    read_string(Input, "\n", "\r", End, String).

其他系统有相同或相似的谓词,但它们没有标准化。

为什么对
hello
有一个无名参数?您可以只使用
hello:-…
。关于您的错误,
read/1
希望输入一个Prolog术语。因此,当您输入不带引号的
Bob
时,Prolog将其视为一个术语,在本例中它是一个变量。
格式
需要一个原子,但看到一个变量
writeq
将其作为namless变量写入,
\U L143
Bob
周围的引号使其成为一个atom,这是您想要阅读的内容。对于SWI Prolog,还有
read\u line\u to\u codes/2
,以及中的其他有用谓词。我没有否决这一点,但这样做似乎有点1970年风格。我只能建议不要这样做的一个原因是,这种做I/O的方法很难用单元测试进行测试。如果您确实想读取一行,请使用DCG并使用SICStus和SWI中的
库(pio)
,然后将DCG应用于文件或流。这是非常有效的(在内部,它以块的形式读取字符,而不是一个接一个地读取),并且可以更容易地通过单元测试进行测试。在这种情况下,OP接受另一个答案也暗示这根本不是这里真正需要的。@mat
?-phrase\u from\u stream(第(L)行,用户输入)。错误:设置流位置/2:没有重新定位流用户输入的权限
。它就是不起作用<代码>读取行到行代码(用户输入,行)
工作,以及此答案中的解决方案。是的,不幸的是,情况仍然如此。我希望有更多的人对这个图书馆感兴趣。