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

时间:2016-05-29 10:51:17

标签: bash prolog swi-prolog

我正在尝试使用一个软件而且我遇到了一些问题。

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

该软件使用以下格式启动bash脚本:

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

使用swipl -cqsave_program/1

创建prolog可执行文件

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

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

因此它需要一个列表作为输入,但是bash脚本提供了一个String。

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

1 个答案:

答案 0 :(得分:2)

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

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

  1. 使用--traditional标志
  2. 调用SWI-Prolog
  3. :- initialization(set_prolog_flag(double_quotes, codes)).添加到源文件中。
  4. :- set_prolog_flag(double_quotes, codes).添加到您的~/.swiplrc初始化文件中。
  5. 事实上,我建议您不要使用字符代码列表,而是采用不同的路径并调整程序以使用字符列表,这意味着每个字符都由一个原子表示。这具有很大的优势,即顶层答案仍然与查询中出现的非常相似,并且实际上它们本身是可读的。您可以通过输入以下内容获取字符的列表

    :- set_prolog_flag(double_quotes, chars).
    

    ~/.swiplrc初始化文件中。使用值字符,您可以获得例如:

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

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

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