Problema con gli accumulatori in prolog
-
27-09-2019 - |
Domanda
Mentre imparo Prolog, sto cercando di risolvere il seguente problema, utilizzando gli accumulatori:
Scrivere un predicato addone2/ il cui primo argomento è una lista di interi e il cui secondo argomento è la lista di interi ottenuta aggiungendo 1 a ciascun intero della prima lista.Ad esempio, la query
addone([1,2,7,2],X).
dovrebbe dare
X = [2,3,8,3].
Ho creato il seguente codice:
addone([], _).
addone([E|Tail], [R|Rs]) :-
NewE is E+1,
append([R|Rs], [NewE], NewRs),
addone(Tail, NewRs).
Ma non funziona.Qualcuno può dirmi perché?Quindi, come posso utilizzare gli accumulatori in Prolog?
Grazie!
Soluzione
anthares ha ragione nel senso che devi perfezionare il tuo caso base.Tuttavia, stai anche realizzando le cose in modo molto inefficiente con il tuo append
chiamate.In Prolog ci vuole un po' di tempo per abituarsi al potere dell'unificazione, ma in questo caso, ad esempio, ti aiuta a impostare immediatamente l'elenco dei risultati.Prova quanto segue:
addone([E|Tail], [E1|Rs]) :-
E1 is E+1,
addone(Tail, Rs).
Questo è davvero tutto quello che c'è da fare.Posizionando immediatamente E1
nel modello del tuo secondo argomento, hai già creato il primo elemento dell'elenco dei risultati.Gli elementi rimanenti Rs
verrà creato durante la ricorsione.Uno schema Prolog molto tipico.
Altri suggerimenti
La parte inferiore della tua ricorsione dovrebbe essere addone([],[]).
affinché NewRs possa essere collegato con il []