Soluciones CLIPS

Download Soluciones CLIPS

Post on 31-Oct-2015

238 views

Category:

Documents

3 download

Embed Size (px)

TRANSCRIPT

<p>Examen de Sistemas Basados en Conocimiento I </p> <p>Se plantea el problema clsico de rutas entre ciudades: Un agente desea desplazarse por carretera desde la ciudad en la que se encuentra actualmente a una ciudad destino. La accin bsica que puede emprender es ir(x,y), que lo lleva de la ciudad X a la ciudad Y, siempre y cuando exista una ruta directa entre ambas. Este ltimo hecho se expresa mediante hechos (rutaDirecta x y). Se supone que existen los siguientes hechos en la memoria de trabajo para representar estas rutas:</p> <p>(deffacts mapa_ciudades</p> <p>(rutaDirecta Zeind Oradea 71) </p> <p>(rutaDirecta Oradea Sibiu 151)</p> <p>(rutaDirecta Zerind Arad 75) </p> <p>(rutaDirecta Arad Sibiu 140)</p> <p>(rutaDirecta Arad Timisoara 118)</p> <p>(rutaDirecta Timisoara Lugoj 111)</p> <p>(rutaDirecta Lugoj Mehadia 70) </p> <p>(rutaDirecta Mehadia Dobreta 75)</p> <p>(rutaDirecta Dobreta Caiova 120) </p> <p>(rutaDirecta Caiova Rimnicu 146)</p> <p>(rutaDirecta Caiova Pitesti 138)</p> <p>(rutaDirecta Rimnicu Sibiu 80)</p> <p>(rutaDirecta Rimnicu Pitesti 97) </p> <p>(rutaDirecta Pitesti Bucarest 101)</p> <p>(rutaDirecta Sibiu Fagaras 99) </p> <p>(rutaDirecta Fagaras Bucarest 211)</p> <p>(rutaDirecta Bucarest Giurgiu 90) </p> <p>(rutaDirecta Bucarest Urziceni 85)</p> <p>(rutaDirecta Urziceni Hirsova 98) </p> <p>(rutaDirecta Hirsova Eforie 86)</p> <p>(rutaDirecta Urziceni Vaslui 142) </p> <p>(rutaDirecta Vaslui Iasi 92)</p> <p>(rutaDirecta Iasi Neamt 87)</p> <p>)</p> <p>Se pide que responda a las siguientes cuestiones:</p> <p>a) Elaborar una Base de Conocimiento de reglas para este problema que sea capaz de responder a la consulta (ir X Y) al menos con una ruta factible entre las ciudades X e Y. La ruta contendr todas las rutas directas exploradas para llegar de X a Y. No se solicita calcular la ruta ptima, slo una ruta factible en la que ninguna</p> <p>ciudad en la ruta est repetida</p> <p>i) Debe tenerse en cuenta que, aunque en la base de hechos inicial nicamente se describen las rutas directas en una direccin, estas rutas son simtricas, ej. (rutaDirecta Oradea Sibiu 151) -&gt; (rutaDirecta Sibiu Oradea 151). </p> <p>ii) Dentro de la solucin al problema deber incluirse, al menos, todas las ciudades recorridas (en su orden correcto desde el origen al destino). La solucin no tiene que repetir una ciudad (utilizar la funcin booleana que comprueba si un elemento es miembro de una lista (member$ ?elemento $?lista-elementos)). Se pide tambin justificar brevemente el diseo del hecho o de los hechos de la solucin al problema.</p> <p>iii) Una vez encontrada la solucin, se pide que esta se imprima en la salida estndar, utilizando (printout t crlf)</p> <p>b) Supngase ahora que el vehculo utilizado tiene un depsito de combustible y consume 5 litros cada 100 kilmetros. Se pide ampliar la representacin de manera que estos nuevos factores queden reflejados y las</p> <p>consultas anteriores sigan funcionando y produciendo planes factibles.</p> <p>i) En el inicio de cada ruta, se supone que el depsito est lleno de combustible.</p> <p>ii) La capacidad del depsito de combustible estar definida por un hecho que deber ser especificado en la base de hechos.</p> <p>iii) Un plan se considera factible si el vehculo tiene combustible suficiente para llegar al destino.</p> <p>iv) nicamente se pide especificar las reglas y hechos que cambian respecto al apartado anterior.</p> <p>Solucin:</p> <p>(defglobal ?*preferencia-maxima* = 10000)</p> <p>;-------------------------------------------</p> <p>;- Inserta todas las rutas directas con el</p> <p>;- origen y destino invertidos </p> <p>;-------------------------------------------</p> <p>(defrule simetrica</p> <p>(declare (salience ?*preferencia-maxima*))</p> <p>(rutaDirecta ?orig ?dest $?resto)</p> <p>=&gt;</p> <p>(assert (rutaDirecta ?dest ?orig $?resto))</p> <p>)</p> <p>;-------------------------------------------</p> <p>;- Detecta la consulta "ir a" y comienza a</p> <p>;- construir la ruta</p> <p>;-------------------------------------------</p> <p>(defrule ir_desde_origen</p> <p>(ir ?origen ?destino)</p> <p>(rutaDirecta ?origen ?dest ?)</p> <p>=&gt;</p> <p>(assert (ruta ?origen ?dest))</p> <p>)</p> <p>;-------------------------------------------</p> <p>;- Expande todas las rutas con los destinos</p> <p>;- directos accesibles</p> <p>;-------------------------------------------</p> <p>(defrule expande_ruta_sin_duplicar</p> <p>(ruta $?previo ?final)</p> <p>(rutaDirecta ?final ?dest ?)</p> <p>(test (not (member$ ?dest $?previo)))</p> <p>=&gt;</p> <p>(assert (ruta $?previo ?final ?dest))</p> <p>)</p> <p>;-------------------------------------------</p> <p>;- Cuando existe un ruta en el que la</p> <p>;- ltima ciudad sea el destino de la</p> <p>;- consulta, se crea un nuevo hecho solucin</p> <p>;- para marcar esta ruta como solucin</p> <p>;-------------------------------------------</p> <p>(defrule solucion</p> <p>?nruta </p> <p>(retract ?nruta)</p> <p>(assert (solucion $?lista ?destino))</p> <p>)</p> <p>;-------------------------------------------</p> <p>;- Imprime la ruta con la solucin</p> <p>;-------------------------------------------</p> <p>(defrule imprime_solucion</p> <p>(solucion $?lista)</p> <p>=&gt;</p> <p>(printout t "-&gt; Solucion: " $?lista crlf)</p> <p>)</p> <p>b)</p> <p>Slo se muestran las reglas que cambian:</p> <p>;-------------------------------------------</p> <p>;- Hechos iniciales para el depsito de</p> <p>;- combustible</p> <p>;-------------------------------------------</p> <p>(deffacts combustible</p> <p>(capacidad_deposito 35)</p> <p>(consumo 0.05) </p> <p>)</p> <p>;-------------------------------------------</p> <p>;- Detecta la consulta "ir" y cominenza a</p> <p>;- construir la ruta</p> <p>;- Descuenta el consumo del trayecto al</p> <p>;- depsito, que es el ltimo valor en la</p> <p>;- ruta.</p> <p>;-------------------------------------------</p> <p>(defrule ir_desde_origen</p> <p>(ir ?origen ?destino)</p> <p>(rutaDirecta ?origen ?dest ?dist)</p> <p>(capacidad_deposito ?cap)</p> <p>(consumo ?cons)</p> <p>(test (&gt;= ?cap (* ?dist ?cons)))</p> <p>=&gt;</p> <p>(assert (ruta ?origen ?dest (- ?cap (* ?dist ?cons))))</p> <p>)</p> <p>;-------------------------------------------</p> <p>;- Expande todas las rutas con los destinos</p> <p>;- directos accesibles. Recalcula</p> <p>;- el consumo de combustible</p> <p>;-------------------------------------------</p> <p>(defrule expande_ruta_sin_duplicar</p> <p>(ruta $?previo ?final ?deposito)</p> <p>(rutaDirecta ?final ?dest ?dist)</p> <p>(consumo ?cons)</p> <p>(test (not (member$ ?dest $?previo)))</p> <p>(test (&gt;= ?deposito (* ?dist ?cons)))</p> <p>=&gt;</p> <p>(assert (ruta $?previo ?final ?dest (- ?deposito (* ?dist ?cons))))</p> <p>)</p> <p>;-------------------------------------------</p> <p>;- Cuando existe un ruta en el que la</p> <p>;- ltima ciudad sea el destino de la</p> <p>;- consulta, se crea un nuevo hecho solucin</p> <p>;- para marcar esta ruta como solucin</p> <p>;-------------------------------------------</p> <p>(defrule solucion</p> <p>?nruta </p> <p>(retract ?nruta)</p> <p>(assert (solucion $?lista ?destino ?deposito))</p> <p>)</p> <p>;-------------------------------------------</p> <p>;- Imprime la ruta con la solucin</p> <p>;-------------------------------------------</p> <p>(defrule imprime_solucion</p> <p>(solucion $?lista ?deposito)</p> <p>=&gt;</p> <p>(printout t "-&gt; Solucion: " $?lista crlf)</p> <p>(printout t "-&gt; Deposito: " ?deposito crlf)</p> <p>)</p> <p>- A continuacin presentamos un ejemplo de tarea propia de la audiologa clnica. El perfil de un paciente se caracteriza por un conjunto de hallazgos V1V8 que se obtiene a partir de observaciones de los pacientes (desde la observacin de la edad de paciente de 65 aos se obtiene el hallazgo V1:edad&gt;60): </p> <p>hallzs.Descripcin</p> <p>V1edad&gt;60</p> <p>V2air = mild </p> <p>V3history = noise </p> <p>V4speech = poor</p> <p>V5tympan = a</p> <p>V6acoustic_ref_c = elevated </p> <p>V7acoustic_ref_u = elevated</p> <p>V8o_acoustic_ref_c = elevated</p> <p>Los diferentes diagnsticos posibles son los expresados en la siguiente tabla:</p> <p>Diags.Descripcin</p> <p>SA1 age-induced cochlear with otitis media</p> <p>SA2 age and noise-induced cochlear</p> <p>SA3 noise-induced cochlear</p> <p>SA4 age-induced cochlear</p> <p>SA5 normal ear ( norm)</p> <p>SA6 acoustic neuroma</p> <p>SA7 cochlear</p> <p>SA8 mixed</p> <p>SA9 otitis media</p> <p>SA10 possible menieres</p> <p>SA11 bells palsy</p> <p>Los hallazgos sugieren diferentes posibles diagnsticos (V sugiere SA), como se observa en la siguiente tabla:</p> <p>hallzsDiags.</p> <p>V1SA1, SA2, SA4, SA9</p> <p>V2SA6, SA7, SA9</p> <p>V3SA2, SA3</p> <p>V4SA7, SA8</p> <p>V5SA5, SA7</p> <p>V6SA8, SA10</p> <p>V7SA4, SA9</p> <p>V8SA7, SA8, SA11</p> <p>Aqu se reduce pues el conjunto de diagnsticos posibles, pero solamente con esta tabla no se designa un nico diagnstico como solucin. Para conseguir un diagnstico ms preciso, en primer lugar, se suman todas las ocurrencias de cada SA en la tabla de equiparaciones (por ejemplo cochlear SA7 tiene 4 ocurrencias). A continuacin, cada SA como subcategora hereda adems los puntos de las categoras genricas a que pertenece, (por ejemplo, age-induced cochlear hereda de cochlear, age-induced cochlear with otitis media hereda de otitis media). Por ejemplo, si se da V1 entonces se sugiere SA1, SA2, SA4 y SA9. Como SA4 y SA9 refuerzan SA1, sta queda con 3 puntos. Mientras que SA2 queda con 2 puntos. As, la solucin puntuada en primer lugar sera age-induced cochlear with otitis media. Esta fase del diagnstico, por tanto, concluira con las hiptesis ms valoradas (o la ms valorada) como solucin.</p> <p>Se pide una implementacin en Clips para este diagnstico.</p> <p>Solucin:</p> <p>; Se puede hacer de una forma mas ortodoxa, sin variable global y sin modificacin de los hechos tabla-refuerzos-diagnosticos, por ejemplo, pero esta solucin es bastante sencilla.(defglobal ?*contador-diagnosticos* = 0)(deftemplate datos-paciente</p> <p>(slot id-paciente (type INTEGER))</p> <p>(slot edad (type INTEGER))</p> <p>)</p> <p>(deftemplate datos-pruebas-paciente</p> <p>(slot id-paciente (type INTEGER))</p> <p>(slot variable (type SYMBOL))</p> <p>(slot valor (type STRING))</p> <p>)</p> <p>(deftemplate hallazgo</p> <p>(slot id-hallazgo (type SYMBOL))</p> <p>(slot variable (type SYMBOL))</p> <p>(slot operador (type STRING))</p> <p>(slot valor (type STRING))</p> <p>)</p> <p>(deftemplate diagnostico</p> <p>(slot id-diagnostico (type SYMBOL))</p> <p>(slot descripcion (type STRING))</p> <p>)</p> <p>(deftemplate refuerza</p> <p>(slot diagnostico-G (type SYMBOL))</p> <p>(slot diagnostico-E (type SYMBOL))</p> <p>(slot hecho (type SYMBOL) (allowed-values NO SI) (default NO))</p> <p>)</p> <p>(deftemplate hallazgo-paciente</p> <p>(slot id-paciente (type INTEGER))</p> <p>(slot hallazgo (type SYMBOL))</p> <p>)</p> <p>(deftemplate hallazgo-diagnostico</p> <p>(slot id-hallazgo (type SYMBOL))</p> <p>(slot diagnostico (type SYMBOL))</p> <p>)</p> <p>(deftemplate diagnostico-paciente</p> <p>(slot id-paciente (type INTEGER))</p> <p>(slot diagnostico (type SYMBOL))</p> <p>(slot contador (type INTEGER) (default 1))</p> <p>)</p> <p>(deftemplate lista-aux-diagnosticos</p> <p>(multislot diagnosticos (type SYMBOL))</p> <p>)</p> <p>; afirmamos los hallazgos como hechos</p> <p>(deffacts tabla-hallazgos</p> <p>(hallazgo (id-hallazgo V1) (variable edad) (operador "&gt;") (valor "65"))</p> <p>(hallazgo (id-hallazgo V2) (variable air) (operador "=") (valor "mild"))</p> <p>(hallazgo (id-hallazgo V3) (variable history) (operador "=") (valor "noise"))</p> <p>(hallazgo (id-hallazgo V4) (variable speech) (operador "=") (valor "poor"))</p> <p>(hallazgo (id-hallazgo V5) (variable tympan) (operador "=") (valor "a"))</p> <p>(hallazgo (id-hallazgo V6) (variable acoustic_ref_c) (operador "=") (valor "elevated"))</p> <p>(hallazgo (id-hallazgo V7) (variable acoustic_ref_u) (operador "=") (valor "elevated"))</p> <p>(hallazgo (id-hallazgo V8) (variable o_acoustic_ref_c) (operador "=") (valor "elevated"))</p> <p>)</p> <p>(deffacts tabla-diagnosticos</p> <p>(diagnostico (id-diagnostico SA1) (descripcion "age-induced cochlear with otitis media"))</p> <p>(diagnostico (id-diagnostico SA2) (descripcion "age and noise-induced cochlear"))</p> <p>(diagnostico (id-diagnostico SA3) (descripcion "noise-induced cochlear"))</p> <p>(diagnostico (id-diagnostico SA4) (descripcion "age-induced cochlear"))</p> <p>(diagnostico (id-diagnostico SA5) (descripcion "normal ear"))</p> <p>(diagnostico (id-diagnostico SA6) (descripcion "acoustic neuroma"))</p> <p>(diagnostico (id-diagnostico SA7) (descripcion "cochlear"))</p> <p>(diagnostico (id-diagnostico SA8) (descripcion "mixed"))</p> <p>(diagnostico (id-diagnostico SA9) (descripcion "otitis media") )</p> <p>(diagnostico (id-diagnostico SA10) (descripcion "possible menieres") )</p> <p>(diagnostico (id-diagnostico SA11) (descripcion "bells palsy"))</p> <p>)</p> <p>(deffacts tabla-hallazgos-diagnosticos</p> <p>(hallazgo-diagnostico (id-hallazgo V1) (diagnostico SA1))</p> <p>(hallazgo-diagnostico (id-hallazgo V1) (diagnostico SA2))</p> <p>(hallazgo-diagnostico (id-hallazgo V1) (diagnostico SA4))</p> <p>(hallazgo-diagnostico (id-hallazgo V1) (diagnostico SA9))</p> <p>(hallazgo-diagnostico (id-hallazgo V2) (diagnostico SA6))</p> <p> (hallazgo-diagnostico (id-hallazgo V2) (diagnostico SA7))</p> <p>(hallazgo-diagnostico (id-hallazgo V2) (diagnostico SA9))</p> <p>(hallazgo-diagnostico (id-hallazgo V3) (diagnostico SA2))</p> <p>(hallazgo-diagnostico (id-hallazgo V3) (diagnostico SA3))</p> <p>(hallazgo-diagnostico (id-hallazgo V4) (diagnostico SA7)) </p> <p>(hallazgo-diagnostico (id-hallazgo V4) (diagnostico SA8))</p> <p>(hallazgo-diagnostico (id-hallazgo V5) (diagnostico SA5))</p> <p> (hallazgo-diagnostico (id-hallazgo V5) (diagnostico SA7))</p> <p>(hallazgo-diagnostico (id-hallazgo V6) (diagnostico SA8)) </p> <p>(hallazgo-diagnostico (id-hallazgo V6) (diagnostico SA10))</p> <p>(hallazgo-diagnostico (id-hallazgo V7) (diagnostico SA4))</p> <p>(hallazgo-diagnostico (id-hallazgo V7) (diagnostico SA9))</p> <p>(hallazgo-diagnostico (id-hallazgo V8) (diagnostico SA7))</p> <p> (hallazgo-diagnostico (id-hallazgo V8) (diagnostico SA8))</p> <p>(hallazgo-diagnostico (id-hallazgo V8) (diagnostico SA11))</p> <p>)</p> <p>(deffacts tabla-refuerzos-diagnosticos</p> <p>(refuerza (diagnostico-G SA3) (diagnostico-E SA2))</p> <p>(refuerza (diagnostico-G SA4) (diagnostico-E SA1))</p> <p>(refuerza (diagnostico-G SA4) (diagnostico-E SA2))</p> <p>(refuerza (diagnostico-G SA7) (diagnostico-E SA3))</p> <p>(refuerza (diagnostico-G SA7) (diagnostico-E SA4))</p> <p>(refuerza (diagnostico-G SA9) (diagnostico-E SA1))</p> <p>)</p> <p>; los resultados de la exploracin podran introducirse por teclado, preguntando al usuario por ejemplo, o desde una </p> <p>; base de datos. Asumimos que los tenemos disponibles como hechos segn la definicin de los anteriores templates</p> <p>(deffacts datos-del-paciente</p> <p>(datos-paciente (id-paciente 23) (edad 66))</p> <p>; por simplificacin, los datos del paciente entran en este hecho. </p> <p>; Logicamente, al menos, habra que aadir una regla para introducirlos por teclado.</p> <p>(datos-pruebas-paciente (id-paciente 23) (variable air) (valor "other"))</p> <p>(datos-pruebas-paciente (id-paciente 23) (variable history) (valor "other"))</p> <p>(datos-pruebas-paciente (id-paciente 23) (variable peech) (valor "other"))</p> <p>(datos-pruebas-paciente (id-paciente 23) (variable tympan) (valor "other"))</p> <p>(datos-pruebas-paciente (id-paciente 23) (variable acoustic_ref_c) (valor "other"))</p> <p>(datos-pruebas-paciente (id-paciente 23) (variable acoustic_ref_u) (valor "other"))</p> <p>(datos-pruebas-paciente (id-paciente 23) (variable o_acoustic_ref_c) (valor "other"))</p> <p>(contador-diagnosticos 0)</p> <p>)</p> <p>(deffacts datos-inferidos</p> <p>(lista-aux-diagnosticos (diagnosticos))</p> <p>)</p> <p>; reglas para abstraer los hallazgos desde los datos introducidos sobre los pacientes(defrule abstraer-hallazgos-V1</p> <p>(declare (salience 1000))</p> <p>(datos-paciente (id-paciente ?paciente) (edad ?edad&amp;:(&gt; ?edad 65)))</p> <p>=&gt;</p> <p>(assert (hallazgo-paciente (id-paci...</p>