2011-01-10 11 views
6

Hola, estoy tratando de insertar un elemento en una lista, pero es muy importante para mi programa que el resultado se almacene en la lista original y no en una nueva.
Cualquier código que haya escrito o encontrado en Internet solo tiene éxito si crea una nueva lista en la que se guarde el resultado final.
Así que mi pregunta es si alguien me puede decir cómo definir una función: insertar (X, L) donde X es un elemento y L es una lista?inserte el elemento en una lista y devuelva la misma lista actualizada

+0

Si necesita actualizar la lista en su lugar, entonces está tratando de pensar de manera imperativa. ¿Puedes describir el problema que intentas resolver con más detalle? – Juliet

Respuesta

3

No, Prolog simplemente no funciona de esa manera. No existe tal cosa como "modificar" un valor. Una variable se puede unificar con un valor específico, pero si ya era [1,3], nunca será [1,2,3] después.

2

Como dice aschepler, no puede agregar o hacer ningún cambio a una lista adecuada, es decir, una lista en la que cada elemento ya está vinculado. La única "modificación" que podemos hacer es unificar una expresión con otra.

Sin embargo, hay un concepto de una lista parcial a la que se pueden "agregar" elementos adicionales al final. Esto se conoce generalmente como una lista de diferencias, aunque esa nomenclatura puede no ser inmediatamente comprensible.

Supongamos que comenzamos, no con una lista vacía, sino con una variable libre X. Sin embargo, podríamos pensar en restar X de X y obtener "nada". Es decir, una lista de diferencias vacía se representa con X - X. El signo menos "-" es un operador puramente formal; no se pretende evaluar la diferencia. Es solo una sintaxis conveniente, como puede ver en cómo las listas de diferencias se pueden usar para lograr lo que (probablemente) quiera hacer.

Podemos añadir un elemento a una lista de diferencias de la siguiente manera:

insertDL(M,X-Y,X-Z) :- Y = [M|Z]. 

Aquí M es el nuevo elemento que queremos añadir, XY es la lista de diferencias "viejo", y XZ es el "nuevo" diferencia (a la que se ha agregado M, unificando la variable previamente libre Y con la lista parcial [M | Z], de modo que Z se convierta en la cola "abierta" de la lista parcial X).

Cuando finalmente terminemos de insertar elementos en nuestra lista de diferencias, podemos convertir X en una lista adecuada estableciendo la "cola libre" en ese punto en la lista vacía []. En este sentido, X es la "misma" variable que cuando comenzamos, unificada por pasos incrementales desde la variable libre hasta la lista adecuada.

Esta es una técnica muy poderosa en la programación de Prolog, y se necesita cierta práctica para sentirse cómodo al usarla. Algunos enlaces a mayor discusión en la Web:

[A partir de las listas de Prolog a diferencia listas]
http://www.irisa.fr/prive/ridoux/ICLP91/node8.html

[listas de diferencia La implementación en Prolog]
http://www.cl.cam.ac.uk/~jpw48/difflists.pdf

[Lecture Notes: Listas de diferencia]
http://www.cs.cmu.edu/~fp/courses/lp/lectures/11-diff.pdf

1

Algunos prólogos proporcionan el predicado setarg/3 para modificar los términos en lugar

Con el fin de utilizarlo sobre listas, sólo es necesario tener en cuenta que no son más que una buena representación de cadenas de términos compuestos con funtor '.'/2

En cualquier caso, cuando se necesita usar setarg/3 en Prolog, se probablemente significa que estás haciendo algo mal.

Cuestiones relacionadas