2015-10-02 6 views
7

Я пытаюсь преобразовать строку в список ASCII-кодов, как так:SWI-Prolog как показать весь ответ (список)?

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

8 ?- 

Это не дает мне весь список, как вы можете видеть, но мне это нужно.

This solution does not work: Я не могу нажать w, так как он дает мне ответ и делает полную остановку. Neither does this: Я могу вызвать функцию в порядке, и она возвращает 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 ?- 

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

+3

Вы можете использовать следующий трюк, который помещает вас в ситуацию, когда вы можете нажать «w»: добавить точку искусственного выбора, добавив '; 0 = 1.' к вашему запросу, например: '? - your_goal; 0 = 1.' или бит дольше: '? - your_goal; false.'. При отступлении нажмите «w», чтобы распечатать все. – mat

+0

@mat прямо сейчас, с последним выпуском разработки SWI-Prolog, делая это один раз, все последующие запросы на верхнем уровне отображают полные условия всех привязок переменных. Это особенность? –

ответ

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

+0

Это сработало чудеса, спасибо. – Mossmyr

2

Просто поставить comment by @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|...]. 
0

Я нашел два способа.


1.

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

Затем сделайте вашу команду, печать усеченный список.

(set_prolog_flag documentation)


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. 
+0

ИМО этот ответ повторяет старые Капелли и Борис ... или я что-то пропустил? – repeat

+0

Я думаю, вы, возможно, были правы. Я не заметил, что они оба уже здесь. –

3

Если вы оказываетесь с помощью string_codes/2 или atom_codes/2 много, пересмотреть свой подход. Вы можете использовать chars вместо codes и вообще избегать типичного типа данных SWI. Все это, установив флаг Пролог:

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

0

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

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

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

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

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

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