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.

Eliminación de elementos consecutivos de una lista en Prolog

Hasta ahora he intentado tener tres funciones separadas, una de las cuales es la primera función llamada, las otras dos deciden si agregar o no el elemento pasado a nuestra lista de resultados si no coincide con la cabeza de la lista. La recursión me confunde como a muchos otros, así que en algún lugar aquí tengo un bucle infinito que causa que la pila se desborde. Pero no estoy seguro de muchos conceptos (o sintaxis) de Prolog, así que estoy confundido de dónde estoy haciendo algo mal aquí. ¡Gracias por la ayuda!

append([], X, X).
append([X | Y], Z, [X | W]) :- append(Y, Z, W). 

remove([], []).
remove([H|T], X) :-
    append(X, [H], X1),
    remove(T, H, X1),
    !.
remove([Y|T], Y, X):-
    remove(T, Y, X),
    !.
remove([H|T], Y, X):-
    append(X,[H], X1),
    remove(T,Y,X1),
    !.
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que estás intentando implementar una función para eliminar elementos duplicados de una lista. El código que has proporcionado no es correcto, ya que causará un bucle infinito debido a la llamada recursiva a remove/3 en la última cláusula.

    Una implementación correcta del predicado remove/2 se vería algo así:


    remove([], []).
    remove([H|T], X) :-
    remove(T, H, X),
    !.
    remove([Y|T], Y, X):-
    remove(T, Y, X),
    !.
    remove([H|T], Y, [H|X]):-
    remove(T,Y,X),
    !.

    Ten en cuenta que la última cláusula no llama a remove/3 de forma recursiva, sino que agrega el elemento H a la lista de resultados X.

Comments are closed.