Variables simples • Sintaxis: ?< nombre-variable > es cualquier símbolo que comience con un carácter alfabético ?velocidad ?nombre
• Uso: buscar ligaduras de variables en antecedente o parte izquierda de la regla emplear valor ligadura en consecuente o parte derecha regla
Ejemplo variables I (deftemplate persona (slot nombre) (slot ojos) (slot pelo)) (deffacts personas (persona (nombre Julia) (ojos azules) (pelo pelirroja)) (persona (nombre Juan) (ojos verdes) (pelo rubio)) (persona (nombre Javier) (ojos azules) (pelo moreno)) (persona (nombre Jesus) (ojos verdes) (pelo rubio))) (defrule encontrar-ojos-azules (persona (nombre ?nombre) (ojos azules)) => (printout t ?nombre " tiene los ojos azules." crlf))
Sesión variables I (load "C:/CLIPS/Exb02e1.CLP") CLIPS> Defining deftemplate: persona Defining deffacts: personas Defining defrule: encontrar-ojos-azules +j TRUE CLIPS> (reset) CLIPS> (run) Javier tiene los ojos azules. Julia tiene los ojos azules.
Ligadura y alcance variables simples 1. Las variables pueden ligarse a un único valor 2. La ligadura se mantiene en el alcance de la variable: regla 3. Particularización por substitución: reemplazar una variable por su ligadura, en su alcance
Confrontación patrones • Un patrón de una regla, P, y un hecho, F, confrontan si y solo si existen ligaduras para las variables que ocurren en P tales que al substituir las variables por sus ligaduras, P y F son sintácticamente iguales
Sesión variables II CLIPS> (reset) CLIPS> (assert (encontrar (ojos azules))) CLIPS> (run) Javier tiene ojos azules. Julia tiene ojos azules. CLIPS> (assert (encontrar (ojos verdes))) CLIPS> (run) Jesus tiene ojos verdes. Juan tiene ojos verdes. CLIPS> (assert (encontrar (ojos malva))) CLIPS> (run) CLIPS>
Manipulación de Hechos en Reglas • Las operaciones sobre hechos, salvo assert, requieren la obtención de un índice al hecho: fact-address • Una variable se puede ligar al fact-address del hecho que confronta con el patrón de una regla, mediante el operador pattern binding: (watch rules) CLIPS> (watch facts) CLIPS> (run) FIRE 1 procesar-informacion-mudanza: f-2,f-1
Comodines • Simples – Sintaxis: ? – Uso: comprobar la existencia de un campo en un hecho
• Multicampo – Sintaxis : $? – Uso comprobar la existencia de cualquier número de campos en un hecho
Ejemplo comodines F-1: (persona (nombre Juan Rodrigo) (id 123)) F-2: (persona (nombre Juan Rodrigo Alvarez ) (id 123)) F-3: (persona (nombre Juan Luis Rodrigo Alvarez ) (id 123)) P-1: (persona (nombre ? ? ?segundoApellido) (id ?id)) P-2: (persona (nombre ? $? ? ?segundoApellido) (id ?id)) P-3: (persona (nombre $? ?segundoApellido) (id ?id)) P-4: (persona (nombre ? $? $? ?segundoApellido) (id ?id))
Variables Multicampo • Sintaxis lado izquierdo: $?< nombre-variable > • Sintaxis lado derecho: se puede suprimir $ (defrule print-hijos (print-hijos $?nombre) (persona (nombre $?nombre) (hijos $?hijos)) => (printout t ?hijos " son hijos de " $?nombre "." crlf))
Ejemplo Variables Multicampo (deftemplate persona (multislot nombre) (multislot hijos)) (deffacts personas (persona (nombre Juan Rodrigo) (hijos Pablo Ana)) (persona (nombre Jose Gimenez) (hijos Pedro))) (defrule print-hijos (print-hijos $?nombre) (persona (nombre $?nombre) (hijos $?hijos)) => (printout t ?hijos " son hijos de " $?nombre "." crlf))
Sesión Variables Multicampo CLIPS> (reset) CLIPS> (assert (print-hijos Juan Rodrigo)) CLIPS> (run) (Pablo Ana) son hijos de (Juan Rodrigo). CLIPS>
Ampliando las Posibilidades de Confrontación: Restricciones • Las restricciones, field constrain, permiten restringir los valores de un campo que satisfacen la confrontación de patrones.
Restricciones not (~), or ( | ) (defrule persona-sin-pelo-moreno (persona (nombre ?nombre) (pelo ~moreno)) => (printout t ?nombre " no tiene el pelo moreno." crlf)) (defrule persona-con-pelo-moreno-o-rubio (persona (nombre ?nombre) (pelo negro | rubio)) => (printout t ?nombre " tiene el pelo moreno o rubio." crlf))
Restricciones and (&), • Habitualmente, junto a otras restricciones (defrule pelo-moreno-o-rubio (persona (nombre ?nombre) (pelo ?color&moreno|rubio)) => (printout t ?nombre " tiene el pelo " ?color "." crlf))