我正在尝试使用一个软件而且我遇到了一些问题。
值得注意的是,使用预装了prolog(OSX)或Windows计算机的大学计算机可以使用相同的软件。虽然它在我的Linux / Ubuntu机器上不起作用。
该软件使用以下格式启动bash脚本:
echo "reset_statistics(off), specific_load_predicate(filename), tokenize(\"$2\", List), tex(List, $3)." | ./prolog-executable
使用swipl -c
和qsave_program/1
现在我发现谓词tokenize的形式是:
tokenize([A|As], List) :- ...
因此它需要一个列表作为输入,但是bash脚本提供了一个String。
是否可以使用某种prolog模块或扩展程序自动进行从字符串到列表的转换?因为相同的代码适用于其他计算机。
答案 0 :(得分:2)
不幸的是,SWI-Prolog偏离了Prolog ISO标准,因为双引号所包围的内容不再是字符代码的列表。
要恢复此方面的合规行为,请使用以下方法之一:
--traditional
标志:- initialization(set_prolog_flag(double_quotes, codes)).
添加到源文件中。:- set_prolog_flag(double_quotes, codes).
添加到您的~/.swiplrc
初始化文件中。事实上,我建议您不要使用字符代码列表,而是采用不同的路径并调整程序以使用字符列表,这意味着每个字符都由一个原子表示。这具有很大的优势,即顶层答案仍然与查询中出现的非常相似,并且实际上它们本身是可读的。您可以通过输入以下内容获取字符的列表
:- set_prolog_flag(double_quotes, chars).
在~/.swiplrc
初始化文件中。使用值字符,您可以获得例如:
?- Cs = "hello". Cs = [h, e, l, l, o].
我建议您使用此值,并调整现有程序以使用字符列表。从长远来看,我认为这将是最好和最广泛使用的方法,这在历史上也是双引号意味着来表示。
在我们到达(返回)之前,您可以使用上述方法之一(即切换到代码作为中间解决方案,至少解决SWI 7引入的问题),然后调整您的库以使用代码和字符,最后切换到字符。