Variables atribuidas: interfaces de biblioteca / implementaciones / portabilidad


Cuando estaba hojeando algunas preguntas relacionadas con prolog recientemente, me topé con esta respuesta de @mat para preguntar Cómo representar un gráfico cíclico dirigido en Prolog con acceso directo a verticicas vecinas.

Hasta ahora, mi experiencia personal con variables atribuidas en Prolog ha sido muy limitada. Pero el caso de uso dado por @ mat despertó mi interés. Así que traté de usarlo para responder a otra pregunta, ordenar listas con lógica de restricción programación.

Primero, las buenas noticias: Mi primer uso de variables atribuidas funcionó como yo quería.

Luego, la no tan buena noticia: Cuando publiqué por answer, me di cuenta de que había varias API e implementaciones para variables atribuidas en Prolog.

Siento que estoy sobre mi cabeza aquí... En particular, quiero saber lo siguiente:

  • ¿Qué API están en uso generalizado? Hasta ahora, he encontrado dos: SICStus y SWI.
  • ¿Qué características ofrecen las diferentes implementaciones de variables atribuidas? ¿Los mismos? ¿O una subsume a la otra?
  • hay diferencias en la semántica?
  • ¿Qué pasa con la implementación real? ¿Son algunos más eficientes que otros?
  • ¿Puede ser (o es) el uso de variables atribuidas un problema de portabilidad?

Muchos signos de interrogación, aquí... Por favor, comparta su experiencia / postura? Gracias de antemano!


Editar 2015-04-22

Aquí hay un fragmento de código de la respuesta mencionada anteriormente:

init_att_var(X,Z) :-
    put_attr(Z,value,X).

get_att_value(Var,Value) :-
    get_attr(Var,value,Value).

Hasta ahora yo "solo" uso put_attr/3 y get_attr/3, pero---según la documentación de SICStus Prolog sobre variables atribuidas - - - SICStus ofrece put_attr/2 y get_attr/2.

Así que incluso este caso de uso muy superficial requiere algún capa de emulación (de una manera u otra).

 43
Author: Community, 2015-04-21

4 answers

Me gustaría centrarme en un punto general importante que noté al trabajar con diferentes interfaces para variables de atributos: Al diseñar una interfaz para variables atribuidas, un implementador también debe tener en cuenta lo siguiente: {[16]]}

  • ¿Es posible tener en cuenta los atributos al razonar sobre unificaciones simultáneas, como en [X,Y] = [0,1]?

Esto es posible, por ejemplo, en SICStus Prolog, porque tales enlaces están deshechos antes de que se llame verify_attributes/3. En la interfaz proporcionada por hProlog (attr_unify_hook/2, llamada después de la unificación y con todas las vinculaciones ya en su lugar) es difícil tener en cuenta los atributos (anteriores) de Y al razonar sobre la unificación de X en attr_unify_hook/2, porque Y ya no es una variable en este punto! Esto puede ser suficiente para los solucionadores que pueden tomar decisiones basadas solo en valores de tierra, pero es una limitación grave para los solucionadores que necesitan datos adicionales, por lo general almacenado en atributos, para ver si una unificación debe tener éxito, y que luego ya no son fácilmente disponibles. Un ejemplo obvio: Unificación booleana con diagramas de decisión.

A partir de 2016, el verify-attributes branch de SWI-Prolog también soporta verify_attributes/3, gracias al gran trabajo de implementación de Douglas Miles. La rama está lista para pruebas y está destinada a ser fusionada en master tan pronto como funcione de manera correcta y eficiente. Para la compatibilidad con hProlog, la rama también soporta attr_unify_hook/2: Lo hace reescribiendo tales definiciones a la más general verify_attributes/3 en el momento de la compilación.

En cuanto al rendimiento, está claro que puede haber un inconveniente para verify_attributes/3, porque hacer que varias variables se fundamenten al mismo tiempo puede permitirle ver antes (en attr_unify_hook/2) que una unificación no puede tener éxito. Sin embargo, con mucho gusto y en cualquier momento cambiar esta ventaja típicamente insignificante para la fiabilidad mejorada, facilidad de uso y mayor funcionalidad que el interfaz más general le da, y que es en cualquier caso ya el comportamiento estándar en SICStus Prolog que es además de su generalidad también uno de los sistemas Prolog más rápidos alrededor.

SICStus Prolog también cuenta con un predicado importante llamado project_attributes/2: Es utilizado por el nivel superior para proyectar restricciones a las variables de consulta. SWI-Prolog también soporta esto en versiones recientes.

También hay una gran ventaja de la interfaz SWI: Los objetivos residuales que attribute_goals//1 y por lo tanto copy_term/3give you are always a list. Esto ayuda a los usuarios a evitar defectos en su código, y fomenta una interfaz más declarativa, porque una lista de objetivos de restricción pura no puede contener estructuras de control.

Curiosamente, ninguna interfaz le permite interpretar unificaciones que no sean sintácticamente. Personalmente, creo que hay casos en los que es posible que desee interpretar unificaciones de manera diferente que sintácticamente, sin embargo, también puede ser bueno argumentos en contra de eso.

Los otros predicados de interfaz para variables atribuidas son en su mayoría fácilmente intercambiables con predicados de envoltura simples para diferentes sistemas.

 11
Author: mat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-27 09:36:34

Jekejeke Minlog tiene variables de atributo sin estado o thin. Bueno, no exactamente, una variable de atributo puede tener cero, uno o muchos ganchos, que se les permite ser cierres, y por lo tanto puede llevar un pequeño estado.

Pero normalmente una implementación administra el estado elsewere. Para esto propósito Jekejeke Minlog permite crear tipos de referencia a partir de variables, para que puedan ser utilizados como índices en tablas.

Se libera todo el potencial si esto se combina con el final y/o encadenamiento hacia adelante. Como ejemplo hemos implementado CLP (FD). También hay un pequeño tutorial del solucionador.

Los ingredientes primitivos en nuestro caso son:

1) Variables de atributo sin Estado
2) Teclas finales y variables
3) Cola de continuación

Los hooks de variables de atributo pueden tener efectos de enlace hasta extender la cola de continuación, pero solo se ejecutan una vez. Los objetivos de la cola de continuación pueden ser no deterministas.

Hay algunas capas adicionales antes de realizar aplicaciones, que son en su mayoría agregaciones de las primitivas para hacer cambios temporalmente.

Las principales aplicaciones son de código abierto aquí y aquí:

A) Solucionador de Restricciones de Dominio Finito
b) Restricciones de Herbrand
c) Suspensión de goles

Adiós

 7
Author: j4n bur53,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-05 19:30:48

Puede encontrar una de las implementaciones más antiguas y elaboradas de variables atribuidas en ECLiPSe, donde forma parte de la infraestructura más amplia para implementar solucionadores de restricciones.

Las principales características de este diseño son:

  • los atributos deben ser declarados, y a cambio el compilador soporta el acceso eficiente
  • una sintaxis para las variables atribuidas, para que puedan ser leídas y escritas
  • un conjunto más completo de controladores para atributo operaciones, de modo que los atributos no solo se tengan en cuenta para la unificación, sino también para otras operaciones genéricas como la copia de términos y las pruebas de subsunción
  • una clara separación entre los conceptos de atributo variable y objetivos suspendidos
  • utilizado en más de una docena de bibliotecas de ECLiPSe

Este documento (sección 4) y la documentación de ECLiPSe tienen más detalles.

 6
Author: jschimpf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-27 15:37:03

Una perspectiva adicional sobre las bibliotecas de variables atribuidas es cuántos atributos se pueden definir por módulo. En el caso de SWI-Prolog/YAP y citando documentación SWI:

Cada atributo está asociado a un módulo, y el hook (attr_unify_hook/2) se ejecuta en este módulo.

Esta es una limitación severa para los implementadores de bibliotecas como CLP (FD), ya que obliga a usar módulos adicionales con el único propósito de tener múltiples atributos en lugar de poder defina tantos atributos como sea necesario en el módulo implementando su biblioteca. Esta limitación no existe en la interfaz SICStus Prolog, que proporciona una directiva attribute/1 que permite la declaración de un número arbitrario de atributos por módulo.

 5
Author: Paulo Moura,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-26 10:15:40