我是prolog的初学者,我正在尝试做某些事情。 我试图将字符数组转换为字符串。比我会转换这个字符串列表将字符列表转换为序言中的字符串
这就是我想要的东西:
code_list=[97 97]
string_s="aa"
string_list=[aa]
我不知道有关的符号,天气我正确或不使用它们。
谢谢
我是prolog的初学者,我正在尝试做某些事情。 我试图将字符数组转换为字符串。比我会转换这个字符串列表将字符列表转换为序言中的字符串
这就是我想要的东西:
code_list=[97 97]
string_s="aa"
string_list=[aa]
我不知道有关的符号,天气我正确或不使用它们。
谢谢
几个例子这可能会帮助您理解在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".
,如果你想学,就应该阅读所使用的谓词的文档多一点。
通常,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)
所以双引号符号表示两种不同的东西。为了获得一致的行为,你有几个选择。
调用SWI与swipl --traditional
修复了许多不兼容问题。
将Prolog标志double_quotes
更改为codes
或chars
。请参阅this answer这是如何完成的。
非常感谢您的详细解答。 – seleucia
如果你只需要一个字符串就可以了? – JakeTheSnake
@JakeTheSnake'string_chars(Str,[Char])',例如'string_chars(“x”,[x])' –