我是prolog的初学者,我正在努力做点什么。 我试图将char数组转换为字符串。而且我将此字符串转换为列表
这就是我想要的:
code_list=[97 97]
string_s="aa"
string_list=[aa]
我不确定记谱法,天气我是否正确使用它们。
谢谢
答案 0 :(得分:4)
一些例子可以帮助您理解表示字符串的不同方式。在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".
如果您想学习更多内容,则应阅读有关已使用谓词的文档。
答案 1 :(得分:1)
表达你的榜样的正确方法是:
Code_list = [97, 97]
String_s = "aa"
(我不太确定你在最后一行的意思。)
答案 2 :(得分:1)
通常,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").
此查询应该会成功,否则学习DCG(Prolog的主要功能之一)对您来说非常麻烦。在SWI7中,默认值为:
?- phrase("abc","abc").
ERROR: Type error: `list' expected, found `"abc"' (a string)
所以双引号表示法意味着两个不同的东西。要获得一致的行为,您有几种选择。
使用swipl --traditional
调用SWI修复了许多不兼容问题。
将Prolog标志double_quotes
更改为codes
或chars
。请参阅this answer如何完成此操作。