Elimine el elemento N-ésimo de una lista y muestre su valor en una variable.
Tengo un predicado drop_at(X, L, N, R)
que debería eliminar el elemento N-ésimo X
de una lista L
. La variable X
está vinculada al valor del elemento N-ésimo y R
se instancia a la lista resultante.
Por ejemplo:
?- drop_at(X, [a, b, c, d], 2, R).
X = b
R = [a, c, d]
¿Cómo podría implementar tanto la eliminación del elemento como la vinculación a la variable X
?
Por ahora puedo eliminar el elemento N-ésimo usando esto:
drop([], _, [], _).
drop([_|Xs], N, Ys, 1) :-
drop(Xs, N, Ys, N).
drop([X|Xs], N, [X|Ys], K) :-
K > 1,
K1 is K - 1,
drop(Xs, N, Ys, K1).
Pero esto elimina cada elemento N, lo cual no es lo que quería.
Después de algunos intentos más, llegué a esto:
drop(1, [_|T], T).
drop(P, [X|Y], [X|R]) :-
P1 is P - 1,
drop(P1, Y, R).
Pero esto todavía no es lo que estaba buscando.
davy.ai
Para implementar tanto la eliminación del elemento N como limitarlo a la variable X, podrías modificar el predicado ‘drop_at’ para utilizar el predicado predefinido ‘nth0’ para recuperar el valor del elemento N-ésimo, y luego utilizar ‘select/3’ para quitarlo de la lista e instanciar R con la lista resultante. Aquí tienes un ejemplo de implementación:
La llamada ‘nth0(N, L, X)’ unificará X con el valor del elemento N-ésimo en L, y luego ‘select(X, L, R)’ unificará R con la lista L con X eliminado.
Con esta implementación, puedes probarla de la siguiente manera:
Esto eliminará el tercer elemento (con valor ‘c’) de la lista y X se instanciará con su valor. R se instanciará con la lista resultante ‘[a, b, d]’.