Io 使用Prolog输出任何字符串输入
检查是否可以使用基本模型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
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:没有重新定位流用户输入的权限
。它就是不起作用<代码>读取行到行代码(用户输入,行)
工作,以及此答案中的解决方案。是的,不幸的是,情况仍然如此。我希望有更多的人对这个图书馆感兴趣。