2015-10-02 14 views
7

Sto cercando di convertire una stringa in un elenco di codici ASCII in questo modo:SWI-Prolog come mostrare l'intera risposta (lista)?

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

8 ?- 

Questo non mi dà l'intero elenco come si può vedere, ma ne ho bisogno.

This solution does not work: Non riesco a premere w poiché mi dà la risposta e fa un punto. Neither does this: Posso chiamare la funzione, e restituisce true, ma l'elenco non è ancora completamente visualizzato.

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

Qualsiasi aiuto apprezzato!

+3

Puoi usare il seguente trucco che ti mette in una situazione in cui puoi premere "w": aggiungi un punto di scelta artificiale aggiungendo "; 0 = 1.' alla query, ad esempio: '? - your_goal; 0 = 1.' o un po 'più lungo: '? - your_goal; false.'. Durante il backtrack, premi "w" per stampare tutto. – mat

+0

@mat in questo momento, con l'ultima versione di sviluppo SWI-Prolog, facendo ciò una volta tutte le query successive sul livello principale mostreranno i termini completi di tutte le associazioni di variabili. È una caratteristica? –

risposta

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

ci dovrebbe essere da qualche parte qui su SO la stessa risposta ... Sto usando l'ultima release SWI-Prolog, appena compilato ...

+0

Questo ha funzionato a meraviglia, grazie. – Mossmyr

2

solo per mettere il comment by @mat in una risposta:

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

Tuttavia, da qui in tutti termini saranno mostrati completamente. Questo potrebbe essere fastidioso.

Che cosa si può anche fare è semplicemente di utilizzare uno dei predicati di stampa:

?- ..., writeln(Codes). 

ma questo è malvista per qualche motivo. E 'sicuramente utile se si dispone di diversi attacchi riportati in una risposta, ma si desidera solo guardare il pieno valore di una delle variabili:

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

ho trovato due modi.


1.

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

Poi fare il vostro comando che si stampa un elenco troncato.

(set_prolog_flag documentation)


2.

?- atom_chars(goodbye_prolog, X) ; true. 

(AllOutput documentation)

Mettere ; true. al termine della chiamata che si traduce in una lunga lista. Quindi premere il tasto w sulla tastiera. Il risultato è:

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

IMO questa risposta ripete quelle più vecchie di CapelliC e Boris ... o mi sono perso qualcosa? – repeat

+0

Penso che potresti avere ragione. Non ho notato che erano già entrambi qui. –

3

Se vi state trovando con string_codes/2 o atom_codes/2 molto, riconsiderare il vostro approccio. È possibile utilizzare chars al posto di codes ed evitare del tutto il tipo di dati stringa SWI specifico. Tutto questo, impostando un flag Prolog:

?- set_prolog_flag(double_quotes, chars). 
true. 

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

Questo è più leggibile rispetto [67, 111, 100, 101, 115, 32, 97, 114, 101|...], ma ancora non risolve il problema.Tuttavia, ora è possibile visualizzare tali risposte in modo compatto utilizzando 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". 

Con questa impostazione è possibile elaborare il testo molto più comodamente. Si adatta anche ai DCG.

0

È possibile risolvere la tua domanda con questo,

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

Tuttavia, se si prevede di sempre mostrare tutti i risultati e di non essere nella rosa dei candidati, allora si può aggiungere questa riga nella "init".

Navigazione: SWI-Prolog> Impostazioni> User init file

vi verrà chiesto di creare un file swipl.ini se non avete mai creato uno.

Alla fine della giornata, non è necessario digitare la riga di codice sopra quando si avvia nuovamente il prolog in futuro.

Problemi correlati