SWI-Prolog как показать весь ответ (список)?

Я пытаюсь преобразовать строку в список 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 ?- 

любая помощь приветствуется!

5 ответов


?- 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, только что скомпилированный...


если вы оказываетесь с помощью 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.


просто поставить комментарий @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.

затем выполните команду, которая печатает усеченный список.

(документация 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.

вы можете решить свой вопрос с этим,

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

однако, если вы планируете всегда показывать все результаты и не быть в шорт-листе, вы можете добавить эту строку в "init".

навигация: SWI-Prolog >настройки > файл инициализации пользователя

вам будет предложено создать swipl.ini-файл, если вы никогда его не создавали.

В конце дня, вам не нужно вводить эту строку кода, когда вы снова начнете пролог в будущее.