为prolog阅读多个单词

时间:2010-02-10 12:44:31

标签: input prolog

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

我还希望能够看到多重字符串是否包含设定值(例如,如果它包含“我已经”),并且我不确定我是如何能够这样做的。

2 个答案:

答案 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码。