8

我正在尝试将字符串转换为 ascii 代码列表,如下所示:

7 ?- string_to_list("I'm a big blue banana in space!", C).
C = [73, 39, 109, 32, 97, 32, 98, 105, 103|...].

8 ?- 

如您所见,这并没有给我整个列表,但我需要它。

此解决方案不起作用:我无法按 w,因为它给了我答案并完全停止。这也没有:我可以调用该函数,它返回 true,但列表仍未完全显示。

11 ?- set_prolog_flag(toplevel_print_options,[quoted(true), portray(true), max_depth(0), spacing(next_argument)]).
true.

12 ?- string_to_list("I'm a big blue banana in space!", C).
C = [73, 39, 109, 32, 97, 32, 98, 105, 103|...].

13 ?- 

任何帮助表示赞赏!

4

5 回答 5

11
?- set_prolog_flag(answer_write_options,[max_depth(0)]).
true.

?- string_to_list("I'm a big blue banana in space!", C).
C = [73,39,109,32,97,32,98,105,103,32,98,108,117,101,32,98,97,110,97,110,97,32,105,110,32,115,112,97,99,101,33].

这里应该有相同的答案......我正在使用最后一个 SWI-prolog 版本,刚刚编译......

于 2015-10-02T15:42:20.267 回答
4

如果您发现自己正在使用string_codes/2atom_codes/2大量使用,请重新考虑您的方法。您可以完全避免使用 SWI 特定的字符串数据类型charscodes所有这一切,通过设置 Prolog 标志:

?- set_prolog_flag(double_quotes, chars).
true.

?- Chs = "Codes are unreadable!".
Chs = ['C', o, d, e, s, ' ', a, r, e|...].

这比 更具可读性[67, 111, 100, 101, 115, 32, 97, 114, 101|...],但它仍然不能解决您的问题。但是,您现在可以使用library(double_quotes).

?- use_module(double_quotes).
true.

?- Chs = "Codes are unreadable!".
Chs = "Codes are unreadable!".

?- Chs = "Codes are unreadable", Chs = [C|Chs2].
Chs = "Codes are unreadable",
C = 'C',
Chs2 = "odes are unreadable".

使用此设置,您可以更方便地处理文本。它也非常适合 DCG。

于 2016-05-07T11:59:19.457 回答
2

只是将@mat的评论放在答案中:

?- string_codes("string_to_list/2 is deprecated; use string_codes/2!", Codes)
   ;
   false.
Codes = [115, 116, 114, 105, 110, 103, 95, 116, 111|...] /* press w */ [write]
Codes = [115, 116, 114, 105, 110, 103, 95, 116, 111, 95, 108, 105, 115, 116, 47, 50, 32, 105, 115, 32, 100, 101, 112, 114, 101, 99, 97, 116, 101, 100, 59, 32, 117, 115, 101, 32, 115, 116, 114, 105, 110, 103, 95, 99, 111, 100, 101, 115, 47, 50, 33] /* press enter */.

但是,从这里开始,所有条款都将完全显示。这可能会很烦人。

您还可以做的只是使用打印谓词之一:

?- ..., writeln(Codes).

但由于某种原因,这令人不悦。如果您在答案中报告了多个绑定,这绝对很有用,但您只想查看其中一个变量的完整值:

?- numlist(1,1000,L),
   Codes = `This is a code list in SWI-Prolog V7`.
L = [1, 2, 3, 4, 5, 6, 7, 8, 9|...],
Codes = [84, 104, 105, 115, 32, 105, 115, 32, 97|...].

?- numlist(1,1000,L),
   Codes = `This is a code list in SWI-Prolog V7`,
   writeln(Codes).
[84,104,105,115,32,105,115,32,97,32,99,111,100,101,32,108,105,115,116,32,105,110,32,83,87,73,45,80,114,111,108,111,103,32,86,55]
L = [1, 2, 3, 4, 5, 6, 7, 8, 9|...],
Codes = [84, 104, 105, 115, 32, 105, 115, 32, 97|...].
于 2015-10-03T08:13:51.920 回答
1

你可以用这个来解决你的问题,

?- set_prolog_flag(answer_write_options,[max_depth(0)]).
true.

但是,如果您打算始终显示所有结果而不是入围,那么您可以在“init”中添加这一行。

导航:SWI-Prolog > 设置 > 用户初始化文件

如果您从未创建过 swipl.ini 文件,系统会要求您创建一个。

归根结底,当您以后再次启动 prolog 时,您将无需键入上述代码行。

于 2017-04-12T03:21:15.837 回答
0

我找到了两种方法。


1.

?- set_prolog_flag(answer_write_options,[max_depth(0)]).
true.

然后执行打印截断列表的命令。

set_prolog_flag 文档


2.

?- atom_chars(goodbye_prolog, X) ; true.

AllOutput 文档

放在; true.导致长列表的调用的末尾。然后按下w键盘上的键。结果是:

?- sudoku([_,_,2,3,_,_,_,_,_,_,_,_,3,4,_,_], Solution); true.
Solution = [4, 1, 2, 3, 2, 3, 4, 1, 1|...] [write]
Solution = [4, 1, 2, 3, 2, 3, 4, 1, 1, 2, 3, 4, 3, 4, 1, 2] ;
true.
于 2016-04-29T23:20:59.220 回答