【问题标题】:Convert a char list to a string in Prolog在 Prolog 中将字符列表转换为字符串
【发布时间】:2014-12-20 02:02:05
【问题描述】:

我正在尝试将 char 数组转换为字符串,然后将此字符串转换为列表。这就是我想要的:

code_list=[97 97]
string_s="aa"
string_list=[aa]

我不确定符号是否正确使用。

【问题讨论】:

    标签: prolog type-conversion swi-prolog


    【解决方案1】:

    一些例子可以帮助你理解在 SWI-Prolog 中表示“字符串”的不同方式,以及从一种表示形式转换为另一种表示形式(注意 Prolog 并没有真正的类型,所以这不是类型转换) .

    这是 SWI-7 及更高版本的全部内容:

    $ swipl --version
    SWI-Prolog version 7.1.27 for x86_64-linux
    

    现在,从顶层开始:

    ?- atom(foo).
    true.
    
    ?- string("foo").
    true.
    
    ?- is_list(`foo`).
    true.
    
    ?- is_list([f,o,o]).
    true.
    
    ?- atom_chars(A, [f,o,o]).
    A = foo.
    
    ?- atom_codes(foo, Codes).
    Codes = [102, 111, 111].
    
    ?- string_codes(Str, `foo`).
    Str = "foo".
    
    ?- write(`foo`).
    [102,111,111]
    true.
    
    ?- string_chars(Str, [f,o,o]).
    Str = "foo".
    

    如果您想了解更多信息,应该阅读有关使用谓词的文档。

    【讨论】:

    • 非常感谢您的详细回答。
    • 如果你想要一个字符串中的一个字符怎么办?
    • @JakeTheSnake string_chars(Str, [Char]),例如string_chars("x", [x])
    【解决方案2】:

    通常,Prolog 系统不支持单独的字符串数据类型。取而代之的是原子、代码列表和字符列表,它们正是用于字符串的目的。因此,如果您正在学习 Prolog,请坚持使用这些类型。以下查询适用于任何 Prolog 系统:

    ?- Code_list = [97, 97], atom_codes(Atom, Code_list), atom_chars(Atom, Chars).
    Code_list = [97, 97],
    Atom = aa,
    Chars = [a, a].
    

    这应该可以回答您的问题。

    为了完整起见,请注意字符串作为单独的数据类型非常罕见。大多数情况下,它们不是对 ISO Prolog 标准的有效扩展。 SWI7 在字符串方面有特别奇怪的行为。首先要尝试的是以下查询:

    ?- phrase("abc","abc").
    

    这个查询应该成功,否则学习 DCGs(Prolog 的主要功能之一)对你来说会很麻烦。在 SWI7 中,默认值为:

    ?- phrase("abc","abc").
    ERROR: Type error: `list' expected, found `"abc"' (a string)
    

    所以双引号表示两种不同的东西。要获得一致的行为,您有多种选择。

    • 安装 SWI Prolog 6 或其他系统,如 GNUSICStus Prolog。

    • 使用 swipl --traditional 调用 SWI,可以修复许多不兼容问题。

    • 将 Prolog 标志 double_quotes 更改为 codeschars。请参阅this answer 这是如何完成的。

    【讨论】:

      【解决方案3】:

      表达你的例子的正确方式是:

      Code_list = [97, 97]
      String_s = "aa"
      

      (我不太清楚你说的最后一行是什么意思。)

      【讨论】:

      • 嗨斯科特,基本上,我想这样做。我有一个 char 数组,例如 [97, 97],我想将它转换为字符串
      • @seleucia 在 SWI Prolog 中,参见 string_to_list/2 谓词。
      • @lurker 你能把用法发给我吗,我是 prolog 的初学者,我不知道如何正确使用它。我看到了,它只用于将字符串转换为列表。
      • string_to_list 可以在任一方向使用(就像 Prolog 中的大多数谓词一样)。
      • string_codes/2 做同样的事情并且名称不那么容易混淆(“to”可能表示功能性阅读)。它也没有被弃用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-19
      • 1970-01-01
      • 2021-12-04
      • 2012-03-22
      • 2013-10-21
      • 1970-01-01
      • 2013-12-05
      相关资源
      最近更新 更多