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 Prolog .
El propósito de compilar el código Prolog en el 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 pueden interpretarse de manera más eficiente. Además, las mejoras de código posteriores y las compilaciones de 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 un conocimiento básico de cómo funciona WAM. Algunos de los conceptos de WAM más importantes son la indexación del primer argumento y su relación con los puntos de elección, la optimización de llamadas finales y la recuperación de memoria en caso de error.
El WAM tiene las siguientes áreas de memoria:
Aquí hay un fragmento de código Prolog:
niña ( sally ). niña ( jane ). chico ( B ) :- \+ chica ( B ).
Un compilador Prolog basado en WAM compilará esto en instrucciones WAM similares a las siguientes:
predicado ( chica / 1 ) : switch_on_term ( 2 , 1 , falla , falla , falla ), etiqueta ( 1 ) : switch_on_atom ([( salida , 3 ), ( jane , 5 )]) etiqueta ( 2 ) : try_me_else ( 4 ) etiqueta ( 3 ) : get_atom ( sally , 0 ) continuar etiqueta ( 4 ) : confiar en mí_else_fail etiqueta ( 5 ) : get_atom ( jane , 0 ) continuar predicado ( chico / 1 ) : get_variable ( x ( 1 ), 0 ) put_structure ( chica / 1 , 0 ) unify_local_value ( x ( 1 )) ejecutar (( \+ ) / 1 )])
Una característica importante de este código es su capacidad para hacer frente a los diversos 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 de "cambio" manejan los diferentes casos.
{{cite book}}
: Mantenimiento CS1: URL no apta ( enlace )