Come gestire gli elenchi di prolog?
-
27-10-2019 - |
Domanda
Ho il predicato m(L,L)
E voglio che restituisca l'elenco che ci vuole. Il codice è questo:
m([],[]).
m([H|T],[H|L]) :- m(T,L).
Quando provo a usarlo con questo esempio:
m([1,2,3,4,5,6,7,8,9,10],L)
Ottengo questo come risposta:
L = [1, 2, 3, 4, 5, 6, 7, 8, 9|...].
(Ho notato che se lo provo con meno elementi è ok.) Perché sta accadendo e l'elenco è incompiuto?
Come posso evitarlo?
Scusa se è una domanda davvero stupida ma ho cercato sul web e non sono riuscito a trovare alcuna documentazione che possa aiutarmi a capire ... grazie!
Soluzione
L'elenco è finito: l'output viene solo troncato per scopi di visualizzazione. Se scrivi un predicato che stampa la tua lista, vedrai che è completo. Immagino che tu stia usando SWI Prolog, il che significa che puoi controllare questo link Per modi per modificare le impostazioni del display.
Altri suggerimenti
Sia il ciclo di query/risposta Toplevel come debugger abbreviano lunghi termini complessi. Lo fanno per evitare infinite pagine di output. In effetti, scrivono usando write_term/3 che prende un elenco di opzioni come argomento. L'elenco delle opzioni per le risposte stampate dal prolog toplevel è nel prolog-flag toplevel_print_options e quello per il debugger è in debugger_print_options. Inizialmente entrambi hanno il valore indicato di seguito:
?- current_prolog_flag(toplevel_print_options, X).
X = [quoted(true), portray(true), max_depth(10), spacing(next_argument)].
Per modificare le impostazioni predefinite: aggiungi una direttiva set_prolog_flag/2 nel file di inizializzazione personale prolog (vedi Plinizializzazione) Per modificare il valore predefinito le bandiere prologiche sopra menzionate.
Vai al settings -> user init file ... ->
E cambia max_depth (10) in questo modo:
:- set_prolog_flag(toplevel_print_options,
[quoted(true), portray(true), max_depth(100)]).
Ci sono anche altre opzioni in cui puoi utilizzare Plinizializzazione file che sono già commentati.