Appunti digitali

Il blog di Pasquale Fraccalvieri

Prolog e sostituzione di un elemento in un vettore

, , , , ,

In questo periodo sono molto impegnato con l'università, ed in particolare con un programma in Prolog. L'altro giorno ho perso un po' di tempo perché non riuscivo a trovare un predicato o funzione che mi sostituisse l'i-esimo elemento di un vettore con un nuovo elemento. Attualmente sto usando SWI Prolog, e fra le sue librerie c'era tutto fuorché questo tipo di predicato. Per giunta quasi tutti i predicati offerti da SWI Prolog non operano sulla posizione dell'elemento in un vettore, bensì sull'elemento stesso (eccetto nth). Ad es. delete/3 cancella tutte le occorrenze dell'elemento X in un vettore, fregandosene però della posizione (non posso cancellare ad es. "il terzo elemento"). E così per quasi tutti i predicati che manipolano vettori.
Quindi siccome mi serviva rimpiazzare un elemento di un vettore in base alla sua posizione, ho cercato su internet per trovare qualcosa ... ma niente. Non ho trovato nulla. Così mi sono costruito da solo il predicato che mi serviva: l'avessi fatto prima avrei risparmiato parecchio tempo bigsmile! Così eccoci qua, pubblico il codice del predicato replaceEntry/4, magari può servire a qualcuno:
replaceEntry(_,_,[],[]).
replaceEntry(1,Value,[_|OldList], [Value|NewList]) :-
	replaceEntry(0, Value, OldList, NewList),
	!.
replaceEntry(Position,Value,[X|OldList],[X|NewList]) :-
	Position =\= 1,
	NewPosition is Position - 1,
	replaceEntry(NewPosition, Value, OldList,NewList),
	!.

Quindi se volete rimpiazzare un elemento che si trova in una certa posizione di un vettore, potete scrivere:
replaceEntry(2,rimpiazzo,[elemento1,elemento2,elemento3],Nuovo_vettore_con_elemento_rimpiazzato).

Il valore di Nuovo_vettore_con_elemento_rimpiazzato sarà [elemento1,rimpiazzo,elemento3].
Quindi riassumendo: a Position dovete assegnare la posizione dell'elemento che volete sostituire (parte da 1), a Value dovete assegnare il valore da sostituire, a [X|OldList] dovete assegnare il vettore originale di cui volete sostituire un elemento, e a [X|NewList] dovete assegnare una variabile in cui verrà memorizzato il risultato (ovvero il nuovo vettore con l'elemento sostituito).

GMail come servizio di posta predefinito in OperaHashCheck

Write a comment

New comments have been disabled for this post.