【发布时间】:2014-12-20 02:02:05
【问题描述】:
我正在尝试将 char 数组转换为字符串,然后将此字符串转换为列表。这就是我想要的:
code_list=[97 97]
string_s="aa"
string_list=[aa]
我不确定符号是否正确使用。
【问题讨论】:
标签: prolog type-conversion swi-prolog
我正在尝试将 char 数组转换为字符串,然后将此字符串转换为列表。这就是我想要的:
code_list=[97 97]
string_s="aa"
string_list=[aa]
我不确定符号是否正确使用。
【问题讨论】:
标签: prolog type-conversion swi-prolog
一些例子可以帮助你理解在 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".
如果您想了解更多信息,应该阅读有关使用谓词的文档。
【讨论】:
string_chars(Str, [Char]),例如string_chars("x", [x])
通常,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)
所以双引号表示两种不同的东西。要获得一致的行为,您有多种选择。
使用 swipl --traditional 调用 SWI,可以修复许多不兼容问题。
将 Prolog 标志 double_quotes 更改为 codes 或 chars。请参阅this answer 这是如何完成的。
【讨论】:
表达你的例子的正确方式是:
Code_list = [97, 97]
String_s = "aa"
(我不太清楚你说的最后一行是什么意思。)
【讨论】:
string_to_list/2 谓词。
string_to_list 可以在任一方向使用(就像 Prolog 中的大多数谓词一样)。
string_codes/2 做同样的事情并且名称不那么容易混淆(“to”可能表示功能性阅读)。它也没有被弃用。