listing example list prolog

example - Inserte una lista en otra lista dada una posición P. Prolog



prolog display list (1)

Necesito terminar un ejercicio de prólogo, tengo la mitad pero necesito algo más para terminarlo, esa es la razón por la que estoy pidiendo ayuda. Lo que necesito es un pequeño programa de prólogo, dadas dos listas ( L1 , L2 ) y una posición como P , inserte la primera lista en la segunda y almacene esa lista en una tercera lista ( L3 ). insert_at(L1,L2,P,L3)

Aquí un ejemplo:

?- insert_at ([h1,h2], [a1,a2,a3,a4], 2,L3). L3 = [a1,h1,h2,a2,a3,a4]

El código que tengo para esto es este:

remove_at(X,[X|Xs],1,Xs). remove_at(X,[Y|Xs],K,[Y|Ys]) :- K > 1, K1 is K - 1, remove_at(X,Xs,K1,Ys). insert_at(X,L,K,R) :- remove_at(X,R,K,L).

Lo que obtengo es esto:

?- insert_at([h1,h2],[a1,a2,a3,a4],2,L3). L3 = [a1, [h1, h2], a2, a3, a4] % What I get L3 = [a1, h1, h2, a2, a3, a4] % What I really want

No sé por qué obtengo los corchetes en la lista ... No los quiero, como expliqué. Para terminar, también tengo que ocuparme de más casos:

Si P es más alto que la segunda longitud de la lista, L1 se insertará al final de L2 .

Si insertamos una lista no vacía en una lista vacía (no importa P ), obtendremos la lista insertada.

Si insertamos una lista vacía en una lista no vacía (no importa P ), obtendremos la lista no vacía.

Gracias por adelantado


La solución de solución rápida:

insert_at(X, L, K, R) :- remove_at(X, R1, K, L), flatten(R1, R).

La solución que implica volver a escribir remove_at para administrar una lista:

remove_at([], Y, _, Y) :- !. % added as a list base case remove_at(_, [], _, []) :- !. % added as a list base case remove_at([X|T], [X|Xs], 1, L) :- % handle a list [X|T] instead of just X remove_at(T, Xs, 1, L). remove_at(X, [Y|Xs], K, [Y|Ys]) :- % same as before :) K > 1, K1 is K - 1, remove_at(X, Xs, K1, Ys). insert_at(X, L, K, R) :- remove_at(X, R, K, L).

El segundo caso remove_at/4 base dice que si la lista de la que quiero eliminar está vacía, el resultado está vacío y tiene éxito. Eso significa que insert_at/4 tendrá éxito si K es mayor que la longitud de L y devolverá la lista original, L , como la solución.

Si desea que insert_at/4 éxito cuando K es mayor que la longitud de la lista y crea una instancia de R con X adjunto a L (en lugar de solo L ), puede reemplazar remove_at(_, [], _, []) :- !. con remove_at(X, X, _, []) :- !.