Prolog中从字符串到列表的转换



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

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

该软件启动时使用以下形式的bash脚本:

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

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

现在我发现谓词标记化的形式是:

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

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

是否可以使用某种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(双引号,字符)

~/.swiplrc初始化文件中。使用值chars,可以得到例如:

?-Cs="你好"。Cs=[h,e,l,l,o]

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

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

相关内容

  • 没有找到相关文章

最新更新