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!

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top