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

时间:2016-04-22 14:51:27

标签: 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 ~s: _G7118

我也尝试用writeq替换格式,如:

hello(_) :-
  write('\nEnter Name: '),
  read(Name),
  writeq(Name).

哪个不会引发错误但最终会打印_L143而不是Bob

2 个答案:

答案 0 :(得分:2)

(评论太长)

不要像这样使用read,正如@lurker所解释的那样,它不是用于输入“字符串”或“文本”或完全回答问题。在走这条路之前,问问自己:“为什么?”

Prolog顶级是您的交互式命令行提示符。它与C或任何其他编译语言不同,您需要实际编写解释器。

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

hello(Name) :-
    format("~w~n", [Name]).

当然,您仍需要在提示中说出hello("Bob")hello('Bob')

如果你想在Prolog顶层制作自己的翻译,这完全是另一回事。

答案 1 :(得分:-1)

正如其他人所说,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).

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