En 1983, David HD Warren diseñó una máquina abstracta para la ejecución de Prolog que constaba de una arquitectura de memoria y un conjunto de instrucciones . [1] [2] [3] Este diseño se conoció como Warren Abstract Machine (WAM) y se ha convertido en el objetivo estándar de facto para los compiladores de Prolog .
El propósito de compilar el código Prolog en código WAM de nivel más bajo es hacer que la interpretación posterior del programa Prolog sea más eficiente. El código Prolog es razonablemente fácil de traducir a instrucciones WAM, que se pueden interpretar de manera más eficiente. Además, las mejoras y compilaciones posteriores del código en código nativo suelen ser más fáciles de realizar en la representación de nivel más bajo.
Para escribir programas Prolog eficientes, puede resultar ventajoso tener conocimientos básicos sobre cómo funciona el WAM. Algunos de los conceptos más importantes del WAM son la indexación del primer argumento y su relación con los puntos de elección, la optimización de las llamadas de cola y la recuperación de memoria en caso de fallo.
El WAM tiene las siguientes áreas de memoria:
Aquí hay un fragmento de código de Prolog:
niña ( sally ). niña ( jane ). niño ( B ) :- \+ niña ( B ).
Un compilador Prolog basado en WAM compilará esto en instrucciones WAM similares a las siguientes:
predicado ( chica / 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 ) continuar etiqueta ( 4 ) : trust_me_else_fail etiqueta ( 5 ) : get_atom ( jane , 0 ) continuar predicado ( chico / 1 ) : obtener_variable ( x ( 1 ), 0 ) poner_estructura ( chica / 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 evocar los predicados: cualquier argumento puede ser una variable, un término fundamental o un término parcialmente instanciado. Las instrucciones "switch" manejan los diferentes casos.
{{cite book}}
: CS1 maint: URL no apta ( enlace )