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

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

我试图使用一个软件,但遇到了一些问题

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

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

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
    初始化文件
  • 事实上,与使用字符代码列表不同,我建议您完全采用不同的方法,并调整您的程序以使用字符列表,这意味着每个字符都由anatom表示。这有一个很大的优势,即顶级答案与查询中出现的答案非常相似,而且实际上它们本身是可读的。您可以通过以下方式获得字符列表:

    :- set_prolog_flag(double_quotes, chars). 我建议您使用此值,并调整现有程序以处理字符列表。从长远来看,我认为这将是最好和最广泛使用的方法,这在历史上也是双引号的意思


    在我们(回到)那里之前,您可以使用上述方法之一(即切换到代码作为中间解决方案,至少解决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].