【问题标题】:Reading in multiple words for prolog为序言阅读多个单词
【发布时间】:2010-02-10 12:44:31
【问题描述】:

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

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

【问题讨论】:

  • 在 Prolog 中,字符串是整数列表(字符代码),所以你得到了正确的东西。您是否正在寻找一种将返回的字符串正确呈现给用户的方法?

标签: input prolog


【解决方案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)

成功,所以字符串被找到了。

【讨论】:

  • (但总的来说,远离标准 Prolog I/O,这太可怕了。使用 IPC 或嵌入,这样您就可以用适当支持它的语言编写 I/O。)
  • 我认为诀窍是在 Prolog 中使用纯方法:编写一个描述您想要的 DCG,然后使用 library(pio) 将该 DCG 应用于实际的输入流。这样做的好处是,与其他语言相比,您实际上也可以独立于实际输入来测试 DCG,就像任何纯谓词一样。
  • @mat:我不知道 pio 库(似乎只有 SWI)。它确实看起来比标准 Prolog I/O 干净得多。
  • 是的,目前“只有”SWI(即可以说是使用最广泛的系统)拥有它,实际上对我来说,这是实际使用 SWI 而不是其他系统的主要原因之一。仅此库就完全值得,因为您只需要教授/学习 DCG,然后也可以透明地将它们用于 I/O。相比之下,看看用其他语言实际测试输入/输出有多难!
【解决方案2】:

似乎对您的问题最基本和最直接的答案是您需要将输入用单引号括起来,即:

read('Multiple Words In A Single Atom').

正如你所说,双引号总是转换为 ASCII 码。

【讨论】:

    猜你喜欢
    • 2019-07-13
    • 2018-04-25
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多