我在unix上通过poplog运行prolog,并想知道是否有一种方法可以读取多个单词(例如将其封装成一个字符串)。 例如,read(X)只允许X为1个术语。但是,如果我用“”包含用户输入,它将返回一个字符代码列表,这是正确的方法,因为我找不到将其转换回可读字符串的方法。
我还希望能够看到多重字符串是否包含设定值(例如,如果它包含“我已经”),并且我不确定我是如何能够这样做的。
答案 0 :(得分:5)
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)
成功,所以找到了字符串。
答案 1 :(得分:-1)
对于你的问题,最基本和直接的答案似乎是你需要用单引号括起你的输入,即:
read('Multiple Words In A Single Atom').
如你所说,双引号总是转换为ASCII码。