Soy nuevo en prolog, deseo obtener una función: drop (N, X, Y) que imprime la lista Y, que es la lista X con su enésimo elemento eliminado. Si X no tiene un elemento N, entonces el predicado debería fallar. Ejemplo: 1) gota (2, [1,2,3,4,5,6], Y) debería dar Y = [1,3,4,5,6].

2) drop (8, [1,2,3,4,5,6], Y) debería fallar.

Intenté obtener una función que agregue un elemento de X a Y si no es un elemento N y omite el elemento si es un elemento Nth. Consulte el siguiente código:

drop(N,X,Y) :- integer(N),N>0,drop(X,1,N,Y).
drop([], _ , _ , [] ) .
drop( [X1|X] , P , N , [X1|Y] ) :- N=\=P , P1 is P+1 , drop(X,P1,N,Y) .
drop( [_|X] , P , N ,Y) :- N =:= P , P1 is P+1 , drop(X,P1,N,Y) .

El problema surge si N es mayor que la longitud de la lista, mi código imprimirá la lista completa, pero se supone que la función fallará en este caso. No puedo encontrar una manera de comparar N con la longitud de la lista, ya que cada función en prolog devuelve un valor binario (según mi conocimiento). ¡Cualquier ayuda será muy apreciada!

1
poojan pujara 12 oct. 2019 a las 19:43

1 respuesta

La mejor respuesta

Estás bastante cerca. Hay dos cosas que debe cambiar aquí:

  1. una vez que hayamos alcanzado el índice correcto, ya no deberíamos recurrir en drop sino que simplemente devolveremos el resto de la lista; y
  2. debe eliminar la línea drop([], _, _, []), ya que dado que soltamos un elemento, ya no recurriremos (ver punto anterior).

Tenga en cuenta que cada vez podemos disminuir el valor de N y así evitar el uso de dos variables. Como:

drop(N, X, Y) :-
    integer(N),
    drop_(N, X, Y).

drop_(1, [_|T], T).
drop_(N, [X|T], [X|T2]) :-
    N > 1,
    N1 is N-1,
    drop_(N1, T, T2).
0
Willem Van Onsem 12 oct. 2019 a las 16:52