2014-12-20 58 views
1

我是prolog的初学者,我正在尝试做某些事情。 我试图将字符数组转换为字符串。比我会转换这个字符串列表将字符列表转换为序言中的字符串

这就是我想要的东西:

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

我不知道有关的符号,天气我正确或不使用它们。

谢谢

回答

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". 

,如果你想学,就应该阅读所使用的谓词的文档多一点。

+0

非常感谢您的详细解答。 – seleucia

+0

如果你只需要一个字符串就可以了? – JakeTheSnake

+0

@JakeTheSnake'string_chars(Str,[Char])',例如'string_chars(“x”,[x])' –

1

来表达你的榜样的正确方法应该是:

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

(我不太清楚你的最后一行的意思)

+0

嗨斯科特, 基本上,我想这样做。 我有一个字符数组,像[97,97],我想在SWI Prolog中将它转换为字符串 – seleucia

+1

@seleucia,参见'string_to_list/2'谓词。 – lurker

+0

@lurker你可以给我发送用法吗,我是prolog的初学者,我不知道如何正确使用它。 我看到,它只用于将字符串转换为列表。 – seleucia

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序言。

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

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