在 Prolog 中从字符串转换为列表

Conversion from string to list in Prolog

我正在尝试使用一款软件,但 运行 遇到了一些问题。

值得注意的是,使用预装了 prolog 的大学计算机(OSX) 或 Windows 计算机可以使用相同的软件。虽然它在我的 Linux/Ubuntu 机器上不起作用。

软件以 bash 脚本启动,脚本格式如下:

echo "reset_statistics(off), specific_load_predicate(filename), tokenize(\"\", List), tex(List, )." | ./prolog-executable

prolog 可执行文件是使用 swipl -cqsave_program/1

创建的

现在我发现谓词 tokenize 的形式是:

tokenize([A|As], List) :- ...

所以它需要一个列表作为输入,但是 bash 脚本提供了一个字符串。

是否可以使用某种 prolog 模块或扩展来自动进行从字符串到列表的转换?因为相同的代码可以在其他计算机上运行。

不幸的是,SWI-Prolog 偏离了 Prolog ISO 标准,因为被 双引号 包围的不再是 字符代码列表 .

要恢复这方面的合规行为,请使用以下方法之一:

  1. 使用 --traditional 标志调用 SWI-Prolog
  2. :- initialization(set_prolog_flag(double_quotes, codes)). 添加到您的源文件。
  3. :- set_prolog_flag(double_quotes, codes). 添加到您的 ~/.swiplrc 初始化文件。

事实上,我建议您不要使用字符代码列表,而是完全采用不同的方法并调整您的程序以使用 字符列表,这意味着每个字符由一个原子表示。这有一个很大的优势,即顶级答案与查询中出现的内容非常相似,而且实际上它们本身非常可读。例如,您可以通过以下方式获得 个字符 的列表:

:- set_prolog_flag(double_quotes, chars).

在您的 ~/.swiplrc 初始化文件中。使用值 chars,例如:

?- Cs = "hello".
Cs = [h, e, l, l, o].

我建议您使用此值,并调整您现有的程序以处理字符列表。从长远来看,我认为这将是最好和最广泛使用的方法,这在历史上也是双引号的意思来表示。

在我们到达(返回)之前,您可以使用上述方法之一(即切换到 codes 作为中间解决方案,至少可以解决引入的问题通过 SWI 7),然后调整您的库以使用代码 个字符,最后,切换到 个字符 .