es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  

Answer

  1. Avatar for 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:

        drop_at(X, L, N, R) :-
            nth0(N, L, X),
            select(X, L, R).
    

    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:

        ?- drop_at(X, [a, b, c, d], 2, R).
        X = c,
        R = [a, b, d].
    

    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]’.

Comments are closed.