1 clp programación lógica con restricciones introducción

82
1 CLP Programación Lógica con Restricciones Introducción

Upload: raimundo-gerena

Post on 28-Jan-2016

220 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: 1 CLP Programación Lógica con Restricciones Introducción

1

CLPProgramación Lógica con Restricciones

Introducción

Page 2: 1 CLP Programación Lógica con Restricciones Introducción

2

Limitaciones de la programación lógica Propiedad esencial de la programación

lógica:LÓGICA + CONTROL = QUÉ + CÓMO

- QUÉ: Lógica de primer orden

- CÓMO: Resolución + Búsqueda en profundidad de izquierda a derecha

Page 3: 1 CLP Programación Lógica con Restricciones Introducción

3

Limitaciones de la programación lógica Los objetos son estructuras sin interpretación

semántica.

La igualdad entre objetos es la identidad sintáctica.

Control basado en una regla simple y uniforme.

Page 4: 1 CLP Programación Lógica con Restricciones Introducción

4

Propuesta de la programación lógica con restricciones Utilización explícita de las propiedades

semánticas de los objetos.

La igualdad entre objetos se transforma de sintáctica en semántica.

Se incorporan técnicas de consistencia para superar las limitaciones de control.

Page 5: 1 CLP Programación Lógica con Restricciones Introducción

5

Propuesta de la programación lógica con restricciones Sustitución de unificación (sintáctico) por

satisfacibilidad (semántico). El esquema CLP(X) sustituye cada X por R, Z,

Q, etc. Aplicación de técnicas de consistencia. El árbol de búsqueda se poda integrando la

evaluación de restricciones y la búsqueda indeterminista.

Page 6: 1 CLP Programación Lógica con Restricciones Introducción

6

Ejemplo

Trabajamos en N con el programa

suma(X,Y,Z):- X+Y =:= Z

Su comportamiento debería ser: ?- suma(2,3,5) ?- suma(2,3,Z) ?- suma(X,3,5) ?- suma(X,Y,5)

Page 7: 1 CLP Programación Lógica con Restricciones Introducción

7

Ejemplo

Varias cláusulas preguntando si las variables están o no instanciadas

Usar la primitiva is

Método generar y comprobar

Page 8: 1 CLP Programación Lógica con Restricciones Introducción

8

Ejemplo

Hechos: v(3). v(2). v(1).

Reglas: mayor(X,Y) :- X>Y. Triple(X,Y,Z) :- v(X), v(Y), v(Z), mayor(X,Y), mayor(Y,Z).

Objetivo: ?- triple(A,B,C)

Page 9: 1 CLP Programación Lógica con Restricciones Introducción

9

Ejemplo

?-triple(A, B, C) | A := X, B := Y, C := Z ?- v(X), v(Y), v(Z), mayor(X, Y), mayor(Y, Z). | A := 3, B := Y, C := Z ?-v(Y), v(Z), mayor(3, Y), mayor(Y, Z). | A := 3, B := 2, C := Z ?- v(Z), mayor(3, 2), mayor(2, Z). | A := 3, B := 2, C := 1 ?- mayor(3, 2), mayor(2, 1). | A := 3, B := 2, C := 1 ?- mayor(2, 1). | A := 3, B := 2, C := 1 ?- EXITO

Page 10: 1 CLP Programación Lógica con Restricciones Introducción

10

Ejemplo

PROLOG puede verse como un lenguaje de programación lógica con restricciones.

Tripleinv(X,Y,Z):- mayor(X,Y), mayor(Y,Z), v(X), v(Y), v(Z).

Expresa lo mismo que triple Inverna las variables hasta conseguir

valores buenos con los que avanzar.

Page 11: 1 CLP Programación Lógica con Restricciones Introducción

11

Estructuras y programas con restricciones

¿Qué necesitamos conocer?

Restricciones: Predicados especiales cuyos argumentos son términos sobre el dominio

Los predicados usuales Un programa de Horn Objetivos con restricciones

Page 12: 1 CLP Programación Lógica con Restricciones Introducción

12

Estructuras y programas con restricciones

Resolutores de restricciones

Definición explícita de sistema de restricciones en forma resuelta, que tiene que ser satisfacible en la teoría.

Un algoritmo resolutor de restricciones

Page 13: 1 CLP Programación Lógica con Restricciones Introducción

13

Estructuras y programas con restricciones

Características deseables para un resolutor

Debe ser incremental

Debe ser eficiente

Debe ser correcto

Debe ser completo

Page 14: 1 CLP Programación Lógica con Restricciones Introducción

14

Ventajas de la Programación Lógica con Restricciones

Mayor expresividad en el tratamiento de problemas

Diseño mas uniforme y mayor efectividad

Aumento de la eficiencia

Page 15: 1 CLP Programación Lógica con Restricciones Introducción

15

Inconvenientes de la Programación Lógica con Restricciones Encontrar técnicas específicas para el

tratamiento de los objetos Estudiar las heurísticas y usar la más adecuada Los resolutores completos son ineficientes Necesario añadir restricciones redundantes para

ayudar a los resolutores incompletos

Page 16: 1 CLP Programación Lógica con Restricciones Introducción

16

Algunas instancias interesantes del esquema CLP

Descripción y comparativas

Page 17: 1 CLP Programación Lógica con Restricciones Introducción

17

Clasificación Distinguiremos los lenguajes haciendo uso de dos categorías

principales: Lenguajes de caja negra o de caja transparente.

Por lenguaje de caja transparente entendemos, aquellos lenguajes que proporcionan restricciones muy simples y primitivas, cuyo esquema de propagación puede ser formalmente especificado. Estas restricciones pueden ser usadas para construir restricciones de alto nivel especializadas, adecuadas para cada aplicación.

Los lenguajes de caja negra, sin embargo, son aquellos que proporcionan un amplio rango de restricciones de alto nivel cuya implementación queda oculta al usuario. Estas restricciones llevan a cabo tareas específicas de forma muy eficiente. En estos lenguajes, es difícil para un usuario añadir nuevas restricciones, ya que tienen que ser definidas a bajo nivel, requiriendo un detallado conocimiento de la implementación.

Page 18: 1 CLP Programación Lógica con Restricciones Introducción

18

Lenguajes de caja transparente

Lenguajes con índices:

Un índice es una regla reactiva funcional de la forma X en R donde X es una variable de dominio. R es una expresión de rango de la forma f1...f2 cuyos términos f1 y f2 son rangos singulares, parámetros, enteros, combinación de términos usando operadores aritméticos en rangos por índices. Las formas permitidas para un rango por índices depende del lenguaje pero, normalmente, es una de las siguientes:

Min(Y): representa el mínimo valor de la variable de dominio Y. Max(Y): representa el máximo valor de la variable de dominio Y. Val(Y): representa en valor de Y tan pronto como es

establecido. Dom(Y): representa el dominio actual de Y.

Page 19: 1 CLP Programación Lógica con Restricciones Introducción

19

Lenguajes de caja transparente(Lenguajes con índices) SICStus:

Permite dos modos: el primero, "iso mode" cumple estrictamente la norma ISO/IEC 13211-1 (1995) que estandariza el lenguaje Prolog a nivel internacional. En el segundo modo de trabajo, "sicstus mode", se añaden extensiones que dotan a este intérprete de mayor potencia.

Tiene un entorno de desarrollo con facilidades para hacer interfaces gráficas.

clp(FD): Básicamentre trata solo con restricciones del tipo X en R (R no solo

tiene que ser de tipo {1..10} sino que puede ser indexado. Pueden crearse restricciones de alto nivel (restricciones de usuario).

Cada restricción especifica como una variable restringida es actualizada cuando el dominio de otra variable cambia.

IF/Prolog: Otro sistema que cumple la ISO para Prolog y que tiene interfaces con

Java, C/C++, y bases de datos relacionales.

Page 20: 1 CLP Programación Lógica con Restricciones Introducción

20

Lenguajes de caja transparente Lenguajes con reglas de manejo de restricciones:

Para CHR (constraint handling rules) se usa una librería que está construida sobre ECLiPSe, añadiendo las reglas para manejo de restricciones.

Una regla de manejo de restricciones puede definir unas simplificaciones y propagaciones sobre restricciones definidas por el usuario.

Una regla de simplificación sustituye restricciones por otras más simples mientras conserven la equivalencia lógica. Por ejemplo:

X > Y; Y > X <==> false Una regla de propagación añade nuevas restricciones que son lógicamente

redundantes, pero puede provocar futuras simplificaciones. Por ejemplo:X > Y; Y > Z ==> X > Z

Aplicar repetidamente reglas de manejo de restricciones incrementará la simplificación y, posiblemente, resolverá las restricciones definidas por el usuario.

Page 21: 1 CLP Programación Lógica con Restricciones Introducción

21

Lenguajes de caja negra Oz:

Basado en la programación funcional de orden superior y la programación lógica con restricciones. Combina funciones con relaciones.

Oz proporciona algoritmos para decidir la satisfacibilidad de restricciones básicas con la siguiente forma: X = n; X = Y o X :: D donde X e Y son variables, n es un entero no negativo y D es un dominio finito. Las restricciones básicas residen en el almacén de restricciones. Las restricciones no básicas, como X + Y = Z, no están contenidas en el almacén pero son impuestas por propagadores. Un propagador Oz es un agente que lee en el almacén de restricciones e intenta reducir los dominios fijados ahí añadiendo restricciones básicas al almacén. Por ejemplo, suponiendo que hay un almacén de restricciones que contiene las variables X; Y con dominio {1,...,10}. El propagador para X + Y = 5 reduce el dominio de X e Y a {1,...,4}. El propagador X + Y = 5 restringe las variables X e Y. Añadiendo la restricción Y = 1 reduce el dominio de Y a 1 y el dominio de X a 4.

Proporciona objetos y concurrencia. Pertenece a la familia de los CCPLs (Concurrent Constraint Programming Languages)

Implementado en mOzArt.

Page 22: 1 CLP Programación Lógica con Restricciones Introducción

22

Lenguajes de caja negra ECLiPSe:

Incluye las restricciones en dominio finito tradicionales. Permite además la escritura de extensiones como restricciones definidas por el usuario o resolutores completamente nuevos como CHR.

Estas extensiones están basadas en un mecanismo de suspensión y reanimación de objetivos proporcionado por ECLiPSe.

Para hacer una extensión, el usuario necesita un buen conocimiento del funcionamiento interno del sistema.

Además de enteros, la librería de dominios finitos permite elementos atómicos (pej. atoms, strings, floats) y elementos compuestos básicos (pej. f(a,b)).

Page 23: 1 CLP Programación Lógica con Restricciones Introducción

23

Lenguajes de caja negra Ilog SOLVER:

Ilog SOLVER es una librería de C++ para programación con restricciones; por lo que los datos y las estructuras de control deben ser definidas en C++.

En Ilog SOLVER, una restricción puede ser un objeto o una expresión booleana con valores falso (IlcFalse) o true (IlcTrue). El valor depende de la satisfacibilidad de la restricción.

Estas expresiones pueden combinarse con operadores lógicos (and, or y not) para crear restricciones más complejas.

Cuando una restricción es postergada (usando la función IlcPost), la restricción es usada inmediatamente para reducir los dominios de las variables restringidas que involucra.

Está desarrollado pensando en la eficiencia.

Page 24: 1 CLP Programación Lógica con Restricciones Introducción

24

Lenguajes de caja negra

B-Prolog:

Como con ECLiPSe, su sistema proporciona un conjunto de predicados de dominio finito como los aritméticos o las restricciones booleanas y un conjunto de primitivas para procesar las variables de dominio.

Este conjunto de predicados de restricciones contenidos es menor para el B-Prolog que el que a su vez provee ECLiPSe.

Provee un interfaz bidireccional con C y Java.

Page 25: 1 CLP Programación Lógica con Restricciones Introducción

25

Comparativa Vamos a presentar una comparativa del rendimiento de los

8 lenguajes de programación lógica con restricciones mencionados. La comparativa ha sido realizada usando algoritmos para cada uno de los lenguajes para resolver los siguientes problemas (bastante conocidos).

SRQ (Self Referential Quizzes) sendmore: Es un problema aritmético con 8 variables entre 0...9, con

un una ecuación lineal y 36 desigualdades. Alpha: Un problema de cifrado que involucra 26 variables entre 1..26,

con 20 ecuaciones y 325 desigualdades. Ecuación 10: Resolución de un sistema de 10 ecuaciones lineales

con 7 variables entre 0..10. Ecuación 20: Resolución de un sistema de 10 ecuaciones lineales

con 7 variables entre 0..10. N Reinas: Consiste en colocar N reinas de ajedrez en un tablero NxN

de forma que ninguna de ellas amenace a cualquiera de las demás. Secuencias mágicas (N): calcula secuencias mágicas de N números.

Page 26: 1 CLP Programación Lógica con Restricciones Introducción

26

Comparativa

Los programas sendmore, alpha, ecuación 10 y ecuación 20 ponen a prueba la eficiencia de los sistemas para resolver problemas de ecuaciones lineales. Como los problemas de las N reinas y las secuencias mágicas son escalables, nos serán útiles para probar como trabaja cada sistema con instancias más grandes del mismo problema. El número de variables y el número de valores para cada una de ellas crece linealmente con N (tomando un valor N, por lo menos N variables de dominio finito deben ser declaradas con un rango de dominio entre 0 o 1 y N).

Page 27: 1 CLP Programación Lógica con Restricciones Introducción

27

SRQ (cuestionario autoreferenciado)1) La primera pregunta cuya respuesta es A es:

(A) 4 (B) 3 (C) 2 (D) 1 (E) ninguna de las respuestas es cierta2) Las únicas dos preguntas consecutivas con igual respuesta son:

(A) 3 y 4 (B) 4 y 5 (C) 5 y 6 (D) 6 y 7 (E) 7 y 83) La próxima pregunta con respuesta A es:

(A) 4 (B) 5 (C) 6 (D) 7 (E) 84) La primera pregunta par con respuesta B es:

(A) 2 (B) 4 (C) 6 (D) 8 (E) 105) La única pregunta impar con respuesta C es:

(A) 1 (B) 3 (C) 5 (D) 7 (E) 96) Una pregunta con respuesta D:

(A) viene antes de esta, pero no después. (B) viene tras esta, pero no antes.(C) viene antes y después de esta. (D) no hay ninguna.(E) ninguna de las respuestas es cierta.

7) La última pregunta con respuesta E es:(A) 5 (B) 6 (C) 7 (D) 8 (E) 9

8) El número de preguntas con respuesta consonante es:(A) 7 (B) 6 (C) 5 (D) 4 (E) 3

9) El número de preguntas con respuesta vocal es:(A) 0 (B) 1 (C) 2 (D) 3 (E) 4

10) La respuesta a esta pregunta es:(A) A (B) B (C) C (D) D (E) E

Page 28: 1 CLP Programación Lógica con Restricciones Introducción

28

Implementaciones del SRQ:

SICStus clp(FD) IF/Prolog CHR Oz ECLiPSe Ilog SOLVER B-Prolog

Page 29: 1 CLP Programación Lógica con Restricciones Introducción

29

Expresividad Oz, IF/Prolog y SICStus:

Son los que dan una solución más clara: Utilizan propagadores con notación infija. Admite encadenamiento de propagadores. Los propagadores trabajan sobre variables booleanas o restricciones. Oz y SICStus tiene operadores menos intuitivos que IF/Prolog.

(Pej: AND IF/Prolog ( /\ ), SICStus( #/\ ) y Oz ( * )NOT IF/Prolog ( ~ ), SICStus( #\ ) y Oz ( ~ ) )

Para variables no booleanas, habrá que usar meta-resticciones combinadas con restricciones reificadas.

Ilog y ECLiPSe: Son bastante claros pero menos que los anteriores:

También usan propagadores con notación infija y concatenados. Los propagadores no pueden trabajar directamente sobre las variables

booleanas, sino que ha de ser con restricciones sobre estas variables.(Pej: IF/Prolog ( A1 <=> A2 /\ (~A3) /\ (~A4) )

ECLiPSe ( (A1#=1) #<=> (A2#=1) #/\ (A3#=0) #/\ (A4#=0) ) )

Page 30: 1 CLP Programación Lógica con Restricciones Introducción

30

Expresividad clp(FD) y B-Prolog:

Son muy poco claros en comparación con todos los vistos antes: Los propagadores usan notación infija. Tampoco admite en encadenamiento de propagadores. Añade muchas variables intermedias.

(Pej: IF/Prolog ( A1 <=> A2 /\ (~A3) /\ (~A4) )clp(FD) ( not (A3, A3n)

not (A4, A4n)and(A2,A3n,A23)and(A23,A4n,A1) )

Clp(FD) además, no puede considerarse como un lenguaje plenamente declarativo, ya que algunas funciones hen de ser definidas en C.(Pej: IF/Prolog

Bef <=>(Q1?=4)\/(Q2?=4)\/(Q3?=4)\/(Q4?=4)\/(Q5?=4)

clp(FD)'x=a <=> b'(Q1,4,Q14),/* x=a <=> b está definida

usando C */'x=a <=> b'(Q2,4,Q24),'x=a <=> b'(Q3,4,Q34),'x=a <=> b'(Q4,4,Q44),'x=a <=> b'(Q5,4,Q54),or6(Q14,Q24,Q34,Q44,Q54,BeforeQ4),

Page 31: 1 CLP Programación Lógica con Restricciones Introducción

31

Rendimiento En las próximas tablas se compara el rendimiento en tiempo

de ejecución de los 8 lenguajes que estamos estudiando. Para la comparación se utilizan los códigos de los

problemas citados anteriormente. Estos códigos siguen los mismos algoritmos para todos los

lenguajes Han sido aceptados por los propios miembros de las empresas

desarrolladoras de los lenguajes. Son problemas simples (quizá debería haberse usado en la

comparativa algún problema de más entidad). La primera tabla mostrará medidas de tiempo, mientras que

las otras dos, están normalizadas con el resultado de ECLiPSe (pej: 2 ≡ tarda la mitad de tiempo que ECLiPSe )

Page 32: 1 CLP Programación Lógica con Restricciones Introducción

32

búsqueda de la primera solución (Usando first-fail labeling)

Page 33: 1 CLP Programación Lógica con Restricciones Introducción

33

Tabla normalizada para la búsqueda de la primera solución (Usando first-fail labeling)

Benchmarks Ilog clp(FD) Oz CHR SICStus IF/Prolog ECLiPSe B-

Prolog

SRQ (10 vars)

15.0 18.0 3.1 -8.4 3.3 10.0 1.0 18.0

SRQ (50 vars)

11.5 11.5 3.4 -6.7 3.0 6.0 1.0 4.1

64 reinas 98.3 4.0 2.6 - 1.6 2.7 1.0 54.1

100 reinas 24.1 Error1 4.4 - 1.0 1.1 1.0 -21.6

sendmore 3.3 1.7 1.7 - 2.0 2.0 1.0 3.3

alpha 12.6 5.4 3.4 - 1.8 -67.4 1.0 7.0

equation 10 4.2 3.1 1.8 - 1.2 5.5 1.0 2.3

equation 20 4.4 2.9 2.3 - 1.4 7.0 1.0 1.3

magic seq. (10)

16.7 8.3 3.3 - 1.5 1.5 1.0 1.2

magic seq. (50)

74.9 7.6 4.4 - 2.3 2.2 1.0 1.56

magic seq. (100)

177.5 11.5 3.1 - 3.6 2.4 1.0 Error4

magic seq. (130)

216.0 Error1 2.5 - 4.3 2.7 1.0 Error4

magic seq. (150)

87.1 Error1 -1.1 - 1.6 1.0 Error3 Error4

magic seq. (200)

195.0 Error1 Error2} - 3.2 1.0 Error3 Error4

Page 34: 1 CLP Programación Lógica con Restricciones Introducción

34

Tabla normalizada para la búsqueda de todas las soluciones (Usando first-fail labeling)

Benchmarks Ilog clp(FD) Oz SICStus IF/Prolog ECLiPSe B-

Prolog

8 reinas 6.4 5.9 1.0 1.4 4.5 1.0 10.9

9 reinas 6.6 6.3 -1.1

1.5 4.1 1.0 11.0

10 reinas 6.4 6.5 -1.1

1.5 4.2 1.0 10.7

11 reinas 7.0 6.9 -1.1

1.5 4.2 1.0 11.3

12 reinas 7.1 7.0 1.0 1.5 4.2 1.0 11.6

magic seq. (30) 31.6 5.7 5.7 2.6 3.0 1.0 -1.2

magic seq. (75) 43.0 6.4 5.7 3.9 3.6 1.0 -1.8

magic seq. (100)

46.7 6.8 5.1 4.7 3.7 1.0 Error4

magic seq. (130)

11.1 Error1 1.2 1.4 1.0 Error3 Error4

magic seq. (150)

11.5 Error1 1.1 1.5 1.0 Error3 Error4

Page 35: 1 CLP Programación Lógica con Restricciones Introducción

35

Robustez

Ilog clp(FD) Oz ECLiPSe SICStus IF/Prolog B-Prolog

1624-1625 111-112 194-200 230-??? 1000-1200 300-600 82-83

Número de variables de dominio finito manejadas en el problema de las secuencias mágicas (con el recolector de basura activo).

Page 36: 1 CLP Programación Lógica con Restricciones Introducción

36

Resultados analizados Ilog SOLVER.

En general, Ilog fue, con mucho, el sistema más rápido. Ilog fue además extremadamente robusto, resolviendo el problema de las secuencias mágicas con 1600 variables.

clp(FD). Dio buenos resultados, pero no fue tan rápido como Ilog.

Desafortunadamente, generó mensajes de error cuando el tamaño del problema fue incrementando. Esto indica que no escala bien con respecto al número de variables de dominio finito. Podemos resolver grandes problemas cambiando el tamaño de ciertas variables de entorno, pero el rendimiento será realmente pobre.

Oz.Oz fue más rápido que ECLiPSe encontrando tanto la primera

como todas las soluciones. Obteniendo todas las soluciones fue tan rápido como clp(FD). Además Oz fue más robusto que clp(FD) y solo falló al obtener la solución del problema de la secuencia mágica (200).

Page 37: 1 CLP Programación Lógica con Restricciones Introducción

37

Resultados analizados SICSTUS y IF/Prolog.

Tuvieron resultados muy parecidos en rendimiento y fueron dos o tres veces más rápidos que ECLiPSe. Aunque IF/Prolog trabajó particularmente mal con el benchmark Alpha, obsérvese que trabaja muy bien para la búsqueda de la primera solución (algunas veces mejor que clp(FD) e Ilog). SICStus e IF/Prolog fueron más robustos que clp(FD), Oz y ECLiPSe. SICStus ha tenido la mayor robustez porque ha resuelto el problema de las secuencias mágicas con 1000 variables de dominio finito cuando IF/Prolog falló al resolver el mismo problema con 600 variables.

Page 38: 1 CLP Programación Lógica con Restricciones Introducción

38

Resultados analizados B-Prolog.

Este sistema trabajó bien con problemas que involucran un pequeño número de variables de dominio finito. En este caso, la eficiencia es comparable con la de clp(FD). De todos modos, cuanto mayor es en número de variables, peor es el rendimiento comparado con otros sistemas. Por ejemplo, las 100 reinas para la primera solución dio un rendimiento particularmente malo, mostrando que el sistema no escala bien. Esto es una consecuencia directa de que la versión de B-Prolog usada para el benchmark no tiene recolector de basura.

ECLiPSe.Tiene los peores resultados (excepto, obviamente, para CHR). Para

obtener su mejor resultado de rendimiento posible, ECLiPSe tenía deshabilitada la recolección de basura. Con recolección de basura se pueden llegar a obtener resultados tres veces peores.

CHR. Es el peor por dos razones básicas. (1) está construido sobre ECLiPSe

(2) no fue diseñado, en principio, para la eficiencia; sino para definir resolutores adecuados de restricciones para problemas particulares en dominios específicos.

Page 39: 1 CLP Programación Lógica con Restricciones Introducción

39

Documentos consultados Constraints, 5, 275–301 (2000) Kluwer Academic Publishers

A Comparative Study of Eight Constraint Programming Languages Over the Boolean and Finite DomainsANTONIO J. FERNÁNDEZ y PATRICIA M. HILL

University of Leeds School of Computer Studies Research Report (Report 97.03)Finite Domain Solvers Compared Using Self Referential QuizzesANTONIO J. FERNÁNDEZ y PATRICIA M. HILL

Constraints, 9, 5– 34, (2004) Kluwer Academic PublishersOn Benchmarking Constraint Logic Programming Platforms. Response to Fernandez and Hill’s ‘‘A Comparative Study of Eight Constraint Programming Languages over the Boolean and Finite Domains’’MARK WALLACE, JOACHIM SCHIMPF, KISH SHEN y WARWICK HARVEY

Page 40: 1 CLP Programación Lógica con Restricciones Introducción

40

Programación con restricciones

Problemas de satisfacciónde restricciones

Page 41: 1 CLP Programación Lógica con Restricciones Introducción

41

Problemas de satisfacciónde restricciones Definición Restricciones Resolución de problemas

ModelarProcesar

Reducción de problemas: Consistencia Algoritmos de búsqueda

Heuristicas

Page 42: 1 CLP Programación Lógica con Restricciones Introducción

42

Definición: problemas de satisfacción de restricciones Llamamos problema de satisfaccion de restricciones

(CSP: Constraint SatisfactionProblem) a un triple formado por:

Un conjunto de variables V = {X1,...,Xn}. Para cada variable de V un conjunto de posibles valores

Di, que llamaremos dominio de Xi. Un conjunto de restricciones, normalmente binarias,

Cij(Xi,Xj) que determinan los valores que las variables pueden tomar simultáneamente.

Page 43: 1 CLP Programación Lógica con Restricciones Introducción

43

Definición: problemas de satisfacción de restricciones El objetivo es encontrar un valor para cada

variable de manera que se satisfagan todas las restricciones del problema.

Las estrategias de búsqueda de soluciones tratan de encontrar las tuplas de valores (v1,...,vn) de las variables X1,...,Xn que satisfacen las restricciones.

Una restricción entre varias variables determina el subconjunto del producto cartesiano.

Page 44: 1 CLP Programación Lógica con Restricciones Introducción

44

Restricciones

Cada restricción limita el conjunto de asignaciones para las variables implicadas

Pueden darse de dos formas:

Explícita (mediante tablas)

Implícita X1 > x2

Page 45: 1 CLP Programación Lógica con Restricciones Introducción

45

Aridad de las restricciones

Restricción unitaria: Tiene una sola variable afectada.La restricción puede usarse para excluir un valores del dominio de definición, por ejemplo, X > 5.

Restricción binaria: Tiene dos variables afectadas.Una restricción binaria entre variables de dominios de tamaño m y n, puede ser representada mediante una matriz de tamaño m x n con valores:

1 si la restricción se satisface para ese par de valores.

0 si la restricción no se satisface para ese par de valores.

Page 46: 1 CLP Programación Lógica con Restricciones Introducción

46

Resolución del CSP

Modelar el problema como un problema de satisfacción de restricciones ( mediante un conjunto de variables, dominios y restricciones)

Procesar el problema de satisfacción de restricciones resultante. Técnicas de consistenciaAlgoritmos de búsqueda

Page 47: 1 CLP Programación Lógica con Restricciones Introducción

47

Técnicas de consistencia

Formas de mejorar la eficiencia de los algoritmos de búsqueda.

Borran valores inconsistentes de las variables y ayudan a podar el espacio de búsqueda.

Estas técnicas de consistencia local se usan como etapas de preproceso donde se detectan y se eliminan las inconsistencias locales antes de empezar o durante la búsqueda con el fin de reducir el árbol de búsqueda.

Page 48: 1 CLP Programación Lógica con Restricciones Introducción

48

Técnicas de consistencia

Llamadas improductivas: asignación parcial consistente pero que no puede llegar a ninguna solución.

Profundidad del árbolCuando hay muchas variables es alta.

Orden de ramificaciónCuando las vbles pueden tomar muchos valores

distintos.

Page 49: 1 CLP Programación Lógica con Restricciones Introducción

49

Técnicas de consistencia

AlgoritmoDe

Búsqueda

ProcedimientoDe

ConsistenciaCSP

CSP k-consistente(simplificado)

Solución

Page 50: 1 CLP Programación Lógica con Restricciones Introducción

50

Niveles de Consistencia Local

Consistencia de Nodo (1-consistencia)Sobre restricciones de aridad 1

X = {2,15} X = {2,7}

X ≤ 7

Dominio original Dominio nodo-consistente

Page 51: 1 CLP Programación Lógica con Restricciones Introducción

51

Niveles de Consistencia Local

Consistencia de Arco (2-consistencia)Sobre restricciones de aridad 2

X = {1,2,3}

Y = {1,2,3}

X < Y

2-consistencia

X = {1,2}

Y = {2,3}

X < Y

Page 52: 1 CLP Programación Lógica con Restricciones Introducción

52

Algoritmos para resolver problemas de satisfacción de restricciones

Algoritmo de genera y comprueba

Algoritmo de backtracking simple

Algoritmo de backtracking con chequeo previo

Page 53: 1 CLP Programación Lógica con Restricciones Introducción

53

Algoritmo de genera y comprueba

Se asigna un valor del dominio permitido a cada una de las variables de la tupla que se va a evaluar, y después se comprueba que forman una solución, es decir, si verifican todas las restricciones. Si no las verifica entonces se desecha esa tupla y genera la siguiente.

El proceso se repite hasta encontrar una solución, o hasta que se hayan generado y comprobado todos los casos posibles.

Problema: Este algoritmo evalúa cada vez las restricciones entre todas las variables.

Page 54: 1 CLP Programación Lógica con Restricciones Introducción

54

Algoritmo de backtracking simple

Se asigna un valor del dominio permitido a la siguiente variable a evaluar, y se comprueba si forma parte de la solución parcial

Si no verifica las restricciones entonces se desecha ese valor y se toma el siguiente valor del dominio permitido para la variable.

Page 55: 1 CLP Programación Lógica con Restricciones Introducción

55

Algoritmo de backtracking simple

Si se intentan todos los valores de la variable y ninguno forma parte de la solución, entonces se pasa a eliminar el valor de la variable anterior evaluada y se toma el siguiente valor para esa variable.

El proceso se repite hasta encontrar una solución, o hasta que se hayan probado todos los casos posibles.

Este algoritmo solo computa las restricciones entre la nueva variable a evaluar y las variables computadas previamente.

Page 56: 1 CLP Programación Lógica con Restricciones Introducción

56

Algoritmo de backtracking con chequeo previo

Se asigna un valor de su dominio a la nueva variable a evaluar, y se comprueba no solo si forma parte de la solución parcial sino que además se mira si algún valor de una futura asignación tiene conflicto con este valor y si es así se elimina temporalmente del dominio de esa futura variable.

La ventaja de este método es que si el dominio de una futura variable llega a ser vacío, esto significa que la solución parcial es inconsistente, con lo cual se prueba con otro valor de la variable activa o se vuelve atrás y el dominio de las futuras variables restaurado.

Page 57: 1 CLP Programación Lógica con Restricciones Introducción

57

Algoritmo de backtracking con chequeo previo Con el backtracking simple no se habra

detectado la inconsistencia hasta que no se hubieran evaluado todas las futuras variables.

En el algoritmo de backtracking con chequeo previo las ramas de los árboles que van a dar inconsistencia son podadas con anterioridad.

Page 58: 1 CLP Programación Lógica con Restricciones Introducción

58

Ordenación de variables

El algoritmo de búsqueda en un árbol que satisface ciertas restricciones, requiere que las variables que van a ser consideradas estén ordenadas, puesto que hemos de tener claro en

todo momento como realizar la vuelta atrás. El orden puede ser:

Estático: Ha de ser especificado al comienzo. Dinámico: La próxima variable a considerar

depende del estado de la búsqueda.

Page 59: 1 CLP Programación Lógica con Restricciones Introducción

59

Heurísticas de búsqueda

principio de “fail-first primero probemos valores que tengan un

dominio pequeño Seguramente alguno de esos valores, que

son pocos, deba formar parte de la solución si la solución parcial conduce a una rama

muerta cuanto antes lo descubramos mejor

Page 60: 1 CLP Programación Lógica con Restricciones Introducción

60

Heurísticas de búsqueda

principio de “fail-first Podrá reducirse la media de la profundidad

de las ramas de los árboles provocando fallos tempranamente.

para las variables con dominios de igual tamaño, elegimos primero las que aparecen en más restricciones, pues fuerzan más la solución del problema.

Page 61: 1 CLP Programación Lógica con Restricciones Introducción

61

Ordenación de los valores

cómo seleccionar los valores a asignar a dichas variables. Si no hay conflictos lo más sencillo es

considerar el orden “natural” de los dominios y asignar desde el menor valor hasta el mayor.

Tiene importancia si queremos una única solución.

Para todas las soluciones o saber si tiene solución nos es indiferente el orden.

Page 62: 1 CLP Programación Lógica con Restricciones Introducción

62

Solución óptima

Hay un tipo particular de problemas de satisfacción de restricciones,que son aquellos que añaden a las tres componentes normales del problema P= (Z, D,C) una cuarta componente f que es una función de optimización, de forma que no sólo buscamos una tupla que satisfaga el problema si no que además debe hacerlo con coste máximo o mínimo, según indique f. Normalmente, para lograr la mejor, se repite el proceso de evaluar el coste de una solución y si el de la siguiente es mejor se toma ésta como posible óptima hasta encontrar otra que pudiere ser mejor.

Page 63: 1 CLP Programación Lógica con Restricciones Introducción

63

Programación con restricciones.

Aplicación a números reales.

Page 64: 1 CLP Programación Lógica con Restricciones Introducción

64

CLP (R)

Conceptos Básicos:

La estructura de R está compuesta por dos clases de objetos:

-Términos de los reales,”TR”:

Números reales y operaciones sobre estos {+,-,*,/}

t E TR :

{ r e R | x e R | t1 + t2| t1 * t2| t1 – t2| t1 / t2} e TR

-Términos no interpretados utilizo UH (universo de Herbrand) th e UH ::=

{X VAR | const | f( th1, th2,…, thn)}

- t e Términos ::= f(t1,….tn) para cada ti e {UH U TR}=T

T es el conjunto de los términos herbrand y los términos reales.

Page 65: 1 CLP Programación Lógica con Restricciones Introducción

65

CLP (R)

Restricciones:

-Restricción Primitiva (r) : r es resoluble sii Existe sustitución de variables por reales que satisfacen la restricción.

-Restricción Aritmética(r) : t1>=t2 , t1<t2, t1=t2,….

-Restricción no Aritmética(r): “Unificación” .

th1=th2 donde th1 y th2 son términos no interpretados

Programa CLP(R ):

Es un conjunto finito de reglas:

- A:-p(t1,…,tn) para todo ti eT y p /e {<=,>=,/=} términos.

- A:- A1, A2,…, Ak donde Ai(i>=1) son átomos o restricciones primitivas.

Page 66: 1 CLP Programación Lógica con Restricciones Introducción

66

CLP (R)

ejemplo:Fibbonaci(n)

fib(0,1).

fib(1,1).

Fib(N,x1+x2):- N>1, fib(N-1,x1),fib(N-2,x2).

Si deseo obtener una solución para b especial 80<=b, b<=90 solo tengo que anteponer las restricciones sobre la función.

?- 80<=b, b<=90,fib(a,b). Solución a=10,b=89.

CLP(R) objetivo: ?-B1,B2,,,,Br donde cada Bj son átomos o restricciones primitivas( Las que se resuelven, las que se duermen), “Se debe indicar claramente cuando se despierta o cuando se duerme una restricción y cual es el átomo a resolver.

{A1,…AN} N>=0, son los objetivos a resolver.

{S1,…,SM} M>=0, son las restricciones ya resueltas.

{D1,…,DK} K>=0, restricciones dormidas.

Page 67: 1 CLP Programación Lógica con Restricciones Introducción

67

CLP( R )

Objetivo: G-? {A1,…,AN},{S1,…,SM},{D1,….,DK}

Nuevo objetivo

G’-? {A1,…..,AN},{S1,…,SM,Di},{{D1,…DK}-{Di}}

se añade una restricción dormida a las resultas.

O bien:

G’-?{A1,….Ai-1,B1,….,BS,Ai+1,…AN}

resultante de colocar los átomos de la cláusula usada

{S1,…..,SM} No varia

{D1,…Dk,Ai Ξ B, D11, Dp1} y uso la regla B:-{B1,…,Bs},{D11,….,D12}

Generado al añadir las restricciones de la cláusula y la unificación con el átomo de la cabeza.

Page 68: 1 CLP Programación Lógica con Restricciones Introducción

68

Problemas

PROBLEMAS:En caso de admitir restricciones no lineales aparecen dos problemas indecidibles:

- Proseguir con las derivaciones indefinidamente aunque exista éxito ===> “Incompletitud Relativa” denominado así porque aunque no he

terminado el programa he encontrado una solución. - Devolver el conjunto de restricciones respuesta y Informa que tengo una respuesta

Irresoluble.

ejemplo: solución en simplex de infinitas soluciones ( semirrecta) o tengo un problema no factible o no satisfacible

Si entramos en contradicción de cual es la mejor solución: -Utilizo heurísticas buscando una solución parcial y obtención rápida. -Recorrer todo el espacio de búsqueda invirtiendo mucho tiempo en encontrar la

solución: -Mezcla: Ofrecer una solución rápida pero en segundo plano continuar buscando

por si puedo mejorar.

Page 69: 1 CLP Programación Lógica con Restricciones Introducción

69

Simplex

RESTRICCIONES CON REALES SIMPLEX.Tipo Problema:

{MAX,MIN} f=∑(s)a(i)x(i) con s={-1, 1} y aiЄ Reales. sujeto a: r(p):∑ (s)*c(j)* x(j)(op relacional) b con 1<=p<=m, 1<=j<=t, s={-1, 1} y ciЄ Reales, x(i) E Reales, op relacional={<,<=,>,>=} y b E Reales.1º Paso Colocar el problema en forma Canónica.

- MAX f - Restricciones con los operandos relacionales del tipo {<,< =}

- Variables no negativas.2º Paso Transformar el problema en forma estándar. - MAX f - Restricciones son ecuaciones con el símbolo {=}

- Variables no negativas.

Page 70: 1 CLP Programación Lógica con Restricciones Introducción

70

Simplex(I)

Ejemplo: Maximizar 4 x1 + x2 + 6 x3

Sujeto a

- 2 x1 - x2 + 2 x3 >= 1

x1 + x2 + x3 >= 6

x1 , x2 , x3 >= 0

Documento DecAv1.sim

decav1.sim

Ejemplo convertido a forma canónica:

Maximizar 4x1+x2+6x3

sujeto a:

-2x1-x2+2x3-s1+x1º=1

x1+x2+x3-s2+x2º=6

x1,x2,x3>=0.

Este Problema tiene solución no acotada.

Page 71: 1 CLP Programación Lógica con Restricciones Introducción

71

Simplex(II)

Ejemplo 2:

Maximizar - 2x1 - x2

Sujeto a 3x1 + x2 >= 3

4x1 + 3x2 >= 6

x1, x2 >= 0

Documento DecAv2.sim

decav2.sim

Ejemplo convertido a forma canónica: Maximizar -2x1-x2

Sujeto a 3x1+x2-s1+x1ª=3

4X1+3X2-S2+X2ª=6

X1,X2,S1,S2,X1º,X2º>=0.

El problema es factible, tiene solución y es: F=-2.4 x1=0.6, x2=1.2.

Page 72: 1 CLP Programación Lógica con Restricciones Introducción

72

Sistema grafico

Max f = 2x1 + x2

sujeto a: 5*x1 + 2*x2 <=10;

3*x1+5*x2<=15

x1,x2>=0.

Si en lugar de maximizar

deseo minimizar en el

puedo obtener la

solución y sería

el punto (0,0).-

Introduciendo mas restricciones o menos y cambiando la función de maximizar la solución va cambiando. Para un mismo problema o función.

Page 73: 1 CLP Programación Lógica con Restricciones Introducción

73

Solución Matricial

Ejemplo:max -2x1-x2

sujeto a: 3x1 + x2 >=3; 4x1+3x2>=6 x1,x2>=0

Matriz del problema B=(3 1) B-1=(3/5 -1/5) (4 3) (-4/5 3/5)

En el método simplex me interesa saber el valor de la variable x1 y x2 que se encuentra almacenado en las columnas que hacen referencia a p1 y p2 y para obtener el valor de F me interesa conocer el valor de p0.

Método matricial: PO’=(B-1)*P0=(3/5 6/5) P1’=(B-1)*P1=(1 0) P2’=(B-1)*P2=(0 1) (X1 X2)=P0’=(3/5 6/5) F=(-2)*(3/5)-6/5=-12/5

Page 74: 1 CLP Programación Lógica con Restricciones Introducción

74

Posibles soluciones y simplex modificado.

Posibles soluciones:- Infinitas soluciones: en la tabla zk-ck=0 y pk no es básico, la solución (segmento) solunica.sim

-Ilimitada: no tiene solución: el vector que entra tiene todas sus componentes <= 0 nofactib.sim

-Solución es una semirrecta en la que tengo una solución base:

zk-ck=0 , pk no básico, para todo i pk(i)<=0. multiple.sim

Simplex Modificado:

Paso 1: Busco una solución básica.

Repeat

Paso 2: si Э solución básica factible que mejora solución voy a p3

sino doy solución básica.

Paso 3: Encontrar solución mejor. Voy al paso 2.

Hasta que (solución No factible).

Page 75: 1 CLP Programación Lógica con Restricciones Introducción

75

MOTOR DE INFERENCIA.

Elección del elemento que entra y sale:

Entra el Pi tal que {pi= 1<=k<=n |zk-ck| ^ [zk-ck<0]

max

Sale aquel tal que min{ P0(1) /Pi(1), P0(2)/Pi(2),…P0(n)/Pi(n) }

Pero se toman aquellos elementos que cumplen que P0(i), Pk(i) son positivos.

decav1.sim

SISTEMA DE MODULOS CLP( R ).MOTOR DE INFERENCIA E INTERFAZ.

Este motor de inferencia manipula las restricciones sencillas sin usar un resolutor y mantiene las ligaduras implícitas, controla la creación de puntos de tipo normal o resolutor.

I Unificación:

R-Variables Conjunto de variables que aparecen en la colección de restricciones usadas por el resolutor. El resto son variables normales.

Page 76: 1 CLP Programación Lógica con Restricciones Introducción

76

Tabla de Unificación

t2|t1 var R-var Num Term R-term

Var Unifica

R-var T1T2 Resolver

Num T1T2 Resolver ¿T1=T2?

Term T1T2 Error Error ¿T1=T2?

RTerm Interface Interface Interface Error ¿T1=T2?

Unificación representa la relación (Variable Numero)

El resolutor y e interface hacen la unificación de forma Explicita.

El resolvedor de ecuaciones y el de inecuaciones lo hace de forma implícita

Si no se puede Unificar se produce un error.

Page 77: 1 CLP Programación Lógica con Restricciones Introducción

77

Sincronización de vuelta atrás.

ACCESO RAPIDO. Necesito almacenar las ligaduras, establecidas en la tabla anterior, pero estas ligaduras no las

necesito entre los términos aritméticos y las variables.

Cuidado con las ligaduras cíclicas: - Si las ligaduras cíclicas entre variables toman en un instante de la Unificación un valor

numérico no se produce inconsistencia.

II. Sincronización de vuelta atrás del motor de inferencia con el resolutor de restricciones.Puntos de Elección:

* Del Motor de Inferencia : Si tengo varias posibilidades de elección de una regla este se encarga de elegir una.

* Del Resolutor: (Restaura las restricciones por los puntos de elección usados.

Hay una relación entre ambos, Necesito:-Reducir los P de Elección del resolutor debido al tamaño y el tiempo que pierdo generar los datos.-Crear un P, de Elección del resolutor si y solo si hay nuevas restricciones que añadir desde el último Punto de Elección del resolutor.

Page 78: 1 CLP Programación Lógica con Restricciones Introducción

78

Resolutor de ecuaciones

III. El Interfaz.

Llamado por el motor de inferencia. Si la restricción tiene un termino aritmético.

Paso1:Evalua la expresión Aritmética.

Paso2:Si básica ( restricción) Evalua(Expresion).

Sinosi (nºvar(restricion)=1) ^ (es-ecuacion(restriccion))Ligagura Implitita.

Sino Proceso esta Restricción y llamo al resolutor.

Ejemplo:

ejemplodeInterfaz.doc

RESOLUTOR DE ECUACIONES.La colección de ecuaciones lineales consistente se mantienen en el Modulo.

Para introducir una compruebo consistencia con las demás y si se mantiene la añado

e intento resolver el problema en caso contrario puedo comunicar que el problema no

tiene solución con estas restricciones.

Hay una prioridad máxima: responder a la consistencia:( devuelve si las ecuaciones almacenadas con la nueva son consistentes.

Page 79: 1 CLP Programación Lógica con Restricciones Introducción

79

Resolutor de ecuaciones

Matriz de ecuaciones: solo las R-variables.Xi=bi+ci1*ti1+ci2*ti2+ci3*ti3+….

Xi es la variable no parametrica y cij, j Є {1,..n} son coeficientes reales y tij j Є {1,..n} son variables parametricas.¿Cómo se añade una restricción lineal? Partiendo de la forma resuelta Inicial: Tenemos FRPJ-1 la ecuación EJ(j>=1) 1º (FRPJ-1 ^ Ej)¿es consistente? si, construyo (FRPj). Rj es el resultado de sustituir las vars no parametricas x de FRPj-1 en Ej

1)si Rj es (0=0) entonces (FRPJ=FRPJ-1) devuelve cierto. 2)si Rj es (c=0) ^(c!= 0) no hay FRPj y devuelvo falso. 3)si hay var no parametricas {x1,..xm} tomo xk 1<=k<=m como no parametrica y el resto

como parametricas. FRPJ=FRPJ-1 U {nueva ecuación}

si M=1 se despiertan restricciones lineales no dormidas sino devuelvo cierto 4)si Rj solo tiene vars parametricaselijo una cualquiera como sujeto de la ecuación.

AÑADIR RESTRICCION LINEAL.doc

Page 80: 1 CLP Programación Lógica con Restricciones Introducción

80

Resolutor de inecuaciones y ejemplos de dominios finitos.

RESOLUTOR DE INECUACIONES. Adaptación del Simplex. Utilizo Variables de holgura, manipulo las restricciones, admite ecuaciones e inecuaciones. Lo he visto antes.(Ejemplo transparencia Simplex(I) y Simplex(II) Una vez obtenidas las ecuaciones aplico el resolutor de ecuaciones.

DOMINIOS FINITOS, CLP( R).Ejemplo: SEND + MORE = MONEY

Metodología:1)Dominio: ([S,E,N,D,M,O,R,Y], 0, 9). Representa la s variables y el dominio asociado a ellas.

2)Restricciones: Restrict([S,E,N,D,M,O,R,Y]):- S#>0, M#>0,

AllDiferent([S,E,N,D,M,O,R,Y]). SUM([S,E,N,D,M,O,R,Y]). Siendo: Sum([S,E,N,D,M,O,R,Y]):-1000*S+100*E+10*N+D+1000*M+100*O+10*R+E #=10000*M+1000*O+100*N+10*E+Y.

Page 81: 1 CLP Programación Lógica con Restricciones Introducción

81

Ejemplos de dominios finitos.

3º) Genero los valores de las variables: Labeling(Type,[S,E,N,D,M,O,R,Y]).

El programa seria:

Send([S,E,N,D,M,O,R,Y],Type):- domain([S,E,N,D,M,O,R,Y],0,9),

restrict([S,E,N,D,M,O,R,Y]),

labeling(Type, [S,E,N,D,M,O,R,Y]).

Lo ejecutamos:

?- Send([S,E,N,D,M,O,R,Y],[]) y produce: D=7,E=5,M=1,N=6,O=0,R=8,S=9,Y=2.

EN CLP(R )

DENTRO DE CLP( R)

Dominio(S,E,N,D,M,O,R,Y):= S>0 , E>=0 , N>=0 , D>=0 , M>=0,O>=0,R>=0

Y>=0,S<=9,E<=9,N<=9,D<=9,M<=9,O<=9,R<=9,Y<=9.

Page 82: 1 CLP Programación Lógica con Restricciones Introducción

82

Ejemplos de dominios finitos

Restrict(S,E,N,D,M,O,R,Y):-

S#>0 , M#>9 , D+E=Y+10*C1 , C1+N+R=E+10*C2 , C2+E+0=N+10*C3, C3+S+M=0+10*M, carry(C1,C2,C3),Dig(s),Dig(E), Dig(N),Dig(D),Dig(M),Dig(O),Dig ( R) , Dig(y),difflist([S,E,N,D,M,O,R,Y]);

Carry(1,1,1) carry(1,0,0) carry(0,0,1) carry(1,1,0) carry(0,1,1) carry(0,0,0) carry(1,0,1) carry(0,1,0) dig(9),….,…..dig(0).

Diflist([]).

Diflist([X|T]):- no miembro(X,T),Difflist(T).

NoMiembro(X,[Y|T]) :-X<Y,NoMiembro(X,Z).

NoMiembro(X,[Y,Z]):->X>Y,NoMiembro(X,Z).

NoMiembro(X,[]).

Si ejecuto Send(S,E,N,D,M,O,R,Y):-dominio(S,E,N,D,M,O,R,Y), Restrict(S,E,N,D,M,O,R,Y).

SEND(S,E,N,D,M,O,R,Y) produce

S=9 , E=5 , N=6 , D=7 , M=1 , O=0 , R=8 , Y=2