Sei sulla pagina 1di 2

Metaprogramación y orden superior

Las capacidades de orden superior del lenguaje. Se trata de un conjunto de funcionalidades generalmente
desconocidas (no sólo en Prolog, sino también en otros lenguajes) pero que dotan de una enorme
expresividad y potencia a los programas.

Orden Superior
El concepto de orden superior es tan difícil de entender como de explicar. Podríamos definirlo como la
capacidad de un lenguaje para manejar su propio código como una estructura de datos más. El orden
superior existe en muchos lenguajes pero, debido a que se implementa de formas distintas, no se suele
usar esta denominación. Algunos ejemplos:
• En el lenguaje C: los punteros a funciones. Estos permiten pasar funciones como argumentos.
• En Java y otros lenguajes OO: las referencias a instancias. Permiten ejecutar código distinto
dependiendo de la referencia utilizada.
Un aspecto particular del orden superior es la capacidad de pasar un procedimiento o función como
argumento a otro procedimiento o función. Esta es la característica más utilizada.

Metaprogramación
La metaprogramación es una implementación posible del orden superior tremendamente versátil. Consiste
en la posibilidad de que el código se modifique a sí mismo. Para entender la diferencia entre
metaprogramación y orden superior pondremos un ejemplo:
• Escribimos una función, y la pasamos como argumento a otra función. Ésta última la ejecuta sin
saber exactamente qué está ejecutando. Esto es una característica de orden superior.
• Tomamos una cadena de texto donde almacenamos el nombre de una función, por
ejemplo, tabla_logaritmo. Por otra parte construimos una lista con dos elementos, los
números 3 y 5, por ejemplo. Ahora juntamos la lista con la cadena de texto y generamos una
llamada válida a la función tabla_logaritmo(3,5). La llamada se ejecuta. Esto es
metaprogramación.

asserta/1 Inserta una nueva cláusula como si se hubiera escrito al principio del programa.
assertz/1 Inserta una nueva cláusula como si se hubiera escrito al final del programa.
Como
ejemplo veamos como insertar cláusulas. Antes recordemos las cláusulas que ya existen, en orden:
prueba(abc).
prueba(123).

Ahora añadimos una cláusula ejecutando asserta(prueba(666)). El programa queda como sigue:
prueba(666).
prueba(abc).
prueba(123).

De nuevo añadimos una cláusula ejecutando J=999,assertz(prueba(J)). El programa queda como


sigue:
prueba(666).
prueba(abc).
prueba(123).
prueba(999).

Y para finalizar generamos una cláusula algo mas compleja mediante assertz( (prueba(X) :-
X>1024) ) ...
prueba(666).
prueba(abc).
prueba(123).
prueba(999).
prueba(H) :- H > 1024.

Elimina únicamente la primera cláusula que unifique con el argumento. Siempre se elimina
retract/1
por el principio del programa.
rectractall/1 Elimina todas las cláusulas que unifiquen con el argumento.

Potrebbero piacerti anche