En 1983, David HD Warren diseñó una máquina abstracta para la ejecución de Prolog que consta de una arquitectura de memoria y un conjunto de instrucciones . [ 1 ] [ 2 ] [ 3 ] Este diseño se conoció como la Máquina Abstracta de Warren ( WAM ) y se ha convertido en el objetivo estándar de facto para los compiladores de Prolog .
Objetivo
El objetivo de compilar el código Prolog al código WAM de bajo nivel es optimizar la interpretación posterior del programa Prolog. El código Prolog se traduce con relativa facilidad a instrucciones WAM, que se interpretan de forma más eficiente. Además, las mejoras y compilaciones posteriores al código nativo suelen ser más sencillas en la representación de bajo nivel.
Para escribir programas Prolog eficientes, resulta ventajoso comprender el funcionamiento de la WAM (Write-Assembly-Modification). Algunos de los conceptos más importantes de la WAM son la indexación del primer argumento y su relación con los puntos de decisión, la optimización de llamadas recursivas y la recuperación de memoria en caso de fallo.
Áreas de memoria
El WAM tiene las siguientes áreas de memoria:
- La pila global o montón , utilizada para almacenar términos compuestos.
- La pila local para marcos de entorno y puntos de decisión
- El rastro para registrar qué enlaces de variables deben deshacerse al retroceder
Ejemplo
Aquí hay un fragmento de código Prolog:
chica ( sally ). chica ( jane ).niño ( B ) :- \+ niña ( B ).Un compilador de Prolog basado en WAM compilará esto en instrucciones WAM similares a las siguientes:
predicado ( niña / 1 ) : switch_on_term ( 2 , 1 , fail , fail , fail ), etiqueta ( 1 ) : switch_on_atom ([( sally , 3 ),( jane , 5 )]) etiqueta ( 2 ) : try_me_else ( 4 ) etiqueta ( 3 ) : get_atom ( sally , 0 ) proceder etiqueta ( 4 ) : trust_me_else_fail etiqueta ( 5 ) : get_atom ( jane , 0 ) procederpredicado ( niño / 1 ) : obtener_variable ( x ( 1 ), 0 ) poner_estructura ( niña / 1 , 0 ) unificar_valor_local ( x ( 1 )) ejecutar (( \+ ) / 1 )])Una característica importante de este código es su capacidad para manejar los distintos modos en que se pueden invocar los predicados: cualquier argumento puede ser una variable, un término base o un término parcialmente instanciado. Las instrucciones "switch" gestionan los diferentes casos.
Referencias
- ↑ David HD Warren (octubre de 1983). Un conjunto de instrucciones abstractas para Prolog (PDF) . Menlo Park, CA, EE. UU.: Centro de Inteligencia Artificial de SRI International . Archivado (PDF) del original el 19 de junio de 2022.
- ↑ Hassan Aït-Kaci (18 de febrero de 1999). La máquina abstracta de Warren: una reconstrucción tutorial (PDF) . Archivado del original el 13 de febrero de 2003.
- ↑ Hassan Aït-Kaci. "La máquina abstracta de Warren: una reconstrucción tutorial; el libro, erratas y diapositivas" . Archivado del original el 19 de enero de 2022. Consultado el 7 de marzo de 2011 .
- Programación lógica
- Máquinas abstractas
- Máquinas virtuales
- Software de SRI International