我在Unix上通过poplog运行序言,并且想知道是否有一种方法可以读取多个单词(例如将其装入字符串)。
例如,read(X)将只允许X为1项。但是,如果用“”括住用户输入,它将返回字符代码列表,这是正确的方法,因为我找不到将其转换回可读字符串的方法。

我还希望能够查看多字字符串是否包含一个设置值(例如,如果它包含“我去过”),并且不确定我也将如何做到这一点。

最佳答案

read/1从标准输入中读取一个Prolog项。如果输入一个用"括起来的字符串,它将确实将该字符串作为一个对象读取,该对象是ASCII或Unicode代码点的列表:

?- read(X).
|: "I have been programming in Prolog" .
X = [73, 32, 104, 97, 118, 101, 32, 98, 101|...].

注意字符串后的句点表示期末。要将其转换为原子(“可读字符串”),请使用atom_codes:
?- read(X), atom_codes(C,X).
|: "I have been programming in Prolog" .
C = 'I have been programming in Prolog'.

注意单引号,所以这是一个原子。但是,原子是原子的(显然),因此不可搜索。要进行搜索,请始终使用字符串(不使用atom_codes)和类似以下内容的字符串:
/* brute-force string search */
substring(Sub,Str) :- prefix_of(Sub,Str).
substring(Sub,[_|Str]) :- substring(Sub,Str).

prefix_of(Pre, Str) :- append(Pre, _, Str).

然后
read(X), substring("Prolog",X)

成功,因此找到了字符串。

关于input - 多言多语地读序言,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2236798/

10-11 22:02