Bash Prolog中从字符串到列表的转换
我试图使用一个软件,但遇到了一些问题 值得注意的是,使用预装了prolog(OSX)的大学计算机或Windows计算机,同样的软件也可以工作。虽然它不能在我的Linux/Ubuntu机器上运行 软件启动时使用以下形式的bash脚本:Bash Prolog中从字符串到列表的转换,bash,prolog,swi-prolog,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 prolog
echo "reset_statistics(off), specific_load_predicate(filename), tokenize(\"$2\", List), tex(List, $3)." | ./prolog-executable
prolog可执行文件是使用swipl-c
和qsave_程序/1
现在我发现谓词tokenize的形式如下:
tokenize([A|As], List) :- ...
因此它接受一个列表作为输入,但是bash脚本提供了一个字符串
是否可以使用某种prolog模块或扩展自动将字符串转换为列表?因为相同的代码可以在其他计算机上运行。不幸的是,SWI Prolog与Prolog ISOstandard的不同之处在于,双引号包围的不再是字符代码列表 要恢复这方面的合规行为,请使用以下方法之一:
--traditional
标志调用SWI Prolog:-初始化(设置prolog\u标志(双引号,代码))。
添加到源文件中:-设置prolog\u标志(双引号,代码)。
到~/.swiplrc
初始化文件在我们(回到)那里之前,您可以使用上述方法之一(即切换到代码作为中间解决方案,至少解决SWI7引入的问题),然后调整您的库以使用代码和字符,最后切换到字符。在SWI Prolog中,将序言标志
double_quotes
设置为chars
(推荐)或codes
以将双引号内的所有内容转换为字符或代码列表。这就是它最初应该做的事情,其他Prolog系统也是这样做的。您还可以使用命令行选项--traditional
来获得这方面的标准一致性行为。@mat Great!这就是我一直在寻找的答案。当我用--traditional启动swipl时,它可以工作,但它不能与正在使用的所有bash脚本一起工作,有没有办法在系统范围内设置它?您可以添加一个bash别名,例如:alias swipl='/usr/local/bin/swipl--traditional'
,或者put:-set\u prolog\u标志(双引号,chars).
在您的~/.swiplrc
中。请注意,当您的讲师使用不同的方式调用SWI Prolog时,所有这些都会导致非常有趣的情况。这就好像应该有一个标准的Prolog!bash别名不起作用,因为bash脚本使用绝对路径。但我进一步将set_prolog_标志添加到我的.swiplrc中。现在我得到了错误:可能您有一些代码依赖于双引号
被设置为代码
,您可以尝试一下。请注意,理想情况下,编写库代码时应同时使用字符
和代码
!历史上,chars
是首选选项(即双引号被视为字符列表);后来,这被改为code
,我认为长期的最佳选择是再次回到chars
。因此,短期内,将双引号
设置为代码
,以解决SWI 7问题,并使您未来的代码能够安全地使用字符
!
?- Cs = "hello".
Cs = [h, e, l, l, o].