SWI-Prolog如何显示完整答案(列表)?

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
你可以使用下面的技巧,让你处于一个可以按“w”的情境中:通过在查询末尾添加; 0=1.来添加一个人为选择点,例如:?- your_goal ; 0=1.或更长一点的?- your_goal ; false.。当回溯时,按下“w”键来打印所有内容。 - mat
@mat 目前,使用最新的 SWI-Prolog 开发版本,执行此操作一次会导致顶层的所有后续查询显示所有变量绑定的完整术语。这是一个功能吗? - user1812457
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].

在 SO 上应该有相同的答案……我正在使用最新的 SWI-prolog 版本,刚刚编译……


有办法使用某个配置文件使它在启动时成为默认选项吗?(编辑:由@sljTech 回答) - DrBeco

4

如果你发现自己经常使用string_codes/2或者atom_codes/2,请重新考虑你的方法。你可以使用chars代替codes,从而完全避免使用SWI特有的字符串数据类型。这可以通过设置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".

通过这个设置,您可以更方便地处理文本。它也与DCGs很好地配合。


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

1
你可以用这个来解决你的问题,
?- set_prolog_flag(answer_write_options,[max_depth(0)]).
true.

然而,如果您计划始终显示所有结果并且不被列入短名单,则可以在“init”中添加此行。
导航: SWI-Prolog>设置>用户初始化文件
如果您从未创建过swipl.ini文件,则会要求您创建一个。
到最后,将来再次启动Prolog时,您将不需要键入上述代码行。

对于Linux系统,请将以下行添加到名为.swiplrc的文件中,以便在当前目录下生效::- set_prolog_flag(answer_write_options,[max_depth(0)]). - DrBeco

0

我找到了两种方法。


1.

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

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

(set_prolog_flag文档)


2.
?- atom_chars(goodbye_prolog, X) ; true.

(AllOutput documentation)

在调用结果为长列表的末尾加上; 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.

1
在我看来,这个答案与CapelliC和Boris之前的回答重复了...或者是我漏看了什么? - repeat
我认为你可能是对的。我没有注意到它们已经都在这里了。 - Joseph Hansen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接