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