2015-08-11 12 views
5

È possibile visualizzare un elenco Prolog nel suo formato ./2, ad es.Visualizzare un elenco nel suo formato 'raw' ./2

per la lista:

| ?- L=[a,b,c]. 
L = [a,b,c] ? 
yes 

C'è un mezzo per visualizzare:

L = .(a, .(b, .(c, []))). 
+3

Controlla 'write_canonical/1' in qualsiasi sistema conforme ISO! 'write_canonical/1' è molto utile ogni volta che sei in dubbio sulla forma esatta dei termini su cui stai ragionando. Esempio con SICStus Prolog: '? - write_canonical ([a, b, c]).', Yieding: ''.' (A, '.' (B, '.' (C, [])))'. Un predicato molto valido anche per lo scambio di dati, inteso a fornire una rappresentazione veramente canonica che è facile da analizzare. – mat

+2

L = [a, b, c], write_canonical (L). ha funzionato a meraviglia! Al momento sto usando sicstus, a volte a casa. Mi chiedo se ci sono altri mezzi per raggiungere lo stesso fine? – bph

+3

'write_canonical/1' è il modo standard e migliore per farlo. Naturalmente puoi anche implementarlo tu stesso, usando l'ispezione a termine e la decomposizione con 'arg/3',' = ../2' ecc. – mat

risposta

4

Normalmente, write_canonical(List) o ?- write_term(List, [quoted(true), ignore_ops(true)]), come sottolineato nei commenti. Dal momento che SWI-Prolog ha deciso di do things differently, questo non è abbastanza buono:

?- write_canonical([a]). 
[a] 
true. 

?- write_term([a], [quoted(true), ignore_ops(true)]). 
[a] 
true. 

?- write_term([a], [dotlists(true)]). 
.(a,[]) 
true. 

Vedere il documentation on write_term/2, prestare attenzione alle opzioni brace_terms(Bool) e dotlists(Bool). Ma attenzione: se avvii SWI-Prolog 7 normalmente, il ./2 non è più il functor della lista!

?- L = .(a, []). 
ERROR: Type error: `dict' expected, found `a' (an atom) % WHAT? 

?- L = '[|]'(a, []). 
L = [a]. 

Se si inizia con swipl --traditional, le cose sono tornate alla normalità, una sorta di:

$ swipl --traditional 
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.3.4-32-g9311e51) 
Copyright (c) 1990-2015 University of Amsterdam, VU Amsterdam 
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software, 
and you are welcome to redistribute it under certain conditions. 
Please visit http://www.swi-prolog.org for details. 

For help, use ?- help(Topic). or ?- apropos(Word). 

?- L = .(a, []). 
L = [a]. 

ancora non è possibile utilizzare write_canonical(List) o write_term(List, [quoted(true), ignore_ops(true)]).

Leggere la sezione collegata della documentazione SWI-Prolog per i dettagli e le motivazioni. Come consiglio, se si decide di utilizzare SWI-Prolog stick su SWI-Prolog 7 con i valori predefiniti e utilizzare solo write_term(List, [dotlists(true)]) se è necessario comunicare con un'altra implementazione Prolog. La solita notazione elenco, [a, b, ...] dovrebbe essere sufficiente nella maggior parte delle situazioni convenzionali.

Problemi correlati