将char列表转换为prolog中的字符串

时间:2014-12-20 02:02:05

标签: prolog type-conversion swi-prolog

我是prolog的初学者,我正在努力做点什么。 我试图将char数组转换为字符串。而且我将此字符串转换为列表

这就是我想要的:

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

我不确定记谱法,天气我是否正确使用它们。

谢谢

3 个答案:

答案 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)

所以双引号表示法意味着两个不同的东西。要获得一致的行为,您有几种选择。

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

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

  • 将Prolog标志double_quotes更改为codeschars。请参阅this answer如何完成此操作。