为prolog阅读多个单词

pro*_*789 11 input prolog

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

我还希望能够看到多重字符串是否包含设定值(例如,如果它包含"我已经"),并且我不确定我将如何能够做到这一点.

Fre*_*Foo 5

read/1从标准输入中读取一个Prolog项目.如果输入一个包含在其中的字符串",它确实会将该字符串作为一个对象读取,该对象是ASCII或Unicode代码点的列表:

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

请注意字符串后的句点表示期末.要将其转换为原子("可读字符串"),请使用atom_codes:

?- read(X), atom_codes(C,X).
|: "I have been programming in Prolog" .
C = 'I have been programming in Prolog'.
Run Code Online (Sandbox Code Playgroud)

注意单引号,所以这是一个原子.但是,原子(显然)是原子的,因此不可搜索.要搜索,请始终使用字符串(否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).
Run Code Online (Sandbox Code Playgroud)

然后

read(X), substring("Prolog",X)
Run Code Online (Sandbox Code Playgroud)

成功,所以找到了字符串.