/** nth1( ?N, +List, ?With, ?Nth, +NewList ).
Find and replace the N-th element of a List.
The list with the element replaced is in NewList.
Nth is the old value and With is the new one.
==
?- nth1( 3, [a,b,c,d], 3, What, New ).
What = c,
New = [a, b, 3, d].
==
@author Nicos Angelopoulos
@version 0.2 2011/?/?, 2005/02/23.
@version 0.3 2017/3/13 renamed from nth_replace/5
*/
nth1( I, List, With, Nth, NewList ) :-
number(I),
!,
nth1_n( I, List, With, Nth, NewList ).
nth1( I, List, With, Nth, NewList ) :-
var( I ),
nth1_gen( List, With, Nth, 1, I, NewList ).
nth1_gen( [H|T], With, H, I, N, NewList ) :-
N is I,
NewList = [With|T].
nth1_gen( [H|T], With, Nth, I, N, [H|R] ) :-
NxI is I + 1,
nth1_gen( T, With, Nth, NxI, N, R ).
nth1_n( 1, List, With, Nth, NewList ) :-
!,
List = [Nth|T],
NewList = [With|T].
nth1_n( N, [H|T], With, Nth, [H|NewT] ) :-
NxN is N - 1,
nth1_n( NxN, T, With, Nth, NewT ).