FAQ-CLIPS
-
Upload
adriana-castillo -
Category
Documents
-
view
37 -
download
0
Transcript of FAQ-CLIPS
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 159
Intelligencia Artificial
CURS 20112012 1Q
FAQ de CLIPS
Departament de Llenguatges i Sistemes Informatics
Enginyeria en Informatica
cbea
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 259
This work is licensed under the Creative CommonsAttribution-NonCommercial-ShareAlike License cbea
To view a copy of this license visit httpcreativecommonsorglicensesby-nc-sa20 or send aletter to
Creative Commons559 Nathan Abbott Way StanfordCalifornia 94305USA
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 359
3
En la elaboracioacuten de este documento han intervenido
Javier Biosca Ruiacutez de OjedaJoseacute Camallonga GonzaacutelezJordi Chacoacuten ChacoacutenAdriagrave Figuera PuigMartiacute Forneacutes EstarellasDaniel Golobart CastelloteMarina GrigorevaBorja Jara Garciacutea
Brian Jimeacutenez GraciacuteaIgnacio Llatser MartiacuteVictor Lloveras DiacuteazIsaac Loacutepez AmatViacutector Martiacutenez JuradoLluiacutes Monsalve CarrasquillaEnric Munneacute HernaacutendezJorge Muntildeoz GamaIvan Navarro GonzaacutelezManuel Parrilla GutierrezMarcos Pereira Varela
Pere Sivecas GibertLluiacutes Suntildeol Juliachs
El responsable de la edicioacutencorreccioacutenampliacioacuten del documento es Javier Beacutejar Alonso (bejarlsiupcedu)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 459
Iacutendice general
1 Introduccioacuten 5
2 Protegravegegrave 721 Coacutemo cambiar el nombre de las instancias en Protegravegegrave 722 Com exporto una ontologia de Proteacutegeacute a CLIPS 723 iquestCoacutemo exporto una ontologiacutea de Proteacutegeacute a CLIPS (2a posibilidad) 724 Per quegrave em doacutena error CLIPS al tenir una instancia que hereta de meacutes drsquouna classe 8
3 CLIPS 931 Instalacioacuten del CLIPS 9
311 iquestCoacutemo instalar CLIPS 9312 Entorn finestres VS Consola de comandes 932 Los hechos 9
321 iquestQueacute es un hecho en CLIPS 9322 iquestQueacute es un hecho ordenado (order Facts) 10323 iquestQueacute es un hecho no ordenado (deftemplates facts) 10324 iquestPuedo tener un vector como slot 10325 iquestPuedo asignar propiedades a los slots 10326 iquestQueacute debo utilizar hechos ordenados o no ordenados 11327 Fets o Objectes 11328 Creacioacuten de hechos (assertdeffacts) 11
329 Modificar un fet 113210 Com elimino un fet de la base de fets 1233 Variables 13
331 Variables a CLIPS 13332 Com assignar un valor a una variable 13333 iquestCoacutemo declarar variables globales 13334 iquestCoacutemo trabajar con variables sumando restando por ejemplo contadores 13335 Quina diferegravencia hi ha entre les variables del tipus nom_variable i les del tipus
$nom_variable 13336 Quegrave significa lrsquointerrogant () quan va sol 13337 Quegrave significa el dogravelar ($) quan va sol 14
338 iquestComo puedo ver los hechos presentes en un momento determinado 1434 Las reglas 14
341 iquestCoacutemo construir una regla 14342 iquestCoacutemo gestionar la parte izquierda (LHS) de una regla 14343 iquestCoacutemo obtener la direccioacuten de hechos o instancias situados en LHS 15344 iquestCoacutemo hacer sentencias or en la izquierda de las reglas 16345 Com afegir una condicioacute a la part esquerre drsquouna regla 16346 Puede una misma regla ejecutarse maacutes de una vez 17347 Com puc definir lrsquoordre de les regles 17348 Com forccedilar que una regla sigui la primera 18349 Vull guardar certs valors que es fan servir durant lrsquoexecucioacute de diferents regles Com
ho puc fer 1835 Las clasesinstancias 19
351 Tengo que representar la jerarquiacutea de un frame iquestEs preferible antildeadir las subclases ala ontologiacutea o bien diferenciarlas mediante un slot en la superclase 19
1
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 559
2 Iacutendice general
352 iquestQueacute es un objeto 19353 iquestPorqueacute usar objetos en contexto de la praacutectica de CLIPS de IA 19354 Como se definen las clases 19355 Com consulto una instagravencia a partir drsquouna regla 20356 Tengo problemas en condiciones de reglas con slots de instancias obtenidos con send 21357 Tengo problemas con instancias obtenidas del slot de otra instancia en el patroacuten de
una regla 22358 iquestCoacutemo realizar una buacutesqueda de instancias que cumplan unas restricciones 22359 iquestCoacutemo se interactuacutea con objetos 233510 iquestComo se interactuacutea con las instancias de los objetos 243511 Uso de make-instance 243512 Como generar automaacuteticamente nombres de instancia 253513 Com fer un getset drsquoun slot drsquouna classe 253514 iquestCoacutemo acceder a una instancia cuyo nombre conocemos 253515 Obtenir el nom drsquouna classe 263516 Como convierto un INSTANCE-ADRESS en un INSTANCE-NAME 263517 Com iterar a traveacutes drsquoun multi-slot 263518 Coacutemo modificarinsertarborrar valores en un multislot 263519 Coacutemo recorrer un atributo multievaluado 273520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz) 273521 Com puc esborrar una instagravencia 283522 Com imprimir una instagravencia 283523 Com es navega entre instagravencies relacionades 29
36 Programacioacuten 29361 Com introduir un comentari 29362 Referenciar el valor null a CLIPS 29363 Formas de recorrer una lista 29
364 Formas de elegir una opcioacuten 30365 Funciones con la clase String 30366 iquestCoacutemo obtener el contenido de una variable en un string 31367 iquestComo se crea una lista 31368 iquestComo borro un elemento de una lista 31369 iquestComo inserto elementos en una lista 323610 iquestComo modifico elementos de una lista 323611 iquestComo averiguo el nuacutemero de elementos de una lista 323612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten 323613 iquestComo recorro todos los elementos de una lista 323614 Com trobar si un element forma part drsquouna llista 32
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot 323616 I si tinc un multislot i el vull transformar en un string 333617 iquestCoacutemo obtener un valor aleatorio 333618 Comparaciones 33
37 Los moacutedulos 33371 Quegrave eacutes un mogravedul en CLIPS 33372 Particioacuten en modulos 34373 iquestCoacutemo asignar una construccioacuten en un moacutedulo 34374 Com funcionen les clagraveusules export i import 34375 iquestCoacutemo cambio el moacutedulo actual 35
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS 3538 Funciones 36
381 iquestCoacutemo se crea una funcioacuten en CLIPS 36382 Explicacioacuten de la estructura de una funcioacuten en general 37
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 659
Iacutendice general 3
383 Com definir un paragravemetre drsquouna funcioacute com una llista 38384 Com puc utilitzar una funcioacute a la part esquerra de les regles 38
39 Entrada salida 38391 iquestCoacutemo se imprime por pantalla 38392 iquestAl imprimir por pantalla como hago un salto de liacutenea 39393 Com imprimeixo una liacutenia en blanc 39
394 Com llegir de la entrada standard 39395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeix
com un enter 40396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacute
drsquoentrada quants) com ho faig per assignar-los a un multislot 40310 Funciones uacutetiles 40
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles 403102 Obtener un valor numeacuterico comprendido en un rango 413103 Realizar una pregunta general 413104 iquestCoacutemo se realiza una pregunta binaria 413105 Encuentra la instancia con valor miacutenimo para un slot 41
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valor const 423107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li 433108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla 43
311 Ejecucioacuten de un programa CLIPS 433111 iquestCoacutemo cargamos un programa 433112 iquestCoacutemo probar tu coacutedigo en CLIPS 443113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten 443114 iquestCoacutemo parar una ejecucioacuten 443115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste 44
4 Consejos praacutecticos 45
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve no seacute ni per oncomenccedilar Algun consell 45
42 iquestComo estructuro una practica de CLIPS 4543 Com crear un flux de preguntes 46
431 Com puc ordenar aquest flux de preguntes 46432 I si vull saltar-me una pregunta 47433 Com inicialitzar el flux del programa 48
44 Uso de la funcioacuten modify para ir guardando resultados preferidos 4845 Creacioacuten de la plantilla de recomendacioacuten 49
5 Errores frecuentes 51
51 Quan obro un fitxer en CLIPS em dona un error 5152 Codificacioacute de caragravecters a CLIPS 5153 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots en Protegravegegrave cuando
las importo en CLIPS 5154 Tengo problemas con la hereacutencia de slots en las clases que he definido 5155 Quegrave significa lrsquoerror OBJRTBLD5 5256 Antes compilaba correctamente y ahora da warnings 5257 No puedo editar mi fichero en clips 5258 Redefining 5259 Problemas al consultar las instancias relacionadas con otras 52510 Unable to finde class X cuando definimos instancias 52
511 Expected the beginning of a construct (cuando definimos instancias) 53512 Compila pero no compara bien dos elementos 53513 Expected the beginning of a constructor 53514 Missing function declaration for defruledeffunction 53
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 759
4 Iacutendice general
515 Check appropiate syntax for ifswitchloop-for-count 54516 Problemas con pareacutentesis 54
6 Referencias 5561 On puc trobar informacioacute sobre el llenguatge CLIPS 5562 Otras referencias 55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 859
1 Introduccioacuten
Este documento es el resultado de la recopilacioacuten de los documentos escritos durante el desarrollo de lapraacutectica de sistemas basados en el conocimiento el cuatrimestre de otontildeo del curso 2007-2008
El objetivo de estos documentos era recoger las dudas frecuentes que se encuentra un alumno durante eldesarrollo de la praacutectica de SBCs y consejos praacutecticos que puedan ayudar en el desarrollo
Este documento recoge principalmente dudas frecuentes sobre el entorno CLIPS y su lenguaje de progra-macioacuten
5
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 959
6 Capiacutetulo 1 Introduccioacuten
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1059
2 Protegravegegrave
Para saber como funciona Protegravegegrave usad la ayuda de la aplicacioacuten y el material correspondiente estascuestiones se refieren a como integrar lo que se desarrolla en Protegravegegrave con CLIPS
21 Coacutemo cambiar el nombre de las instancias en Protegravegegrave
En realidad no se trata de cambiar el nombre de las instancias sino de darle algo maacutes visual que unnuacutemero para poder hacer las relaciones Si os encontraacuteis en la pestantildea de crear instancias el uacuteltimo botoacutenes una flecha hacia abajo Darle y luego set display slots Ahiacute debeacuteis indicar con que slot quereacuteis referenciarla instancia
22 Com exporto una ontologia de Proteacutegeacute a CLIPS
A Proteacutegeacute ves a File rarr Export to Format rarr CLIPS Un cop fet aixograve es crearan dos nous fitxers ambles classes i instagravencies de lrsquoontologia (nompont i nompins respectivament)
Despreacutes obre aquests dos fitxers amb un editor de text i copia el seu contingut al fitxer CLIPS de laseguumlent manera
copy-paste de nompont
(definstances instanciescopy-paste de nompins)
23 iquestCoacutemo exporto una ontologiacutea de Proteacutegeacute a CLIPS (2a posibilidad)
Alternativamente a hacer corta y pega de los ficheros de protege en el fichero de CLIPS se puede crearun fichero que cargue todos los ficheros sin tener que juntarlos
Para ello hay que crear un fichero que incluya las oacuterdenes de carga de los diferentes ficheros Por ejemplopodemos llamar a este fichero cargaclp El contenido de este fichero seraacute
(load PATHnompont)(load-instances PATHnompins)(load PATHfichero-de-reglasclp)
Donde PATH es el directorio donde se encuentran vuestros ficherosEste fichero se ha de cargar desde el inteacuterprete mediante la orden batch ((batch cargaclp)) o con
la opcioacuten de menuacute load batch Usando la instruccioacuten load-instances evitamos tener que antildeadir al fichero de instancias la instruccioacuten
definstances
24 Per quegrave em doacutena error CLIPS al tenir una instancia que hereta de meacutesdrsquouna classe
7
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1159
8 Capiacutetulo 2 Protegravegegrave
Proteacutegeacute permet lrsquoheregravencia muacuteltiple en instagravencies perograve CLIPS no En CLIPS nomeacutes poden tenir heregravenciamuacuteltiple las classes perograve no les instagravencies Aixoacute es aixiacute perque el lenguatge de CLIPS es orientat a objectesno es realment un lenguatge drsquoontologiacutees
La manera meacutes senzilla de simular-ho si les clases no tenen ancestres comuns eacutes tenir classes que repre-sentin aquesta heregravencia muacuteltiple i fer que les instagravencies pengin drsquoelles que es com es faria a un llenguatge
orientat a objectesEn el cas de tenir ancestres comuns no es pot fer lrsquounica manera es duplicar la instancia amb nomsdiferents i penjar-les de les clases on es vol tenir-la
De totes maneres el CLIPS permet recuperar fagravecilment les instagravencies que tenen un valor especiacutefic en unslot pel qual el meacutes senzill eacutes tenir una uacutenica jerarquia i incloure altres possibles classificacions com a slotsencara que obviament perdrem la posibilitat de fer servir una jerarquia de valors per aquest
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1259
3 CLIPS
31 Instalacioacuten del CLIPS
311 iquestCoacutemo instalar CLIPS
La herramienta CLIPS es multiplataforma y esta disponible para los tres SO maacutes utilizados MicrosoftWindows Linux y Mac OS X
iquestCoacutemo instalar CLIPS en Windows
Primero de todo debemos bajarnos el programa de la paacutegina oficial de CLIPS accesible desde este link
(httpclipsrulessourceforgenet) Desde el aacuterea de descarga os podreis bajar el instalador parawindows
iquestCoacutemo instalar CLIPS en Linux
En muchas distribuciones de Linux CLIPS esta disponible como un paquete adicional el paquete sueleinstalar la versioacuten con interfaz graacutefico Si no encuentras el paquete especiacutefico para la distribucion que usassiempre puedes compilarlo a partir del paquete con los fuentes
Tambieacuten estaacute la posibilidad de utilisar el emulador de windows WINE Una vez instalado el emulador sepuede instalar CLIPS y este funcionaacute igual que sobre windows
iquestCoacutemo instalar CLIPS en Mac OS X
Primero de todo debemos bajarnos el programa de la paacutegina oficial de CLIPS accesible desde este link(httpclipsrulessourceforgenet ) Desde el aacuterea de descarga podeis bajar el intalador para MACOS X
312 Entorn finestres VS Consola de comandes
Encara que lrsquoentorn de finestres eacutes molt meacutes intuiumltiu CLIPS a la seva versioacute en liacutenea de comandes eacutes moltmeacutes ragravepid (segurament perquegrave no ha de mostrar en tot moment lrsquoagenda de fets les instancies les regles
etc)La diferencia de velocitat eacutes molt notable en cas de problemes de rendiment o de sensacioacute que lrsquoentorn
de finestres es queda penjat (o directament es tanca sense previ aviacutes) recomanem provar la versioacute en liacuteneade comandes
32 Los hechos
321 iquestQueacute es un hecho en CLIPS
Conceptualmente un hecho representa un dato abstracto del cual almacenamos valores Se puede vercomo una lista de campos donde el primer campo hace referencia al ldquodatordquo al cual le asignamos una listade valores que le suceden teniendo una relacioacuten entre siacute
Formalmente el primer campo es un siacutembolo y los campos restantes son valores
9
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1359
10 Capiacutetulo 3 CLIPS
(siacutembolo valor1 valor2 valorN)
322 iquestQueacute es un hecho ordenado (order Facts)
Un hecho ordenado tienen formato libre por lo tanto no existe restriccioacuten alguna en el orden de los campos
Los campos de un hecho ordenado pueden ser de cualquier tipo primitivo de datos excepto el primero quedebe ser un siacutembolo Como ejemplo tenemos
1 (hermanos Antonio Javier Carlos)2 (padre Pedro David)
323 iquestQueacute es un hecho no ordenado (deftemplates facts)
A traveacutes de los hechos no ordenados podemos abstraernos de la estructura de un hecho asignado unnombre a cada campo (slots)
1 (deftemplate nombre-template comentario2 (slot nombre-slot (tipo-del-slot))3 (multislot nombre-slot (tipo-del-slot))4 )
Por ejemplo
1 (deftemplate avioacuten2 (slot nombre_avion (type STRING))3 (slot compania (type STRING))
4 (slot numero_plazas (type INTEGER) (default 100))
324 iquestPuedo tener un vector como slot
Si debe declararse como multislot
325 iquestPuedo asignar propiedades a los slots
Siacute las maacutes importantes son
Type El tipo de dato primitivo que contiene (en mayuacutesculas)
Allowed-X Permite especificar un conjunto de valores permitidos Siendo X un tipo de datos primitivo(en minuacutesculas y plural) rarr si el slot toma un valor del tipo X debe pertenecer a los valores permi-tidos X puede ser values especificando entonces todos los valores posibles que puede tomar el slotindependientemente del tipo de dato
Range Especifica un rango para slots numeacutericos
Cardinality Nuacutemeros miacutenimo y maacuteximo de elementos que puede tener un multislot
Default Valor por defecto Si ponemos NONE como valor por defecto significaraacute que no se podraacute crear la
instancia a no ser que se especifique el valor de ese slot
1 (deftemplate estudiante2 (slot edad (type INTEGER) (range 0 99))
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1459
32 Los hechos 11
3 (multislot asignaturas (type STRING) (cardinality 1 5))4 (slot num-carreres (default 1))5 (multislot notas (allowed-strings MH NP))6 )
326 iquestQueacute debo utilizar hechos ordenados o no ordenados
Como se puede intuir si tenemos un conjunto de hechos los cuales conceptualmente pertenecen al mismoaacutembito seraacute una solucioacuten maacutes elegante agruparlos a traveacutes de un deftemplate En caso que tengamos quealguacuten hecho aislado seraacute mas sencillo declararlo como un hecho ordenado
327 Fets o Objectes
Veient la definicioacute de deftemplate podem confondrersquons a lrsquohora de decidir si fer servir fets o fer servirobjectes
Deixant de banda altres diferegravencies ja comentades (les classes suporten jerarquia de classes heregravenciaetc) els objectes es fan servir per representar el coneixement (mitjanccedilant un conjunt drsquoinstagravencies)
Aixiacute que generalment farem servir classes i objectes per representar coneixement mentre que farem servirels fets per portar control sobre lrsquoexecucioacute del problema
Per exemple podriacuteem definir un deftemplate per emmagatzemar un resultat o per poder controlar lrsquoestatde lrsquoexecucioacute
A la pragravectica de Mikeo (penjada a la web de lrsquoassignatura) teniacuteem un deftemplate habitacion-actual
1 (deftemplate habitacion-actual2 (slot habitacion)3 (slot area-restante)4
(slot presupuesto-restante)5 (slot precio-total)6 (slot prioridad-actual)7 )
Amb el qual controlagravevem la construccioacute drsquouna habitacioacute Assignagravevem una instagravencia de la classe habita-cioacute al slot habitacion de habitacion-actual i mitjanccedilant una segraverie de regles que feien unificacioacute ambhabitacion-actual actuagravevem sobre lrsquohabitacioacute drsquouna manera o drsquoun altre
328 Creacioacuten de hechos (assertdeffacts)
Si queremos crear un solo hecho utilizaremos el comando assert Por ejemplo (assert (casa roja))Si por el contrario queremos crear una estructura ordenada de hechos utilizaremos deffacts
(deffacts mishechos (casa roja) (pelota azul))
329 Modificar un fet
Per modificar un fet (per exemple molt uacutetil si estem treballant amb deftemplates) ho podem fer mitjanccedilant(modify ltINSTANCIAgtltFETSgt)
Per exemple si tingueacutessim el deftemplate persona
1 (deftemplate persona2 (slot nom)3 (slot edad)4 (slot dni)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1559
12 Capiacutetulo 3 CLIPS
I hagueacutessim afegit el fet
(assert (persona (nom Pepe)(edad 25)(dni 46974431)))
I el fet
(assert (aniversari 46974431))
Podriacuteem tenir la seguumlent regla
1 (defrule aniv2 aniversari lt- (aniversari dni)3 persona lt- (persona (edat edat)(dni dni))4 =gt5 (retract aniversari)6 (modify persona (edat (+ 1 edat)))7 )
La qual srsquoactivaragrave si hi ha un fet aniversari drsquouna persona Fent servir el dni indicat al fet aniversaribusquem el fet persona que teacute el mateix dni Deixem el valor edat a la variable edat per poder treballaramb ella meacutes endavant
Hem agafat tambeacute la direccioacute del fet aniversari per tal de poder esborrar-lo de la base de fets Aixograve srsquohafet per dues raons
Primer per mantenir meacutes neta la base de fets Segon i meacutes important Com que hem canviat el fet laregla tornaragrave a fer unificacioacute amb el fet (perquegrave ara eacutes diferent) amb la regla aniversari amb el que entrariadintre drsquoun bucle sense fi on srsquoaniria incrementant lrsquoedat de la persona
Un cop hem esborrat el fet aniversari incrementem en 1 el valor del slot edat de la persona fent servirla variable edat que hem declarat a la part esquerre de la regla
El comportament de modify es fer un retract del fet a la base de fets i despreacutes fer un assert amb els nous
valors Si volem canviar mes drsquoun slot del fet es convenient canviar-los tots a la vegada La raoacute es que cadavegada que fem un modify lrsquoapuntador al fet es modifica i lrsquoapuntador que tenim a la variable que hem fetservir ja no es vagravelid
Si no temim mes remei que fer la modificacioacute del fet pas a pas srsquoha de saber que la crida a modify retornalrsquoapuntador al nou fet Si el guardem a altra variable (o a la mateixa) podrem continuar modificant el fetamb la nova referegravencia
3210 Com elimino un fet de la base de fets
Per eliminar un fet de la base de fets ho podem fer amb la paraula clau (retract ltFETgt) on ltFETgt eacutes
un punter al fetPer obtenir aquest fet ho podem fer fent servir ltVARgtlt- ltFETgt a la part esquerre de la reglaPer exemple
1 (defrule accionsvent2 vent lt- (vent tipus)3 =gt4 (switch tipus5 (case poc then (assert (accio persiana0)))6 (case normal then (assert (accio persiana50)))7 (case molt then (assert (accio persiana100)))8 )9 (retract vent)
10 )
Afegiragrave fets per realitzar les accions pertinents i esborraragrave el fet de la base de fets
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1659
33 Variables 13
33 Variables
331 Variables a CLIPS
No cal declarar una variable (ni el seu tipus) nomeacutes cal afegir un interrogant al comenccedilament drsquoun simbol
per indicar que eacutes una variableCLIPS srsquoencarrega del control de tipus depenent del que assignem a la variablePer exemple testvar correspondria a la variable testvar Si per exemple assigneacutessim lrsquoenter 3 a
testvar CLIPS tractaria la variable com una variable entera
332 Com assignar un valor a una variable
Per assignar un valor a una variable es fa servir el megravetode (bind) amb la forma
(bind ltVARIABLEgtltVALORgt)
On ltVALORgt pot ser un valor o un megravetode que retorni un valor Per exemple si volem assignar un 4 a lavariable var
(bind var 4)
O per exemple podriacuteem assignar a la variable var la suma de 2 meacutes 2
(bind var (+ 2 2))
333 iquestCoacutemo declarar variables globales
Para crear una variable global hay que meterla dentro de la construccioacuten defglobal La declaracioacuten de la
variable seguiraacute el modelo nombreVariable = expresioacutenPor ejemplo
(defglobal presupuesto = 0)
Pueden aparecer en la parte izquierda de las reglas si no son utilizadas para asignar un valor y su cambiono activa reglas pero no pueden ser paraacutemetros de funciones ni meacutetodos
334 iquestCoacutemo trabajar con variables sumando restando por ejemplo contadores
La mejor forma es con variables globales se definen asiacute (defglobal x = 0) puede ser el valor quequeramos tanto nuacutemero string Y si queremos sumarle 10 por ejemplo
(bind x (+ x 10))
Las variables locales como por ejemplo x soacutelo tienen valor mientras dura su ejecucioacuten y eso suele ser enesa misma liacutenea o en un bucle Si le damos valor a x y luego preguntamos por ella nos diraacute que no existe
335 Quina diferegravencia hi ha entre les variables del tipus nom_variable i les del tipus $nom_variable
Les primeres contenen un sol valor i les segones en poder contenir meacutes drsquoun (o cap)
336 Quegrave significa lrsquointerrogant () quan va sol
Eacutes una variable anogravenima Pots utilitzar sense posar-hi cap nom si no trsquointeressa el valor en concret Perexemple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1759
14 Capiacutetulo 3 CLIPS
(Primer filtre_preu )
Aquesta condicioacute significa ldquosi el fet (Primer filtre_preu) teacute algun valorrdquo O sigui que si tingueacutessimel fet (Primer filtre_preu ok) es compliria la condicioacute (i si en comptes de ldquookrdquo fos ldquopatatardquo tambeacute escompliria) En canvi si el fet fos uacutenicament (Primer filtre_preu) no es compliria la condicioacute
337 Quegrave significa el dogravelar ($) quan va sol
Eacutes com lrsquointerrogant perograve admet meacutes drsquoun valor Per exemple
(Primer filtre_preu $ ok)
donaragrave cert pels fets de lrsquoestil (Primer filtre_preu patata ok) (Primer filtre_preu hola ok)(Primer filtre_preu patata hola ok) (Primer filtre_preu ok) Eacutes a dir no importa els valors quehi hagi entre filtre_preu i ok si al final hi ha un ok
338 iquestComo puedo ver los hechos presentes en un momento determinado
Abriendo la Facts Window en Window de la barra de menuacute
34 Las reglas
341 iquestCoacutemo construir una regla
Para construir una regla utilizaremos la construccioacuten defrule
Sintaxis
(defrule ltnombre-reglagt [ltcomentariogt][ltdeclaracioacutengt]ltelemento-condicioacutengt Parte izquierda (LHS)
=gtltaccioacutengt) Parte dcha (RHS) de la regla
Una regla consta de un conjunto de condiciones (antecedente) tambieacuten denominados elementos condicio-nales (EC) o parte izquierda (LHS) y de un conjunto de acciones (consecuente) tambieacuten denominado partederecha de la regla (RHS) La regla se activaraacute siempre que se satisfagan todos los EC mediante hechos oinstancias que los cumplan
Si se introduce en la base de reglas una nueva regla con el mismo nombre que el de una existente la nuevaregla reemplazaraacute a la antigua
Si una regla no tiene parte izquierda es decir no tiene elementos condicionales entonces el hecho(initial-fact) actuaraacute como el elemento condicional para ese tipo de reglas y la regla se activaraacute cadavez que se ejecute un comando reset
342 iquestCoacutemo gestionar la parte izquierda (LHS) de una regla
Declarar hechosSi no se especifica ninguna condicioacuten la regla se activaraacute siempre Una condicioacuten puede ser un simple hecho
(Ej vegetariano) o un hecho ordenado con unos valores concretos (Ej (persona (nombre Juan))) Si loque queremos es obtener el valor de un hecho insertaremos una variable en su lugar (Ej (persona (nombre
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1859
34 Las reglas 15
n)) ) Entonces entraraacute en la regla para cada valor posible que pueda asignar a la variable n a partir delos hechos
Si queremos indicar cualquier valor utilizaremos el siacutembolo y para cualquier lista el siacutembolo $ (Ej(evento ) (estilo $) ) Tambieacuten existe la opcioacuten de guardar en una variable una referencia al objetoEllo se consigue poniendo var lt- a su izquierda (Ej p lt- (persona (nombre Juan))) Se puede usarpor ejemplo para pasaacuterselo de paraacutemetro a una funcioacuten llamada en la RHS
Establecer condiciones
Ademaacutes podemos especificar restricciones adicionales sobre los valores que puede tomar un campo de unhecho Existen tres tipos principales de restricciones Conectadas (por orden de precedencia o prioridad)
not (~) Evita que cierto campo cumpla determinada restriccioacuten
and (amp) Combina dos restricciones conjuntivamente
or (|) Combina dos restricciones disjuntivamente
De predicado () Obliga a que cierto campo cumpla determinada condicioacuten (especificada por el predicado)
Por valor devuelto por una funcioacuten = Permite llamar a una funcioacuten y utilizar el valor devuelto pararestringir el valor que pueda tomar un campo de un hecho
Se puede comprobar si se cumple una determinada condicioacuten mediante el constructor test Dentro detest se pueden hacer llamadas a cualquier funcioacuten o predicado ya sea primitiva de CLIPS o definidapor nosotros
Combinar elementos
Los diferentes elementos de la parte izquierda van impliacutecitamente unidos mediante una AND que indicaconjuncioacuten No obstante podemos hacerlo expliacutecitamente mediante (and (cond1) (cond2)) aunque suelen
utilizarse para anidar ANDs dentro de ORsOR Sirve para hacer una disyuncioacuten (or (cond1) (cond2)) Es equivalente a escribir varias reglas en lasque cada una de ellas tenga uno de los componentes del OR en su parte izquierda y la misma parte derecha
NOT Sirve para detectar si no existe un determinado hecho (Ej (not (estilo sibarita)))exists Cuando a un conjunto de elementos se le antecede exists se comprueba que hay al menos un
hecho en la base de hechos que cumpla la condicioacuten (Ej (exists(bebida precio (ltprecio 5))) )forall Permite comprobar si todos los hechos que satisfacen un determinado patroacuten cumplen una serie
de condiciones (Ej (forall(plato (estilo moderno)))
343 iquestCoacutemo obtener la direccioacuten de hechos o instancias situados en LHS
En algunas ocasiones vamos a necesitar realizar alguacuten tipo de accioacuten en la parte derecha de las reglassobre hechos o instancias que cumplan unas determinadas condiciones Pero para ello necesitaremos primerotener acceso a estos elementos para despueacutes poder operar sobre ellos Esto lo conseguiremos guardando ladireccioacuten del elemento en una variable hacieacutendolo del siguiente modo
variable_direccion lt- (elemento)
Pongamos un ejemplo para ver realmente el funcionamiento y uso de esta posibilidad que CLIPS nosofrece
1 (defrule imprime-area2 instancia lt- (object (is-a Rectangulo))3 =gt4 (printout t Area del rectangulo (instance-name instancia)5 (send instancia calcula-area) crlf)6 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1959
16 Capiacutetulo 3 CLIPS
Cuando se ejecuta esta regla se imprimiraacuten las aacutereas de todas las instancias de la clase Rectangulo Enla parte izquierda de la regla lo que hacemos es guardar en la variable instancia la direccioacuten de la instanciade Rectangulo que estamos tratando en ese momento La regla se ejecutaraacute para todas las instanciasalmacenadas en la memoria de trabajo que cumplan la condicioacuten (is-a Rectangulo) es decir para todaslas instancias de la clase Rectangulo En la parte derecha de la regla donde se ejecutan las acciones podemosver que se imprimiraacute para cada instancia lo siguiente Area del rectangulo [nombre_instancia] aacuterea
del rectaacutengulo La funcioacuten instance-name nos devuelve el nombre de la instancia que le pasamos porparaacutemetro Ademaacutes hemos llamado al gestor de mensajes calcula-area para que nos devuelva el area delrectaacutengulo
344 iquestCoacutemo hacer sentencias or en la izquierda de las reglas
Con (or ) Si por ejemplo tenemos dos hechos (a) y (b) y queremos ejecutar la derecha de la reglacuando se cumpla uno de los dos tendremos que hacer (or (a) (b)) Atencioacuten porque la parte derecha seejecutaraacute tantas veces como veces se cumpla cada uno de los hechos si para nosotros existe tanto (a) como(b) la parte derecha se ejecutaraacute dos veces Para que soacutelo se usa una vez podemos hacer combinaciones de
or y and (funciona igual) o usar un patroacuten por ejemplo (persona Juan|Pedro) soacutelo se ejecutariacutea una vez
345 Com afegir una condicioacute a la part esquerre drsquouna regla
A vegades eacutes necessari que una regla srsquoinstanciiuml si es produeix una condicioacute especial (i no un fet) Per feraixoacute farem servir la comanda (test ltCONDICIOgt)
Per exemple imaginem que la nostre base de fets compte amb un fet (preu valor) amb un preudeterminat Imaginem que volem una regla que srsquoinstanciiuml quan aquest valor eacutes meacutes gran que 30
Per fer-ho fent servir tot el que hem explicat
1 (defrule preucar2 (preu preu)3 (test (gt preu 30))4 =gt5 (printout t El preu es mes gran que 30)6 )
Eacutes a dir si el preu eacutes meacutes gran que 30 srsquoimprimiragrave un missatge per pantallaAquestes condicions poden contenir ANDs i ORs de varies condicionsPer exemple
1 (defrule preulimit2 (preu preu)3 factminim lt- (preuminim minim)4 factmax lt- (preumaxim maxim)5 (test (and (gt preu minim) (lt preu maxim) ))6 =gt7 (retract factminim)8 (retract factmax)9 (printout t El preu estagrave dintre del rang)
On comprovarem si el preu estagrave dintre drsquoun rang determinat i en aquest cas esborra els fets que contenen
el magravexim preu i el miacutenim preu i mostra un missatge per pantalla
346 Puede una misma regla ejecutarse maacutes de una vez
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2059
34 Las reglas 17
Es muy importante entender que cada regla se ejecutaraacute una vez por cada combinacioacuten de valores en suLHS
1 (defrule regla2 (color col)3 (peso pes)4 =gt5
Si tengo tres colores y dos pesos asertados la regla se ejecutaraacute 6 veces una con cada combinacioacuten decolor y peso
347 Com puc definir lrsquoordre de les regles
La idea drsquoun sistema basant en regles eacutes no definir un ordre lineal drsquoaquestes (costa deixar de pensar de
forma iterativa)En el cas de necessitar que una regla srsquoexecuti despreacutes drsquouna altre pots fer servir Fets la regla anteriorcrea un fet que la segona regla tindragrave a la part esquerra
1 (defrule pregunta12 =gt3 (assert (pregunta1Feta))4 5 )6
7 (defrule pregunta2
8 (pregunta1Feta)9 =gt
10 11 )
I finalment pots usar la propietat salience Aquesta propietat indica la prioritat drsquoexecucioacute de les regles( les regles amb salience majors srsquoexecutaran abans ) Pot prendre valors positius i negatius entre -10000 y+10000 Per defecte les regles tenen salience 0
1 (defrule pregunta12 (declare (salience 2))3 =gt4 5 )6
7 (defrule pregunta28 (declare (salience 1))9 =gt
10 11 )
El valor indicado en la propiedad salience puede ser el nuacutemero directamente o una expresioacuten por ejemplovariable10 podemos usar variable para elegir que regla se ejecutaraacute
Las prioridades deben ser usadas solo para determinar el orden en el que se disparan algunas reglas sobreotras no para fijar el flujo de control ya que la principal ventaja de un sistema basado en reglas es larepresentacioacuten declarativa del conocimiento y de esta forma abusando de las prioridades conduce a unsistema procedimental
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2159
18 Capiacutetulo 3 CLIPS
348 Com forccedilar que una regla sigui la primera
Per que aquesta regla sigui la primera ha de tenir el salience meacutes gran de totes
1 (defrule presentacio2 (declare (salience 20))3 =gt4 (printout t ------ Benvingut ----- crlf)5 )
349 Vull guardar certs valors que es fan servir durant lrsquoexecucioacute de diferents regles Com hopuc fer
Tens principalment dues alternatives Si el valor eacutes un tipus bagravesic pots fer servir una variable global ambla sintaxi seguumlent
(defglobal nom_variable = valor)
Aquesta sentegravencia no va a dins de cap funcioacute ni regla es posa sola a la part que creguis convenient delcodi Vegem un exemple
(defglobal preu_minim_primer = 1000)
Per fer-la servir es fa exactament de la mateixa manera que amb una variable normal perograve has de posarels dos asteriscs Per exemple
(bind preu_minim_primer curr-preu)
Per altra banda si el valor o valors que vols guardar han de ser instagravencies una bona estrategravegia pot serutilitzar un deftemplate Eacutes uacutetil sobretot per anar guardant solucions temporals o llistes drsquoelements quepoden formar part de la solucioacute
Per utilitzar-ho has de seguir els passos seguumlents
1 Definir el deftemplate
(deftemplate nom_del_deftemplate(multislot nom_multislot)
(slot nom_slot)
)
Amb un exemple es veuragrave meacutes clar
(deftemplate llista-plats(multislot primers)(multislot segons)(multislot postres)
)
2 Inicialitzar el deftemplate
(defrule[condicions vagraveries] La condicioacute base eacutes que llista-plats no srsquoha inicialitzat encara
(not (llista-plats))=gt
llista conteacute els valors de llista-plats (que de moment estan buits)(bind llista (assert (llista-plats)))
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2259
35 Las clasesinstancias 19
3 Assignar-li valors
(bind segons_plats (find-all-instances ((plat Plat)) TRUE)(modify llista (segons segons_plats))
4 Recuperar els valors
(defrule[condicions vagraveries]llista lt- (llista-plats (segons $segons_plats))
=gt
Ara la variable $segons_plats conteacute tots els elements de segons
35 Las clasesinstancias
351 Tengo que representar la jerarquiacutea de un frame iquestEs preferible antildeadir las subclases a laontologiacutea o bien diferenciarlas mediante un slot en la superclase
Las dos formas son vaacutelidas pero es recomendable representarlas en clases separadas cuando se vayan abuscar instancias de ese tipo ya que asiacute no tendremos que hacer un recorrido por todas las de la superclaseNo obstante si soacutelo se trata de una caracteriacutestica puntual del frame y no vamos a hacer buacutesquedas de unaexclusiva subclase entonces seraacute maacutes eficiente antildeadir un slot debido a su mejor accesibilidad
352 iquestQueacute es un objeto
Podriacuteamos decir que un objeto es un hecho no ordenado con herencia
353 iquestPorqueacute usar objetos en contexto de la praacutectica de CLIPS de IA
Como bien sabemos una parte de la praacutectica de SBCrsquos consisten en crear la ontologiacutea Esta ontologiacutease exporta para poder interactuar con CLIPS en formato pins y pont El archivo pont contendraacute ladeclaracioacuten de todas las clases creadas previamente por Protege (defclass ) El archivo pins contendraacute
todas las instancias de las clases declaradas en el archivo pont Como puede intuir el lector se necesitaraacuteinteractuar con los objetos previamente creados por Protegravegegrave
354 Como se definen las clases
Para definir las clases usaremos el constructor defclass
(defclass ltnombregt [ltcomentariogt](is-a ltnombre-de-superclasegt)[(role concrete | abstract)]
[(pattern-match reactive | non-reactive)]ltslotgt definicioacuten de los atributos de la clase
ltdocumentacioacuten-handlergt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2359
20 Capiacutetulo 3 CLIPS
En caso de desear que la nueva clase herede las propiedades de otra ya existente el nombre de esta deberaacuteespecificarse despues de is-a El rol determinaraacute si la clase es concreta (se puede instanciar) o abstracta(destinada a ser superclase) El pattern-match debe declararse como reactivo si se desea que las instanciasde la clase puedan unificar con los elementos objeto de las reglas (siacutembolo lt-) Los slots correspondena los atributos de la clase y los handlers a las funciones de eacutesta Los handlers se pueden declarar en ladeclaracioacuten de la propia clase pero se deben definir externamente Dado que no aporta ninguna ventaja
declararlos es recomendable definirlos directamente Noacutetese que todo aquello que estaacute entre corchetes ([])constituye informacioacuten adicional que no es obligatorio especificar
1 (defclass Persona2 (is-a Ser_Vivo)3 (role concrete)4 (single-slot edad5 (type INTEGER)6 (range 1 99)7 (cardinality 0 1)8 (create-accessor read-write)9 )
10 (multislot amigos11 (type INSTANCE)12 (allowed-classes Persona)13 )14 )
El comportamiento y declaracioacuten de los slots es ideacutentico al de los slots de los hechos ordenados Losatributos de tipo INSTANCE (referencian otras instancias) estan en formato INSTANCE-NAME
355 Com consulto una instagravencia a partir drsquouna regla
Podem fer servir la part esquerre drsquouna regla per trobar instagravencies Lrsquouacutes eacutes molt semblant a trobar elpunter a un fet fent servir
(object [(is-a ltNOM_CLASSEgt)|(name ltNOM_INSTANCIA)|(ltNOM-SLOTgt ltVALORVARIABLE))])
Per exemple si volem que una regla srsquoinstanciiuml si tenim instanciat un plat de la classe Plat podriem ferservir
1 (defrule tenimplat2 plat lt- (object (is-a Plat))3 =gt4 (print t (send plat get-nom) crlf)
La regla imprimiragrave el nom del plat que trobi Eacutes important notar que srsquoactivaragrave per cada instagravencia de platque tinguem a la base de coneixement
Podem consultar els valors de la instancia fent servir condicions a la part esquerre de la regla Per exemplesi nomeacutes volgueacutessim els plats amb un preu meacutes gran que 30
1 (defrule platCar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Srsquoactivaragrave per tots els plats amb un preu major a 30
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2459
35 Las clasesinstancias 21
Srsquoha drsquoanar amb cura per aquest tipus de regla ja que si la base de coneixement eacutes molt amplia pot acabarderivant amb problemes de memograveria
Per exemple si en comptes de preguntar per una instagravencia de Plat pregunteacutessim per dues instancies dePlat
1 (defrule platsCars2 plat1 lt- (object (is-a Plat) (Preu p1))3 plat2 lt- (object (is-a Plat) (Preu p2))4 (test (gt p1 30))5 (test (gt p2 30))6 =gt7 (print t (send plat1 get-nom) i (send plat1 get-nom) soacuten cars8 crlf)9 )
Faria unificacioacute amb totes les combinacions possibles (amb repeticions) de dos plats de tota la base deconeixement Aixograve es podria anar ampliant fins fer-se intractable
Si tenim drsquoalguna manera el nom de la instancia podem fer
1 (defrule platPicant2 (cuina (plat p))3 (object (name p) (picant pi))4 =gt5 (print t picant pi crlf)6 )
Aixoacute es pot servir per crear condicions que facin servir noms drsquoinstancies que tenim almacenats a slotsdrsquoaltres instancies per exemple
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send v get-Preu) crlf)6 )
Aquesta regla imprimiria el preu del vi asociat al plat si es negre
356 Tengo problemas en condiciones de reglas con slots de instancias obtenidos con send
A veces dan problemas las reglas en las que las condiciones sobre los valores de los slots de una instanciase escriben usando mensajes get sobre los atributos de una instancia en lugar de utilizar patrones paraobtenerlos por ejemplo la regla
1 (defrule platcar2 plat lt- (object (is-a Plat) )3 (test (gt (send plat get-Preu) 30))4 =gt5 (print t (send plat get-nom) es car6 crlf)7 )
No funciona correctamente en CLIPS pero la regla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2559
22 Capiacutetulo 3 CLIPS
1 (defrule platcar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Siacute lo haceEn el caso de que el valor del slot sea booleano se puede escribir la regla como
1 (defrule platpicant2 plat lt- (object (is-a Plat) (Picant TRUE))3 =gt4 (print t (send plat get-nom) es picant crlf)
En el caso de que el slot sea a su vez una instancia se puede utilizar para obtener los valores de estainstancia en la condicion como se explica en la pregunta anterior
357 Tengo problemas con instancias obtenidas del slot de otra instancia en el patroacuten de unaregla
Este problema aparece cuando el patron de una regla instancia una variable a un nombre de instancia yesta no esta definida en el modulo de la regla por ejemplo si la regla siguiente pertenece a un modulo queno es el de la instancia
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4
=gt5 (print t preu (send v get-Preu) crlf)6 )
La regla se quejaraacute de que la instancia no existe al enviarle el send ya que solo se busca la instancia dentrodel moacutedulo de la regla y no en los importados Para arreglar esto se puede usar la funcioacuten (instance-address[ltMODULOgt|] ltINSTANCIAgt) que busca la direccion de la instancia en un modulo concreto o en todos losmoacutedulos que se importan () Deberiacuteamos entonces escribir la regla
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send (instance-address v) get-Preu) crlf)6 )
358 iquestCoacutemo realizar una buacutesqueda de instancias que cumplan unas restricciones
CLIPS nos ofrece varias funciones de buacutesqueda de instancias que cumplan unas determinadas restriccionesque a nosotros nos interese
La funcioacuten find-instance Esta funcioacuten devuelve la primera instancia que cumple todas las restric-ciones indicadas
La funcioacuten find-all-instances Esta funcioacuten devuelve todas las instancias que cumplen las restric-ciones indicadas
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2659
35 Las clasesinstancias 23
La sintaxis de ambas funciones es igual exceptuando el nombre de la funcioacuten(find-all-instances (clase_instancias) (restricciones))A continuacioacuten se muestran varios ejemplos
(bind rectangulos (find-all-instances ((inst Rectangulo)) (gtinstaltura 10))) Des-pueacutes de ejecutar esta funcioacuten en la variable rectangulos habraacute una lista con todas las instancias de la
clase Rectangulo cuya altura sea superior a 10(bind rectangulos (find-all-instances ((inst Rectangulo)) (and (gtinstaltura 10) (=instanchura 7)))) Este trozo de coacutedigo hace que en la variable rectangulos se guarde una listade las instancias de la clase Rectangulo que tienen una altura superior a 10 y una anchura igual a 7
Estas funciones que CLIPS nos ofrece tienen otra funcionalidad y es que podemos realizar buacutesquedas deconjuntos de instancias
(bind rectangulos (find-all-instances ((a Rectangulo) (b Rectangulo)) (= aalturabaltura))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas de instancias de laclase Rectangulo que tienen la misma altura
Por uacuteltimo es necesario comentar que se pueden realizar buacutesquedas de conjuntos de instancias que seande distintas clases
(bind figuras (find-all-instances ((rect Rectangulo) (circ Circulo)) (= rectalturacircradio))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas ltrectangulocirculogtque cumplan que la altura del rectaacutengulo sea igual al radio del ciacuterculo
Existen maacutes comandos para obtener instancias pero son menos utilizadas a nivel baacutesico como pueden serany-instancep do-for-instance do-for-all-instances y delayed-do-for-all-instances
359 iquestCoacutemo se interactuacutea con objetos
La interaccioacuten con objetos se efectuacutea mediante lo que se denomina mensaje
(defmessage-handlerltnombre-clasegtltnombre-mensajegt[lttipo-handlergt] [ltcomentariogt]ltparaacutemetrogt [ltparaacutemetro-comodiacutengt])ltaccioacutengt
)
Un gestor de mensajes consta de 7 partes
1 Nombre de clase a la que el gestor estaraacute asociado
2 Nombre del mensaje
3 Tipo de gestor (Nosotros habitualmente usaremos primary que viene por defecto)
4 Comentario (opcional)
5 Lista de paraacutemetros6 Paraacutemetro comodiacuten (para gestionar muacuteltiples paraacutemetros)
7 Secuencia de acciones o expresiones que seraacuten ejecutadas por el gestor
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2759
24 Capiacutetulo 3 CLIPS
Enfocado a la praacutectica de CLIPS la maacutes comuacuten es que queramos interactuar con objetos para
1 Imprimir los objetos Un ejemplo
1 (defmessage-handler avion imprimir-beneficio ()
2 Para implementar funciones calculadas asociadas al objeto Un ejemplo
1 (defmessage-handler avion calcular-beneficio ()2 ( selfplazas-ocupadas selfprecio-billete))3 )
Como se puede observar el paraacutemetro impliacutecito self contiene la instancia activa para este mensaje
3510 iquestComo se interactuacutea con las instancias de los objetos
Podremos interactuar entre las instancias de los objetos mediante la funcioacuten send
(send ltexpresioacuten-de-objetogtltnombre-de-mensajegtltexpresioacutengt)Donde se toman como argumentos el objeto destino del mensaje el mensaje mismo y otros paraacutemetros
que debieran ser pasados a los gestoresParticularmente en el aacutembito de la praacutectica usualmente necesitaremos utilizar el envioacute de mensajes de
tipo get put and delete Estos mensajes tiene la siguiente sintaxis
get-ltnombre-atributogt
put-ltnombre-atributogt
delete
Aquiacute tenemos un ejemplo de como utilizarlo recordando que ponemos entre corchetes la instancia la cualse enviacutea el mensaje
(defclass avion (is-a USER)(role concrete)(slot precio-billete (create-accessor read) (default 34))(slot plazas-ocupadas (create-accessor write) (default 0)))
Clase creada
gt(make-instance a of avion) Creacioacuten de una instancia de avion[a]
gt(send [a] get-precio-billete) Obtencioacuten de un slot34 Resultado obtenidogt(send [a] put-plazas-ocupadas 100) Modificacioacuten de un slotgt(send [a] delete) Eliminacioacuten de la instanciaTrue
3511 Uso de make-instance
Cuando queremos crear una instancia de una clase para ir rellenandola con los resultados o datos quevayamos obteniendo se haria lo siguiente
(bind variable_instancia (make-instance nombre_instancia of nombre_clase))
Una vez creada podemos jugar con dicha instancia en las diferentes reglas siempre que la llamemos enlos activadores
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2859
35 Las clasesinstancias 25
(defrule reglavar_instancia lt- (object (is-a nombre_clase))=gt
)
De esta manera dentro de la regla podemos hacer acciones con la instancia por ejemplo(send var_instancia put-articulo articulo_ejemplo)
3512 Como generar automaacuteticamente nombres de instancia
En ocasiones queremos crear instancias en reglas y queremos que su nombre sea distinto del de otrasque ya tenemos Para ello podemos utilizar las funciones gensym y gensym La primera genera un siacutembolodel estilo genN donde N es un nuacutemero La segunda hace lo mismo pero aseguraacutendose de que ese siacutembolono exista ya Se puede reiniciar el contador que usan estas dos funciones con el operador (setgen ltnumgt)donde ltnumgt es el nuacutemero por el que queremos que empiecen ahora los siacutembolos
Para usar esto para generar el nombre de una instancia podemos hacer
(make-instance (gensym) of ltclasegt)
Cada vez que se ejecute se generaraacute un nombre de instancia nuevoSi creamos instancias de diferentes clases y queremos que las instancias tengan nombres que podamos
identificar podemos concatenar siacutembolos a los siacutembolos generados por gensym por ejemplo
(make-instance (sym-cat pepe- (gensym)) of ltclasegt)
generaraacute una instancia con el nombre pepe-genN
3513 Com fer un getset drsquoun slot drsquouna classe
Per consultar el valor drsquoun slot drsquouna classe ho podem fer enviant-li un missatge de la seguumlent manera
(send ltVARIABLEgt get-ltNOM_ATRIBUTgt)
Per exemple si tenim una instagravencia de la classe Plat ( instancia ) i volem saber el valor del seu slotnom
(send instancia get-nom)
Per assignar un valor a un slot drsquouna drsquoinstagravencia hem drsquoenviar-li un missatge de la seguumlent manera
(send ltVARIABLEgt put-ltNOM_ATRIBUTgt ltVALORgt)On ltVALORgt pot ser un valor o un megravetode que retorni un valor
(send instancia put-nom nom)
3514 iquestCoacutemo acceder a una instancia cuyo nombre conocemos
Si conocemos el nombre de una instancia y necesitamos acceder a ella es decir necesitamos enviarle alguacutenmensaje mediante la funcioacuten send podemos hacerlo directamente escribiendo en lugar de la variable quealmacena la instancia el nombre de la instancia entre corchetes [ ] A continuacioacuten se muestra un ejemplo
(bind altura_rect1 (send [rect1] get-altura))
En este caso se guardaraacute en la variable altura_rect1 el valor de la altura de la instancia que tiene comonombre rect1
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2959
26 Capiacutetulo 3 CLIPS
3515 Obtenir el nom drsquouna classe
Si tenim una instagravencia drsquouna classe i volem saber el nom de la classe (uacutetil si tenim una bona taxonomiade classes) ho podem fer amb el megravetode (class ltINSTANCIAgt)
Si per exemple imaginem que tenim la classe Actor la qual teacute com subclasses la classe APrincipalASecundari i ACameo Imaginem que estem tractant amb instancies drsquoactors i volem saber si la instanciaque estem tractant es de la classe APrincipal
Ho hauriacuteem de fer de la seguumlent manera
(eq (class instancia) APrincipal)
Fixem-nos que APrincipal eacutes un siacutembol no un String (un truco eacutes fixar-se en que no teacute cometes) Si vol-gueacutessim comparar-ho amb un String (per exemple un String introduiumlt per lrsquousuari) ho podriacuteem transformara un String amb el megravetode str-cat
(eq (str-cat (class instancia)) Principal)
3516 Como convierto un INSTANCE-ADRESS en un INSTANCE-NAME
En alguacuten momento nos podemos encontrar con la situacioacuten de que disponemos de un puntero a unainstancia y necesitamos su nombre o lo contrario En ambos casos podemos usar la funcioacuten instance-nameSu funcionamiento es bidireccional podemos introducirle un instance-name y nos devolveraacute un instance-adress y viceversa
1 (defrule imprimir-nombre2 estlt-(object (is-a Estudiante) (edad 25))3 =gt4 (printout t (instance-name est) crlf)5
)
3517 Com iterar a traveacutes drsquoun multi-slot
El seguumlent tambeacute eacutes vagravelid com exemple de com iterar a traveacutes drsquouna llistaImaginem que tenim una instagravencia de la classe Plat a la varible (plat) la qual teacute un multi-slot drsquoinstagravencies
de la classe Ingredient Imaginem que volem imprimir per pantalla el nom drsquoaquests ingredients (slot nomde la classe Ingredient) Necessitarem iterar sobre la llista drsquoingredients
1 (bind i 1)2 (while (lt= i (length$ (send plat get-ingredients)))3 do4 (bind ingredient (nth$ i (send plat get-ingredients)))5 (printout t (send ingredient get-nom) crlf)6 (bind i (+ i 1))7 )
El megravetode (nth$ ltINDEXgtltLLISTAgt) et retorna lrsquoelement situat a INDEX de LLISTAEl megravetode (length$ ltLLISTAgt) retorna el nuacutemero drsquoelements de LLISTA
3518 Coacutemo modificarinsertarborrar valores en un multislot
Los valores de un multislot se pueden cambiar usando la funcioacuten slot-replace$ La sintaxis es la siguiente
(slot-replace$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt ltvalorgt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3059
35 Las clasesinstancias 27
Donde ltiniciogt y ltfingt son el rango de posiciones del multislot que se quiere modificar y ltvalorgtson los valores que queremos reemplazar Obviamente deberaacute haber tantos valores como posiciones hayamosindicado en el rango
Para insertar nuevos valores podemos usar la funcioacuten slot-insert$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltposgt ltvalorgt)
El valor se inserta delante de la posicioacuten indicada si la posicioacuten es mayor que la longitud del multislot secolocaraacute al final
Para borrar elementos de un multislot podemos usar la funcioacuten slot-delete$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt)
Se borraraacuten los elementos que estaacuten en el rango indicado
3519 Coacutemo recorrer un atributo multievaluado
Supongamos que la variable respuesta tiene una lista de instancias
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 aquiacute hacemos lo que queramos4 )5 )
Loop-for-count funciona como un for primero la variable que haraacute de contador luego el valor de origeny luego el valor final Para controlar el final usamos la funcioacuten que he explicado antes i tomaraacute valoresdesde 1 hasta n asiacute que usando la funcioacuten nth$ obtendremos cada uno de los elementos La variable auxiraacute teniendo cada uno de los valores
3520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz)
Es igual que antes pero con dos bucles
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 (bind aux2 (send aux get-slot_que_queremos))4 (loop-for-count (j 1 (length$ aux2)) do5 (bind aux_final (nth$ j aux2))6 aquiacute ya podemos trabajar con el elemento en concreto7 )8 )
Supongamos que respuesta tiene una lista de instancias con el primer bucle haremos lo mismo que antes ir
iterando por esas instancias Una vez que tenemos cada instancia con aux2 con el segundo bucle iteraremosdentro de sus instancias interiores
Por ejemplo si tenemos varios equipos de fuacutetbol y cada equipo tiene varios jugadores en el primer bucleestamos iterando entre los equipos y en el segundo entre los jugadores de cada equipo en particular
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3159
28 Capiacutetulo 3 CLIPS
3521 Com puc esborrar una instagravencia
Per esborrar una instagravencia (per exemple segons la informacioacute que proporcioni lrsquousuari podem deduir queuna segraverie drsquoinstagravencies eacutes impossible que es facin servir per a la solucioacute) ho podem fer enviant un missatgedelete a la instagravencia eacutes a dir (send ltINSTANCIAgtdelete)
(send inst delete)
Un megravetode que podria ser uacutetil de la cara a la pragravectica podria ser el seguumlent
1 (defrule elimina-instancia2 (declare (salience 10))3 elimina-fact lt- (elimina-inst inst)4 =gt5 (send inst delete)6 (retract elimina-fact)
Imaginem que per exemple que volem eliminar una llista drsquoinstagravencies Per eliminar-les podriacuteem recoacuterrerel llistat marcant les instagravencies que volem esborrar afegint el seguumlent fet
(assert (elimina-instancia inst))
Aixiacute com que elimina-instancia teacute un salience alt esborraria les instagravencies marcades quan tingueacutes ocasioacuteDrsquoaquesta manera ens estalviem el problema de recoacuterrer un llistat drsquoinstagravencies amb un iterador mentre
anem eliminant els elements de la llista cosa que pot donar problemes amb lrsquoiterador
3522 Com imprimir una instagravencia
Per imprimir una classe (uacutetil per exemple per mostrar el resultat final) el millor eacutes definir message-handlersPer exemple imaginem que tenim una classe Plat la qual teacute un slot nom de tipus String Si volgueacutessimimprimir per pantalla un missatge que digueacutes
El nom del plat eacutes ndashltnom del platgtndash
Hauriacuteem de definir un message-handler que simplement imprimiacutes per pantalla el valor de lrsquoslot de laforma
(defmesssage-handler ltCLASSNAMEgt ltMESSAGENAMEgt primary ()ltCODIgt
)
Per el cas de lrsquoexemple
1 (defmessage-handler Plat print primary ()2 (printout t -- selfnom --) )3 )
Per cridar-ho nomeacutes caldragrave enviar-li un missatge a la instagravencia amb el nom del message-handler (enaquest cas print)
(send instancia print)
Un message-handler pot cridar a altres message-handlers amb el que es poden encadenar diverses instagraven-cies Per exemple imaginem que tenim la classe Menuacute la qual teacute un atribut plats que eacutes un llista drsquoinstagravenciesde la classe Plat Dintre del message-handler menuacute podriacuteem iterar a traveacutes de la llista de plats enviant elmissatge print que hem definit anteriorment
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3259
36 Programacioacuten 29
3523 Com es navega entre instagravencies relacionades
Per exemple tinc una instagravencia iA que teacute un slot anomenat slotB que eacutes una instagravencia drsquoun frame B Vullsaber el nom de la instagravencia associada al slotB de iA Ho pots fer aixiacute
(bind B (send iA get-slotB))(bind res (send B get-nom))
Si estagraves dins drsquouna condicioacute ho pots simplificar de la forma seguumlent
(bind res (send iAslotB get-nom)
Els dos punts soacuten equivalents al punt de Java
36 Programacioacuten
361 Com introduir un comentari
Els comentaris a CLIPS va darrere de un com per exemple
Comentari
Tambeacute podem afegir comentaris a les nostres regles deffacts deftemplates etc Generalment van darrereel nom de la estructura per exemple
1 (defrule neteja regla per la qual si la cuina estagrave bruta srsquoafegiragrave una tasca de2 neteja
3 (estat-cuina bruta)4 =gt5 (assert (tasca netejar))6 )
362 Referenciar el valor null a CLIPS
Per referenciar el valor null a clips es fa amb el simbol nil Per exemple si volem saber si una instagravenciainst es null ho podriacuteem fer de la seguumlent manera
(eq inst nil)
363 Formas de recorrer una lista
Para recorrer una lista disponemos de diferentes opciones en este FAQ explicaremos como crear unaestructura tipo ldquoWHILErdquo y tipo ldquoFORrdquo
1 While Esta regla se ejecuta hasta que la expresioacuten a evaluar sea falsa Este tipo de estructura se rigepor seguir la sintaxis while - do y se construiriacutea de la siguiente forma
(while ltexpresioacutengt[do] ltaccioacutengt)
Doacutende dependiendo del valor de ltexpresioacutengt
Valor TRUE Se realizaraacute la accioacuten ltaccioacutengt i se volveraacute a evaluar ltexpresioacutengt
Valor FALSE No se ejecutaraacute la accioacuten ltaccioacutengt
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3359
30 Capiacutetulo 3 CLIPS
2 For Esta regla sirve para ejecutar un bucle N (final - inicio) veces Este tipo de estructura se rige porseguir la sintaxis loop-for-count y se construiriacutea de la siguiente forma
(loop-for-count (ltvargtltiniciogtltfinalgt) [do] ltaccioacutengt)
Doacutende
ltvargt Variable que se usara como iacutendice
ltiniciogt Valor inicial que tendraacute ltvargt
ltfinalgt Ultimo valor que tendraacute la variable ltvargt
ltaccioacutengt Accioacuten que es realizaraacute hasta que ltvargt tenga el valor de ltfingt
364 Formas de elegir una opcioacuten
En este apartado explicaremos como crear una estructura if y una estructura switch
If Este tipo de estructura se rige por seguir la sintaxis if - then - else y se construiriacutea de lasiguiente forma
(if ltexpresioacutengtthen ltaccioacutengt[else ltaccioacuten2gt])
Doacutende dependiendo del valor de ltexpresioacutengt
bull Valor TRUE Se realizaraacute la accioacuten ltaccioacutengtbull Valor FALSE Se realizaraacute la accioacuten ltaccioacuten2gt (en caso de haber)
Switch Este tipo de estructura se rige por seguir la sintaxis switch - opciones y se construiriacutea dela siguiente forma
(switch ltexpresioacuten-testgt(case OPCION1 then ACCION1)(case OPCION2 then ACCION2)
([default] ACCION-DEFAULT)
)
Doacutende dependiendo del valor de ltexpresioacuten-casegt se ejecutaraacute una ltaccioacutengt en particular Si nin-guna ltopcioacutengt es correcta se ejecutara la ltaccioacuten-defaultgt
365 Funciones con la clase String
Habitualmente trabajaremos con Strings o cadena de Strings CLIPS proporciona una serie de herramien-tas para trabajar con esta clase
1 Convertir string a MAYUacuteSCULAS A veces es conveniente tener todos los caracteres en mayuacutesculaspara no tener problemas de comparaciones o simplemente por convenio Para ello CLIPS dispone dela funcioacuten upcase la cual convierte a mayuacutesculas un siacutembolo o string
(upcase ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplos
(upcase Ccedillips es divertido) rarr CcedilLIPS ES DIVERTIDO
(upcase Clips_es_divertido) rarr CLIPS_ES_DIVERTIDO
2 Convertir string a MINUacuteSCULAS la funcioacuten es downcase
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3459
36 Programacioacuten 31
3 Concatenacioacuten de strings Tambieacuten es de gran utilidad poder juntar dos o maacutes paraacutemetros en un solostring Todo paraacutemetro a juntar deben ser de uno de los siguientes tipos symbol String integer floato instance-name
(str-cat parametro1 parametro2 parametroN )
Ejemplo
(str-cat IA nota 10) rarr IAnota10
4 Comparacioacuten de strings Funcioacuten que nos indica si dos strings son iguales
(str-compareltexpresioacuten-simboacutelica-o-de-cadenagtltexpresioacuten-simboacutelica-o-de-cadenagt
)
Esta funcioacuten devuelve
0 Si ambos strings son iguales1 Si el primer string es mayor que el segundo string-1 Si el primer string es menor que el segundo string
5 Longitud de un string Muchas veces es de gran utilidad saber que tamantildeo tiene un string
(str-length ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplo
(str-length Inteligencia Artificial) rarr 23
366 iquestCoacutemo obtener el contenido de una variable en un string
Para conseguir un string a partir de un integer float symbol instance-name debes utilizar el comandostr-cat Si a la funcioacuten le pasamos como paraacutemetros varios elementos los transformaraacute a string y losconcatenaraacute La sintaxis de esta funcioacuten es la siguiente (str-cat elementos) Esta funcioacuten la usaremossobre todo cuando queramos realizar comparaciones entre el contenido de una variable y un string ya quepreviamente necesitaremos usar la funcioacuten str-cat para pasar el contenido de la variable a string y realizarde este modo la comparacioacuten de forma correcta
367 iquestComo se crea una lista
Con create$ Todos los operadores sobre listas llevan el siacutembolo $ al final Igual que con las variables sedebe usar bind siempre que se desee modificar una lista
(bind lista (create$ a b c))
368 iquestComo borro un elemento de una lista
Con delete$Usa la siguiente sintaxis(delete$ ltlistagt ltindice-iniciogt ltindice-finalgt)Se borraraacuten todos los elementos del rango entre las posiciones inicio y final ambas incluidas Tambieacuten exis-
tedelete-member$ (delete-member$ ltlistagt ltelementogt) Borraraacute todas las apariciones del elemento enla lista
(delete$ (create$ a b c d e f) 3 5) minusrarr (a b f)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 259
This work is licensed under the Creative CommonsAttribution-NonCommercial-ShareAlike License cbea
To view a copy of this license visit httpcreativecommonsorglicensesby-nc-sa20 or send aletter to
Creative Commons559 Nathan Abbott Way StanfordCalifornia 94305USA
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 359
3
En la elaboracioacuten de este documento han intervenido
Javier Biosca Ruiacutez de OjedaJoseacute Camallonga GonzaacutelezJordi Chacoacuten ChacoacutenAdriagrave Figuera PuigMartiacute Forneacutes EstarellasDaniel Golobart CastelloteMarina GrigorevaBorja Jara Garciacutea
Brian Jimeacutenez GraciacuteaIgnacio Llatser MartiacuteVictor Lloveras DiacuteazIsaac Loacutepez AmatViacutector Martiacutenez JuradoLluiacutes Monsalve CarrasquillaEnric Munneacute HernaacutendezJorge Muntildeoz GamaIvan Navarro GonzaacutelezManuel Parrilla GutierrezMarcos Pereira Varela
Pere Sivecas GibertLluiacutes Suntildeol Juliachs
El responsable de la edicioacutencorreccioacutenampliacioacuten del documento es Javier Beacutejar Alonso (bejarlsiupcedu)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 459
Iacutendice general
1 Introduccioacuten 5
2 Protegravegegrave 721 Coacutemo cambiar el nombre de las instancias en Protegravegegrave 722 Com exporto una ontologia de Proteacutegeacute a CLIPS 723 iquestCoacutemo exporto una ontologiacutea de Proteacutegeacute a CLIPS (2a posibilidad) 724 Per quegrave em doacutena error CLIPS al tenir una instancia que hereta de meacutes drsquouna classe 8
3 CLIPS 931 Instalacioacuten del CLIPS 9
311 iquestCoacutemo instalar CLIPS 9312 Entorn finestres VS Consola de comandes 932 Los hechos 9
321 iquestQueacute es un hecho en CLIPS 9322 iquestQueacute es un hecho ordenado (order Facts) 10323 iquestQueacute es un hecho no ordenado (deftemplates facts) 10324 iquestPuedo tener un vector como slot 10325 iquestPuedo asignar propiedades a los slots 10326 iquestQueacute debo utilizar hechos ordenados o no ordenados 11327 Fets o Objectes 11328 Creacioacuten de hechos (assertdeffacts) 11
329 Modificar un fet 113210 Com elimino un fet de la base de fets 1233 Variables 13
331 Variables a CLIPS 13332 Com assignar un valor a una variable 13333 iquestCoacutemo declarar variables globales 13334 iquestCoacutemo trabajar con variables sumando restando por ejemplo contadores 13335 Quina diferegravencia hi ha entre les variables del tipus nom_variable i les del tipus
$nom_variable 13336 Quegrave significa lrsquointerrogant () quan va sol 13337 Quegrave significa el dogravelar ($) quan va sol 14
338 iquestComo puedo ver los hechos presentes en un momento determinado 1434 Las reglas 14
341 iquestCoacutemo construir una regla 14342 iquestCoacutemo gestionar la parte izquierda (LHS) de una regla 14343 iquestCoacutemo obtener la direccioacuten de hechos o instancias situados en LHS 15344 iquestCoacutemo hacer sentencias or en la izquierda de las reglas 16345 Com afegir una condicioacute a la part esquerre drsquouna regla 16346 Puede una misma regla ejecutarse maacutes de una vez 17347 Com puc definir lrsquoordre de les regles 17348 Com forccedilar que una regla sigui la primera 18349 Vull guardar certs valors que es fan servir durant lrsquoexecucioacute de diferents regles Com
ho puc fer 1835 Las clasesinstancias 19
351 Tengo que representar la jerarquiacutea de un frame iquestEs preferible antildeadir las subclases ala ontologiacutea o bien diferenciarlas mediante un slot en la superclase 19
1
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 559
2 Iacutendice general
352 iquestQueacute es un objeto 19353 iquestPorqueacute usar objetos en contexto de la praacutectica de CLIPS de IA 19354 Como se definen las clases 19355 Com consulto una instagravencia a partir drsquouna regla 20356 Tengo problemas en condiciones de reglas con slots de instancias obtenidos con send 21357 Tengo problemas con instancias obtenidas del slot de otra instancia en el patroacuten de
una regla 22358 iquestCoacutemo realizar una buacutesqueda de instancias que cumplan unas restricciones 22359 iquestCoacutemo se interactuacutea con objetos 233510 iquestComo se interactuacutea con las instancias de los objetos 243511 Uso de make-instance 243512 Como generar automaacuteticamente nombres de instancia 253513 Com fer un getset drsquoun slot drsquouna classe 253514 iquestCoacutemo acceder a una instancia cuyo nombre conocemos 253515 Obtenir el nom drsquouna classe 263516 Como convierto un INSTANCE-ADRESS en un INSTANCE-NAME 263517 Com iterar a traveacutes drsquoun multi-slot 263518 Coacutemo modificarinsertarborrar valores en un multislot 263519 Coacutemo recorrer un atributo multievaluado 273520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz) 273521 Com puc esborrar una instagravencia 283522 Com imprimir una instagravencia 283523 Com es navega entre instagravencies relacionades 29
36 Programacioacuten 29361 Com introduir un comentari 29362 Referenciar el valor null a CLIPS 29363 Formas de recorrer una lista 29
364 Formas de elegir una opcioacuten 30365 Funciones con la clase String 30366 iquestCoacutemo obtener el contenido de una variable en un string 31367 iquestComo se crea una lista 31368 iquestComo borro un elemento de una lista 31369 iquestComo inserto elementos en una lista 323610 iquestComo modifico elementos de una lista 323611 iquestComo averiguo el nuacutemero de elementos de una lista 323612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten 323613 iquestComo recorro todos los elementos de una lista 323614 Com trobar si un element forma part drsquouna llista 32
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot 323616 I si tinc un multislot i el vull transformar en un string 333617 iquestCoacutemo obtener un valor aleatorio 333618 Comparaciones 33
37 Los moacutedulos 33371 Quegrave eacutes un mogravedul en CLIPS 33372 Particioacuten en modulos 34373 iquestCoacutemo asignar una construccioacuten en un moacutedulo 34374 Com funcionen les clagraveusules export i import 34375 iquestCoacutemo cambio el moacutedulo actual 35
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS 3538 Funciones 36
381 iquestCoacutemo se crea una funcioacuten en CLIPS 36382 Explicacioacuten de la estructura de una funcioacuten en general 37
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 659
Iacutendice general 3
383 Com definir un paragravemetre drsquouna funcioacute com una llista 38384 Com puc utilitzar una funcioacute a la part esquerra de les regles 38
39 Entrada salida 38391 iquestCoacutemo se imprime por pantalla 38392 iquestAl imprimir por pantalla como hago un salto de liacutenea 39393 Com imprimeixo una liacutenia en blanc 39
394 Com llegir de la entrada standard 39395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeix
com un enter 40396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacute
drsquoentrada quants) com ho faig per assignar-los a un multislot 40310 Funciones uacutetiles 40
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles 403102 Obtener un valor numeacuterico comprendido en un rango 413103 Realizar una pregunta general 413104 iquestCoacutemo se realiza una pregunta binaria 413105 Encuentra la instancia con valor miacutenimo para un slot 41
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valor const 423107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li 433108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla 43
311 Ejecucioacuten de un programa CLIPS 433111 iquestCoacutemo cargamos un programa 433112 iquestCoacutemo probar tu coacutedigo en CLIPS 443113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten 443114 iquestCoacutemo parar una ejecucioacuten 443115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste 44
4 Consejos praacutecticos 45
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve no seacute ni per oncomenccedilar Algun consell 45
42 iquestComo estructuro una practica de CLIPS 4543 Com crear un flux de preguntes 46
431 Com puc ordenar aquest flux de preguntes 46432 I si vull saltar-me una pregunta 47433 Com inicialitzar el flux del programa 48
44 Uso de la funcioacuten modify para ir guardando resultados preferidos 4845 Creacioacuten de la plantilla de recomendacioacuten 49
5 Errores frecuentes 51
51 Quan obro un fitxer en CLIPS em dona un error 5152 Codificacioacute de caragravecters a CLIPS 5153 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots en Protegravegegrave cuando
las importo en CLIPS 5154 Tengo problemas con la hereacutencia de slots en las clases que he definido 5155 Quegrave significa lrsquoerror OBJRTBLD5 5256 Antes compilaba correctamente y ahora da warnings 5257 No puedo editar mi fichero en clips 5258 Redefining 5259 Problemas al consultar las instancias relacionadas con otras 52510 Unable to finde class X cuando definimos instancias 52
511 Expected the beginning of a construct (cuando definimos instancias) 53512 Compila pero no compara bien dos elementos 53513 Expected the beginning of a constructor 53514 Missing function declaration for defruledeffunction 53
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 759
4 Iacutendice general
515 Check appropiate syntax for ifswitchloop-for-count 54516 Problemas con pareacutentesis 54
6 Referencias 5561 On puc trobar informacioacute sobre el llenguatge CLIPS 5562 Otras referencias 55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 859
1 Introduccioacuten
Este documento es el resultado de la recopilacioacuten de los documentos escritos durante el desarrollo de lapraacutectica de sistemas basados en el conocimiento el cuatrimestre de otontildeo del curso 2007-2008
El objetivo de estos documentos era recoger las dudas frecuentes que se encuentra un alumno durante eldesarrollo de la praacutectica de SBCs y consejos praacutecticos que puedan ayudar en el desarrollo
Este documento recoge principalmente dudas frecuentes sobre el entorno CLIPS y su lenguaje de progra-macioacuten
5
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 959
6 Capiacutetulo 1 Introduccioacuten
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1059
2 Protegravegegrave
Para saber como funciona Protegravegegrave usad la ayuda de la aplicacioacuten y el material correspondiente estascuestiones se refieren a como integrar lo que se desarrolla en Protegravegegrave con CLIPS
21 Coacutemo cambiar el nombre de las instancias en Protegravegegrave
En realidad no se trata de cambiar el nombre de las instancias sino de darle algo maacutes visual que unnuacutemero para poder hacer las relaciones Si os encontraacuteis en la pestantildea de crear instancias el uacuteltimo botoacutenes una flecha hacia abajo Darle y luego set display slots Ahiacute debeacuteis indicar con que slot quereacuteis referenciarla instancia
22 Com exporto una ontologia de Proteacutegeacute a CLIPS
A Proteacutegeacute ves a File rarr Export to Format rarr CLIPS Un cop fet aixograve es crearan dos nous fitxers ambles classes i instagravencies de lrsquoontologia (nompont i nompins respectivament)
Despreacutes obre aquests dos fitxers amb un editor de text i copia el seu contingut al fitxer CLIPS de laseguumlent manera
copy-paste de nompont
(definstances instanciescopy-paste de nompins)
23 iquestCoacutemo exporto una ontologiacutea de Proteacutegeacute a CLIPS (2a posibilidad)
Alternativamente a hacer corta y pega de los ficheros de protege en el fichero de CLIPS se puede crearun fichero que cargue todos los ficheros sin tener que juntarlos
Para ello hay que crear un fichero que incluya las oacuterdenes de carga de los diferentes ficheros Por ejemplopodemos llamar a este fichero cargaclp El contenido de este fichero seraacute
(load PATHnompont)(load-instances PATHnompins)(load PATHfichero-de-reglasclp)
Donde PATH es el directorio donde se encuentran vuestros ficherosEste fichero se ha de cargar desde el inteacuterprete mediante la orden batch ((batch cargaclp)) o con
la opcioacuten de menuacute load batch Usando la instruccioacuten load-instances evitamos tener que antildeadir al fichero de instancias la instruccioacuten
definstances
24 Per quegrave em doacutena error CLIPS al tenir una instancia que hereta de meacutesdrsquouna classe
7
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1159
8 Capiacutetulo 2 Protegravegegrave
Proteacutegeacute permet lrsquoheregravencia muacuteltiple en instagravencies perograve CLIPS no En CLIPS nomeacutes poden tenir heregravenciamuacuteltiple las classes perograve no les instagravencies Aixoacute es aixiacute perque el lenguatge de CLIPS es orientat a objectesno es realment un lenguatge drsquoontologiacutees
La manera meacutes senzilla de simular-ho si les clases no tenen ancestres comuns eacutes tenir classes que repre-sentin aquesta heregravencia muacuteltiple i fer que les instagravencies pengin drsquoelles que es com es faria a un llenguatge
orientat a objectesEn el cas de tenir ancestres comuns no es pot fer lrsquounica manera es duplicar la instancia amb nomsdiferents i penjar-les de les clases on es vol tenir-la
De totes maneres el CLIPS permet recuperar fagravecilment les instagravencies que tenen un valor especiacutefic en unslot pel qual el meacutes senzill eacutes tenir una uacutenica jerarquia i incloure altres possibles classificacions com a slotsencara que obviament perdrem la posibilitat de fer servir una jerarquia de valors per aquest
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1259
3 CLIPS
31 Instalacioacuten del CLIPS
311 iquestCoacutemo instalar CLIPS
La herramienta CLIPS es multiplataforma y esta disponible para los tres SO maacutes utilizados MicrosoftWindows Linux y Mac OS X
iquestCoacutemo instalar CLIPS en Windows
Primero de todo debemos bajarnos el programa de la paacutegina oficial de CLIPS accesible desde este link
(httpclipsrulessourceforgenet) Desde el aacuterea de descarga os podreis bajar el instalador parawindows
iquestCoacutemo instalar CLIPS en Linux
En muchas distribuciones de Linux CLIPS esta disponible como un paquete adicional el paquete sueleinstalar la versioacuten con interfaz graacutefico Si no encuentras el paquete especiacutefico para la distribucion que usassiempre puedes compilarlo a partir del paquete con los fuentes
Tambieacuten estaacute la posibilidad de utilisar el emulador de windows WINE Una vez instalado el emulador sepuede instalar CLIPS y este funcionaacute igual que sobre windows
iquestCoacutemo instalar CLIPS en Mac OS X
Primero de todo debemos bajarnos el programa de la paacutegina oficial de CLIPS accesible desde este link(httpclipsrulessourceforgenet ) Desde el aacuterea de descarga podeis bajar el intalador para MACOS X
312 Entorn finestres VS Consola de comandes
Encara que lrsquoentorn de finestres eacutes molt meacutes intuiumltiu CLIPS a la seva versioacute en liacutenea de comandes eacutes moltmeacutes ragravepid (segurament perquegrave no ha de mostrar en tot moment lrsquoagenda de fets les instancies les regles
etc)La diferencia de velocitat eacutes molt notable en cas de problemes de rendiment o de sensacioacute que lrsquoentorn
de finestres es queda penjat (o directament es tanca sense previ aviacutes) recomanem provar la versioacute en liacuteneade comandes
32 Los hechos
321 iquestQueacute es un hecho en CLIPS
Conceptualmente un hecho representa un dato abstracto del cual almacenamos valores Se puede vercomo una lista de campos donde el primer campo hace referencia al ldquodatordquo al cual le asignamos una listade valores que le suceden teniendo una relacioacuten entre siacute
Formalmente el primer campo es un siacutembolo y los campos restantes son valores
9
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1359
10 Capiacutetulo 3 CLIPS
(siacutembolo valor1 valor2 valorN)
322 iquestQueacute es un hecho ordenado (order Facts)
Un hecho ordenado tienen formato libre por lo tanto no existe restriccioacuten alguna en el orden de los campos
Los campos de un hecho ordenado pueden ser de cualquier tipo primitivo de datos excepto el primero quedebe ser un siacutembolo Como ejemplo tenemos
1 (hermanos Antonio Javier Carlos)2 (padre Pedro David)
323 iquestQueacute es un hecho no ordenado (deftemplates facts)
A traveacutes de los hechos no ordenados podemos abstraernos de la estructura de un hecho asignado unnombre a cada campo (slots)
1 (deftemplate nombre-template comentario2 (slot nombre-slot (tipo-del-slot))3 (multislot nombre-slot (tipo-del-slot))4 )
Por ejemplo
1 (deftemplate avioacuten2 (slot nombre_avion (type STRING))3 (slot compania (type STRING))
4 (slot numero_plazas (type INTEGER) (default 100))
324 iquestPuedo tener un vector como slot
Si debe declararse como multislot
325 iquestPuedo asignar propiedades a los slots
Siacute las maacutes importantes son
Type El tipo de dato primitivo que contiene (en mayuacutesculas)
Allowed-X Permite especificar un conjunto de valores permitidos Siendo X un tipo de datos primitivo(en minuacutesculas y plural) rarr si el slot toma un valor del tipo X debe pertenecer a los valores permi-tidos X puede ser values especificando entonces todos los valores posibles que puede tomar el slotindependientemente del tipo de dato
Range Especifica un rango para slots numeacutericos
Cardinality Nuacutemeros miacutenimo y maacuteximo de elementos que puede tener un multislot
Default Valor por defecto Si ponemos NONE como valor por defecto significaraacute que no se podraacute crear la
instancia a no ser que se especifique el valor de ese slot
1 (deftemplate estudiante2 (slot edad (type INTEGER) (range 0 99))
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1459
32 Los hechos 11
3 (multislot asignaturas (type STRING) (cardinality 1 5))4 (slot num-carreres (default 1))5 (multislot notas (allowed-strings MH NP))6 )
326 iquestQueacute debo utilizar hechos ordenados o no ordenados
Como se puede intuir si tenemos un conjunto de hechos los cuales conceptualmente pertenecen al mismoaacutembito seraacute una solucioacuten maacutes elegante agruparlos a traveacutes de un deftemplate En caso que tengamos quealguacuten hecho aislado seraacute mas sencillo declararlo como un hecho ordenado
327 Fets o Objectes
Veient la definicioacute de deftemplate podem confondrersquons a lrsquohora de decidir si fer servir fets o fer servirobjectes
Deixant de banda altres diferegravencies ja comentades (les classes suporten jerarquia de classes heregravenciaetc) els objectes es fan servir per representar el coneixement (mitjanccedilant un conjunt drsquoinstagravencies)
Aixiacute que generalment farem servir classes i objectes per representar coneixement mentre que farem servirels fets per portar control sobre lrsquoexecucioacute del problema
Per exemple podriacuteem definir un deftemplate per emmagatzemar un resultat o per poder controlar lrsquoestatde lrsquoexecucioacute
A la pragravectica de Mikeo (penjada a la web de lrsquoassignatura) teniacuteem un deftemplate habitacion-actual
1 (deftemplate habitacion-actual2 (slot habitacion)3 (slot area-restante)4
(slot presupuesto-restante)5 (slot precio-total)6 (slot prioridad-actual)7 )
Amb el qual controlagravevem la construccioacute drsquouna habitacioacute Assignagravevem una instagravencia de la classe habita-cioacute al slot habitacion de habitacion-actual i mitjanccedilant una segraverie de regles que feien unificacioacute ambhabitacion-actual actuagravevem sobre lrsquohabitacioacute drsquouna manera o drsquoun altre
328 Creacioacuten de hechos (assertdeffacts)
Si queremos crear un solo hecho utilizaremos el comando assert Por ejemplo (assert (casa roja))Si por el contrario queremos crear una estructura ordenada de hechos utilizaremos deffacts
(deffacts mishechos (casa roja) (pelota azul))
329 Modificar un fet
Per modificar un fet (per exemple molt uacutetil si estem treballant amb deftemplates) ho podem fer mitjanccedilant(modify ltINSTANCIAgtltFETSgt)
Per exemple si tingueacutessim el deftemplate persona
1 (deftemplate persona2 (slot nom)3 (slot edad)4 (slot dni)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1559
12 Capiacutetulo 3 CLIPS
I hagueacutessim afegit el fet
(assert (persona (nom Pepe)(edad 25)(dni 46974431)))
I el fet
(assert (aniversari 46974431))
Podriacuteem tenir la seguumlent regla
1 (defrule aniv2 aniversari lt- (aniversari dni)3 persona lt- (persona (edat edat)(dni dni))4 =gt5 (retract aniversari)6 (modify persona (edat (+ 1 edat)))7 )
La qual srsquoactivaragrave si hi ha un fet aniversari drsquouna persona Fent servir el dni indicat al fet aniversaribusquem el fet persona que teacute el mateix dni Deixem el valor edat a la variable edat per poder treballaramb ella meacutes endavant
Hem agafat tambeacute la direccioacute del fet aniversari per tal de poder esborrar-lo de la base de fets Aixograve srsquohafet per dues raons
Primer per mantenir meacutes neta la base de fets Segon i meacutes important Com que hem canviat el fet laregla tornaragrave a fer unificacioacute amb el fet (perquegrave ara eacutes diferent) amb la regla aniversari amb el que entrariadintre drsquoun bucle sense fi on srsquoaniria incrementant lrsquoedat de la persona
Un cop hem esborrat el fet aniversari incrementem en 1 el valor del slot edat de la persona fent servirla variable edat que hem declarat a la part esquerre de la regla
El comportament de modify es fer un retract del fet a la base de fets i despreacutes fer un assert amb els nous
valors Si volem canviar mes drsquoun slot del fet es convenient canviar-los tots a la vegada La raoacute es que cadavegada que fem un modify lrsquoapuntador al fet es modifica i lrsquoapuntador que tenim a la variable que hem fetservir ja no es vagravelid
Si no temim mes remei que fer la modificacioacute del fet pas a pas srsquoha de saber que la crida a modify retornalrsquoapuntador al nou fet Si el guardem a altra variable (o a la mateixa) podrem continuar modificant el fetamb la nova referegravencia
3210 Com elimino un fet de la base de fets
Per eliminar un fet de la base de fets ho podem fer amb la paraula clau (retract ltFETgt) on ltFETgt eacutes
un punter al fetPer obtenir aquest fet ho podem fer fent servir ltVARgtlt- ltFETgt a la part esquerre de la reglaPer exemple
1 (defrule accionsvent2 vent lt- (vent tipus)3 =gt4 (switch tipus5 (case poc then (assert (accio persiana0)))6 (case normal then (assert (accio persiana50)))7 (case molt then (assert (accio persiana100)))8 )9 (retract vent)
10 )
Afegiragrave fets per realitzar les accions pertinents i esborraragrave el fet de la base de fets
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1659
33 Variables 13
33 Variables
331 Variables a CLIPS
No cal declarar una variable (ni el seu tipus) nomeacutes cal afegir un interrogant al comenccedilament drsquoun simbol
per indicar que eacutes una variableCLIPS srsquoencarrega del control de tipus depenent del que assignem a la variablePer exemple testvar correspondria a la variable testvar Si per exemple assigneacutessim lrsquoenter 3 a
testvar CLIPS tractaria la variable com una variable entera
332 Com assignar un valor a una variable
Per assignar un valor a una variable es fa servir el megravetode (bind) amb la forma
(bind ltVARIABLEgtltVALORgt)
On ltVALORgt pot ser un valor o un megravetode que retorni un valor Per exemple si volem assignar un 4 a lavariable var
(bind var 4)
O per exemple podriacuteem assignar a la variable var la suma de 2 meacutes 2
(bind var (+ 2 2))
333 iquestCoacutemo declarar variables globales
Para crear una variable global hay que meterla dentro de la construccioacuten defglobal La declaracioacuten de la
variable seguiraacute el modelo nombreVariable = expresioacutenPor ejemplo
(defglobal presupuesto = 0)
Pueden aparecer en la parte izquierda de las reglas si no son utilizadas para asignar un valor y su cambiono activa reglas pero no pueden ser paraacutemetros de funciones ni meacutetodos
334 iquestCoacutemo trabajar con variables sumando restando por ejemplo contadores
La mejor forma es con variables globales se definen asiacute (defglobal x = 0) puede ser el valor quequeramos tanto nuacutemero string Y si queremos sumarle 10 por ejemplo
(bind x (+ x 10))
Las variables locales como por ejemplo x soacutelo tienen valor mientras dura su ejecucioacuten y eso suele ser enesa misma liacutenea o en un bucle Si le damos valor a x y luego preguntamos por ella nos diraacute que no existe
335 Quina diferegravencia hi ha entre les variables del tipus nom_variable i les del tipus $nom_variable
Les primeres contenen un sol valor i les segones en poder contenir meacutes drsquoun (o cap)
336 Quegrave significa lrsquointerrogant () quan va sol
Eacutes una variable anogravenima Pots utilitzar sense posar-hi cap nom si no trsquointeressa el valor en concret Perexemple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1759
14 Capiacutetulo 3 CLIPS
(Primer filtre_preu )
Aquesta condicioacute significa ldquosi el fet (Primer filtre_preu) teacute algun valorrdquo O sigui que si tingueacutessimel fet (Primer filtre_preu ok) es compliria la condicioacute (i si en comptes de ldquookrdquo fos ldquopatatardquo tambeacute escompliria) En canvi si el fet fos uacutenicament (Primer filtre_preu) no es compliria la condicioacute
337 Quegrave significa el dogravelar ($) quan va sol
Eacutes com lrsquointerrogant perograve admet meacutes drsquoun valor Per exemple
(Primer filtre_preu $ ok)
donaragrave cert pels fets de lrsquoestil (Primer filtre_preu patata ok) (Primer filtre_preu hola ok)(Primer filtre_preu patata hola ok) (Primer filtre_preu ok) Eacutes a dir no importa els valors quehi hagi entre filtre_preu i ok si al final hi ha un ok
338 iquestComo puedo ver los hechos presentes en un momento determinado
Abriendo la Facts Window en Window de la barra de menuacute
34 Las reglas
341 iquestCoacutemo construir una regla
Para construir una regla utilizaremos la construccioacuten defrule
Sintaxis
(defrule ltnombre-reglagt [ltcomentariogt][ltdeclaracioacutengt]ltelemento-condicioacutengt Parte izquierda (LHS)
=gtltaccioacutengt) Parte dcha (RHS) de la regla
Una regla consta de un conjunto de condiciones (antecedente) tambieacuten denominados elementos condicio-nales (EC) o parte izquierda (LHS) y de un conjunto de acciones (consecuente) tambieacuten denominado partederecha de la regla (RHS) La regla se activaraacute siempre que se satisfagan todos los EC mediante hechos oinstancias que los cumplan
Si se introduce en la base de reglas una nueva regla con el mismo nombre que el de una existente la nuevaregla reemplazaraacute a la antigua
Si una regla no tiene parte izquierda es decir no tiene elementos condicionales entonces el hecho(initial-fact) actuaraacute como el elemento condicional para ese tipo de reglas y la regla se activaraacute cadavez que se ejecute un comando reset
342 iquestCoacutemo gestionar la parte izquierda (LHS) de una regla
Declarar hechosSi no se especifica ninguna condicioacuten la regla se activaraacute siempre Una condicioacuten puede ser un simple hecho
(Ej vegetariano) o un hecho ordenado con unos valores concretos (Ej (persona (nombre Juan))) Si loque queremos es obtener el valor de un hecho insertaremos una variable en su lugar (Ej (persona (nombre
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1859
34 Las reglas 15
n)) ) Entonces entraraacute en la regla para cada valor posible que pueda asignar a la variable n a partir delos hechos
Si queremos indicar cualquier valor utilizaremos el siacutembolo y para cualquier lista el siacutembolo $ (Ej(evento ) (estilo $) ) Tambieacuten existe la opcioacuten de guardar en una variable una referencia al objetoEllo se consigue poniendo var lt- a su izquierda (Ej p lt- (persona (nombre Juan))) Se puede usarpor ejemplo para pasaacuterselo de paraacutemetro a una funcioacuten llamada en la RHS
Establecer condiciones
Ademaacutes podemos especificar restricciones adicionales sobre los valores que puede tomar un campo de unhecho Existen tres tipos principales de restricciones Conectadas (por orden de precedencia o prioridad)
not (~) Evita que cierto campo cumpla determinada restriccioacuten
and (amp) Combina dos restricciones conjuntivamente
or (|) Combina dos restricciones disjuntivamente
De predicado () Obliga a que cierto campo cumpla determinada condicioacuten (especificada por el predicado)
Por valor devuelto por una funcioacuten = Permite llamar a una funcioacuten y utilizar el valor devuelto pararestringir el valor que pueda tomar un campo de un hecho
Se puede comprobar si se cumple una determinada condicioacuten mediante el constructor test Dentro detest se pueden hacer llamadas a cualquier funcioacuten o predicado ya sea primitiva de CLIPS o definidapor nosotros
Combinar elementos
Los diferentes elementos de la parte izquierda van impliacutecitamente unidos mediante una AND que indicaconjuncioacuten No obstante podemos hacerlo expliacutecitamente mediante (and (cond1) (cond2)) aunque suelen
utilizarse para anidar ANDs dentro de ORsOR Sirve para hacer una disyuncioacuten (or (cond1) (cond2)) Es equivalente a escribir varias reglas en lasque cada una de ellas tenga uno de los componentes del OR en su parte izquierda y la misma parte derecha
NOT Sirve para detectar si no existe un determinado hecho (Ej (not (estilo sibarita)))exists Cuando a un conjunto de elementos se le antecede exists se comprueba que hay al menos un
hecho en la base de hechos que cumpla la condicioacuten (Ej (exists(bebida precio (ltprecio 5))) )forall Permite comprobar si todos los hechos que satisfacen un determinado patroacuten cumplen una serie
de condiciones (Ej (forall(plato (estilo moderno)))
343 iquestCoacutemo obtener la direccioacuten de hechos o instancias situados en LHS
En algunas ocasiones vamos a necesitar realizar alguacuten tipo de accioacuten en la parte derecha de las reglassobre hechos o instancias que cumplan unas determinadas condiciones Pero para ello necesitaremos primerotener acceso a estos elementos para despueacutes poder operar sobre ellos Esto lo conseguiremos guardando ladireccioacuten del elemento en una variable hacieacutendolo del siguiente modo
variable_direccion lt- (elemento)
Pongamos un ejemplo para ver realmente el funcionamiento y uso de esta posibilidad que CLIPS nosofrece
1 (defrule imprime-area2 instancia lt- (object (is-a Rectangulo))3 =gt4 (printout t Area del rectangulo (instance-name instancia)5 (send instancia calcula-area) crlf)6 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1959
16 Capiacutetulo 3 CLIPS
Cuando se ejecuta esta regla se imprimiraacuten las aacutereas de todas las instancias de la clase Rectangulo Enla parte izquierda de la regla lo que hacemos es guardar en la variable instancia la direccioacuten de la instanciade Rectangulo que estamos tratando en ese momento La regla se ejecutaraacute para todas las instanciasalmacenadas en la memoria de trabajo que cumplan la condicioacuten (is-a Rectangulo) es decir para todaslas instancias de la clase Rectangulo En la parte derecha de la regla donde se ejecutan las acciones podemosver que se imprimiraacute para cada instancia lo siguiente Area del rectangulo [nombre_instancia] aacuterea
del rectaacutengulo La funcioacuten instance-name nos devuelve el nombre de la instancia que le pasamos porparaacutemetro Ademaacutes hemos llamado al gestor de mensajes calcula-area para que nos devuelva el area delrectaacutengulo
344 iquestCoacutemo hacer sentencias or en la izquierda de las reglas
Con (or ) Si por ejemplo tenemos dos hechos (a) y (b) y queremos ejecutar la derecha de la reglacuando se cumpla uno de los dos tendremos que hacer (or (a) (b)) Atencioacuten porque la parte derecha seejecutaraacute tantas veces como veces se cumpla cada uno de los hechos si para nosotros existe tanto (a) como(b) la parte derecha se ejecutaraacute dos veces Para que soacutelo se usa una vez podemos hacer combinaciones de
or y and (funciona igual) o usar un patroacuten por ejemplo (persona Juan|Pedro) soacutelo se ejecutariacutea una vez
345 Com afegir una condicioacute a la part esquerre drsquouna regla
A vegades eacutes necessari que una regla srsquoinstanciiuml si es produeix una condicioacute especial (i no un fet) Per feraixoacute farem servir la comanda (test ltCONDICIOgt)
Per exemple imaginem que la nostre base de fets compte amb un fet (preu valor) amb un preudeterminat Imaginem que volem una regla que srsquoinstanciiuml quan aquest valor eacutes meacutes gran que 30
Per fer-ho fent servir tot el que hem explicat
1 (defrule preucar2 (preu preu)3 (test (gt preu 30))4 =gt5 (printout t El preu es mes gran que 30)6 )
Eacutes a dir si el preu eacutes meacutes gran que 30 srsquoimprimiragrave un missatge per pantallaAquestes condicions poden contenir ANDs i ORs de varies condicionsPer exemple
1 (defrule preulimit2 (preu preu)3 factminim lt- (preuminim minim)4 factmax lt- (preumaxim maxim)5 (test (and (gt preu minim) (lt preu maxim) ))6 =gt7 (retract factminim)8 (retract factmax)9 (printout t El preu estagrave dintre del rang)
On comprovarem si el preu estagrave dintre drsquoun rang determinat i en aquest cas esborra els fets que contenen
el magravexim preu i el miacutenim preu i mostra un missatge per pantalla
346 Puede una misma regla ejecutarse maacutes de una vez
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2059
34 Las reglas 17
Es muy importante entender que cada regla se ejecutaraacute una vez por cada combinacioacuten de valores en suLHS
1 (defrule regla2 (color col)3 (peso pes)4 =gt5
Si tengo tres colores y dos pesos asertados la regla se ejecutaraacute 6 veces una con cada combinacioacuten decolor y peso
347 Com puc definir lrsquoordre de les regles
La idea drsquoun sistema basant en regles eacutes no definir un ordre lineal drsquoaquestes (costa deixar de pensar de
forma iterativa)En el cas de necessitar que una regla srsquoexecuti despreacutes drsquouna altre pots fer servir Fets la regla anteriorcrea un fet que la segona regla tindragrave a la part esquerra
1 (defrule pregunta12 =gt3 (assert (pregunta1Feta))4 5 )6
7 (defrule pregunta2
8 (pregunta1Feta)9 =gt
10 11 )
I finalment pots usar la propietat salience Aquesta propietat indica la prioritat drsquoexecucioacute de les regles( les regles amb salience majors srsquoexecutaran abans ) Pot prendre valors positius i negatius entre -10000 y+10000 Per defecte les regles tenen salience 0
1 (defrule pregunta12 (declare (salience 2))3 =gt4 5 )6
7 (defrule pregunta28 (declare (salience 1))9 =gt
10 11 )
El valor indicado en la propiedad salience puede ser el nuacutemero directamente o una expresioacuten por ejemplovariable10 podemos usar variable para elegir que regla se ejecutaraacute
Las prioridades deben ser usadas solo para determinar el orden en el que se disparan algunas reglas sobreotras no para fijar el flujo de control ya que la principal ventaja de un sistema basado en reglas es larepresentacioacuten declarativa del conocimiento y de esta forma abusando de las prioridades conduce a unsistema procedimental
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2159
18 Capiacutetulo 3 CLIPS
348 Com forccedilar que una regla sigui la primera
Per que aquesta regla sigui la primera ha de tenir el salience meacutes gran de totes
1 (defrule presentacio2 (declare (salience 20))3 =gt4 (printout t ------ Benvingut ----- crlf)5 )
349 Vull guardar certs valors que es fan servir durant lrsquoexecucioacute de diferents regles Com hopuc fer
Tens principalment dues alternatives Si el valor eacutes un tipus bagravesic pots fer servir una variable global ambla sintaxi seguumlent
(defglobal nom_variable = valor)
Aquesta sentegravencia no va a dins de cap funcioacute ni regla es posa sola a la part que creguis convenient delcodi Vegem un exemple
(defglobal preu_minim_primer = 1000)
Per fer-la servir es fa exactament de la mateixa manera que amb una variable normal perograve has de posarels dos asteriscs Per exemple
(bind preu_minim_primer curr-preu)
Per altra banda si el valor o valors que vols guardar han de ser instagravencies una bona estrategravegia pot serutilitzar un deftemplate Eacutes uacutetil sobretot per anar guardant solucions temporals o llistes drsquoelements quepoden formar part de la solucioacute
Per utilitzar-ho has de seguir els passos seguumlents
1 Definir el deftemplate
(deftemplate nom_del_deftemplate(multislot nom_multislot)
(slot nom_slot)
)
Amb un exemple es veuragrave meacutes clar
(deftemplate llista-plats(multislot primers)(multislot segons)(multislot postres)
)
2 Inicialitzar el deftemplate
(defrule[condicions vagraveries] La condicioacute base eacutes que llista-plats no srsquoha inicialitzat encara
(not (llista-plats))=gt
llista conteacute els valors de llista-plats (que de moment estan buits)(bind llista (assert (llista-plats)))
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2259
35 Las clasesinstancias 19
3 Assignar-li valors
(bind segons_plats (find-all-instances ((plat Plat)) TRUE)(modify llista (segons segons_plats))
4 Recuperar els valors
(defrule[condicions vagraveries]llista lt- (llista-plats (segons $segons_plats))
=gt
Ara la variable $segons_plats conteacute tots els elements de segons
35 Las clasesinstancias
351 Tengo que representar la jerarquiacutea de un frame iquestEs preferible antildeadir las subclases a laontologiacutea o bien diferenciarlas mediante un slot en la superclase
Las dos formas son vaacutelidas pero es recomendable representarlas en clases separadas cuando se vayan abuscar instancias de ese tipo ya que asiacute no tendremos que hacer un recorrido por todas las de la superclaseNo obstante si soacutelo se trata de una caracteriacutestica puntual del frame y no vamos a hacer buacutesquedas de unaexclusiva subclase entonces seraacute maacutes eficiente antildeadir un slot debido a su mejor accesibilidad
352 iquestQueacute es un objeto
Podriacuteamos decir que un objeto es un hecho no ordenado con herencia
353 iquestPorqueacute usar objetos en contexto de la praacutectica de CLIPS de IA
Como bien sabemos una parte de la praacutectica de SBCrsquos consisten en crear la ontologiacutea Esta ontologiacutease exporta para poder interactuar con CLIPS en formato pins y pont El archivo pont contendraacute ladeclaracioacuten de todas las clases creadas previamente por Protege (defclass ) El archivo pins contendraacute
todas las instancias de las clases declaradas en el archivo pont Como puede intuir el lector se necesitaraacuteinteractuar con los objetos previamente creados por Protegravegegrave
354 Como se definen las clases
Para definir las clases usaremos el constructor defclass
(defclass ltnombregt [ltcomentariogt](is-a ltnombre-de-superclasegt)[(role concrete | abstract)]
[(pattern-match reactive | non-reactive)]ltslotgt definicioacuten de los atributos de la clase
ltdocumentacioacuten-handlergt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2359
20 Capiacutetulo 3 CLIPS
En caso de desear que la nueva clase herede las propiedades de otra ya existente el nombre de esta deberaacuteespecificarse despues de is-a El rol determinaraacute si la clase es concreta (se puede instanciar) o abstracta(destinada a ser superclase) El pattern-match debe declararse como reactivo si se desea que las instanciasde la clase puedan unificar con los elementos objeto de las reglas (siacutembolo lt-) Los slots correspondena los atributos de la clase y los handlers a las funciones de eacutesta Los handlers se pueden declarar en ladeclaracioacuten de la propia clase pero se deben definir externamente Dado que no aporta ninguna ventaja
declararlos es recomendable definirlos directamente Noacutetese que todo aquello que estaacute entre corchetes ([])constituye informacioacuten adicional que no es obligatorio especificar
1 (defclass Persona2 (is-a Ser_Vivo)3 (role concrete)4 (single-slot edad5 (type INTEGER)6 (range 1 99)7 (cardinality 0 1)8 (create-accessor read-write)9 )
10 (multislot amigos11 (type INSTANCE)12 (allowed-classes Persona)13 )14 )
El comportamiento y declaracioacuten de los slots es ideacutentico al de los slots de los hechos ordenados Losatributos de tipo INSTANCE (referencian otras instancias) estan en formato INSTANCE-NAME
355 Com consulto una instagravencia a partir drsquouna regla
Podem fer servir la part esquerre drsquouna regla per trobar instagravencies Lrsquouacutes eacutes molt semblant a trobar elpunter a un fet fent servir
(object [(is-a ltNOM_CLASSEgt)|(name ltNOM_INSTANCIA)|(ltNOM-SLOTgt ltVALORVARIABLE))])
Per exemple si volem que una regla srsquoinstanciiuml si tenim instanciat un plat de la classe Plat podriem ferservir
1 (defrule tenimplat2 plat lt- (object (is-a Plat))3 =gt4 (print t (send plat get-nom) crlf)
La regla imprimiragrave el nom del plat que trobi Eacutes important notar que srsquoactivaragrave per cada instagravencia de platque tinguem a la base de coneixement
Podem consultar els valors de la instancia fent servir condicions a la part esquerre de la regla Per exemplesi nomeacutes volgueacutessim els plats amb un preu meacutes gran que 30
1 (defrule platCar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Srsquoactivaragrave per tots els plats amb un preu major a 30
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2459
35 Las clasesinstancias 21
Srsquoha drsquoanar amb cura per aquest tipus de regla ja que si la base de coneixement eacutes molt amplia pot acabarderivant amb problemes de memograveria
Per exemple si en comptes de preguntar per una instagravencia de Plat pregunteacutessim per dues instancies dePlat
1 (defrule platsCars2 plat1 lt- (object (is-a Plat) (Preu p1))3 plat2 lt- (object (is-a Plat) (Preu p2))4 (test (gt p1 30))5 (test (gt p2 30))6 =gt7 (print t (send plat1 get-nom) i (send plat1 get-nom) soacuten cars8 crlf)9 )
Faria unificacioacute amb totes les combinacions possibles (amb repeticions) de dos plats de tota la base deconeixement Aixograve es podria anar ampliant fins fer-se intractable
Si tenim drsquoalguna manera el nom de la instancia podem fer
1 (defrule platPicant2 (cuina (plat p))3 (object (name p) (picant pi))4 =gt5 (print t picant pi crlf)6 )
Aixoacute es pot servir per crear condicions que facin servir noms drsquoinstancies que tenim almacenats a slotsdrsquoaltres instancies per exemple
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send v get-Preu) crlf)6 )
Aquesta regla imprimiria el preu del vi asociat al plat si es negre
356 Tengo problemas en condiciones de reglas con slots de instancias obtenidos con send
A veces dan problemas las reglas en las que las condiciones sobre los valores de los slots de una instanciase escriben usando mensajes get sobre los atributos de una instancia en lugar de utilizar patrones paraobtenerlos por ejemplo la regla
1 (defrule platcar2 plat lt- (object (is-a Plat) )3 (test (gt (send plat get-Preu) 30))4 =gt5 (print t (send plat get-nom) es car6 crlf)7 )
No funciona correctamente en CLIPS pero la regla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2559
22 Capiacutetulo 3 CLIPS
1 (defrule platcar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Siacute lo haceEn el caso de que el valor del slot sea booleano se puede escribir la regla como
1 (defrule platpicant2 plat lt- (object (is-a Plat) (Picant TRUE))3 =gt4 (print t (send plat get-nom) es picant crlf)
En el caso de que el slot sea a su vez una instancia se puede utilizar para obtener los valores de estainstancia en la condicion como se explica en la pregunta anterior
357 Tengo problemas con instancias obtenidas del slot de otra instancia en el patroacuten de unaregla
Este problema aparece cuando el patron de una regla instancia una variable a un nombre de instancia yesta no esta definida en el modulo de la regla por ejemplo si la regla siguiente pertenece a un modulo queno es el de la instancia
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4
=gt5 (print t preu (send v get-Preu) crlf)6 )
La regla se quejaraacute de que la instancia no existe al enviarle el send ya que solo se busca la instancia dentrodel moacutedulo de la regla y no en los importados Para arreglar esto se puede usar la funcioacuten (instance-address[ltMODULOgt|] ltINSTANCIAgt) que busca la direccion de la instancia en un modulo concreto o en todos losmoacutedulos que se importan () Deberiacuteamos entonces escribir la regla
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send (instance-address v) get-Preu) crlf)6 )
358 iquestCoacutemo realizar una buacutesqueda de instancias que cumplan unas restricciones
CLIPS nos ofrece varias funciones de buacutesqueda de instancias que cumplan unas determinadas restriccionesque a nosotros nos interese
La funcioacuten find-instance Esta funcioacuten devuelve la primera instancia que cumple todas las restric-ciones indicadas
La funcioacuten find-all-instances Esta funcioacuten devuelve todas las instancias que cumplen las restric-ciones indicadas
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2659
35 Las clasesinstancias 23
La sintaxis de ambas funciones es igual exceptuando el nombre de la funcioacuten(find-all-instances (clase_instancias) (restricciones))A continuacioacuten se muestran varios ejemplos
(bind rectangulos (find-all-instances ((inst Rectangulo)) (gtinstaltura 10))) Des-pueacutes de ejecutar esta funcioacuten en la variable rectangulos habraacute una lista con todas las instancias de la
clase Rectangulo cuya altura sea superior a 10(bind rectangulos (find-all-instances ((inst Rectangulo)) (and (gtinstaltura 10) (=instanchura 7)))) Este trozo de coacutedigo hace que en la variable rectangulos se guarde una listade las instancias de la clase Rectangulo que tienen una altura superior a 10 y una anchura igual a 7
Estas funciones que CLIPS nos ofrece tienen otra funcionalidad y es que podemos realizar buacutesquedas deconjuntos de instancias
(bind rectangulos (find-all-instances ((a Rectangulo) (b Rectangulo)) (= aalturabaltura))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas de instancias de laclase Rectangulo que tienen la misma altura
Por uacuteltimo es necesario comentar que se pueden realizar buacutesquedas de conjuntos de instancias que seande distintas clases
(bind figuras (find-all-instances ((rect Rectangulo) (circ Circulo)) (= rectalturacircradio))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas ltrectangulocirculogtque cumplan que la altura del rectaacutengulo sea igual al radio del ciacuterculo
Existen maacutes comandos para obtener instancias pero son menos utilizadas a nivel baacutesico como pueden serany-instancep do-for-instance do-for-all-instances y delayed-do-for-all-instances
359 iquestCoacutemo se interactuacutea con objetos
La interaccioacuten con objetos se efectuacutea mediante lo que se denomina mensaje
(defmessage-handlerltnombre-clasegtltnombre-mensajegt[lttipo-handlergt] [ltcomentariogt]ltparaacutemetrogt [ltparaacutemetro-comodiacutengt])ltaccioacutengt
)
Un gestor de mensajes consta de 7 partes
1 Nombre de clase a la que el gestor estaraacute asociado
2 Nombre del mensaje
3 Tipo de gestor (Nosotros habitualmente usaremos primary que viene por defecto)
4 Comentario (opcional)
5 Lista de paraacutemetros6 Paraacutemetro comodiacuten (para gestionar muacuteltiples paraacutemetros)
7 Secuencia de acciones o expresiones que seraacuten ejecutadas por el gestor
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2759
24 Capiacutetulo 3 CLIPS
Enfocado a la praacutectica de CLIPS la maacutes comuacuten es que queramos interactuar con objetos para
1 Imprimir los objetos Un ejemplo
1 (defmessage-handler avion imprimir-beneficio ()
2 Para implementar funciones calculadas asociadas al objeto Un ejemplo
1 (defmessage-handler avion calcular-beneficio ()2 ( selfplazas-ocupadas selfprecio-billete))3 )
Como se puede observar el paraacutemetro impliacutecito self contiene la instancia activa para este mensaje
3510 iquestComo se interactuacutea con las instancias de los objetos
Podremos interactuar entre las instancias de los objetos mediante la funcioacuten send
(send ltexpresioacuten-de-objetogtltnombre-de-mensajegtltexpresioacutengt)Donde se toman como argumentos el objeto destino del mensaje el mensaje mismo y otros paraacutemetros
que debieran ser pasados a los gestoresParticularmente en el aacutembito de la praacutectica usualmente necesitaremos utilizar el envioacute de mensajes de
tipo get put and delete Estos mensajes tiene la siguiente sintaxis
get-ltnombre-atributogt
put-ltnombre-atributogt
delete
Aquiacute tenemos un ejemplo de como utilizarlo recordando que ponemos entre corchetes la instancia la cualse enviacutea el mensaje
(defclass avion (is-a USER)(role concrete)(slot precio-billete (create-accessor read) (default 34))(slot plazas-ocupadas (create-accessor write) (default 0)))
Clase creada
gt(make-instance a of avion) Creacioacuten de una instancia de avion[a]
gt(send [a] get-precio-billete) Obtencioacuten de un slot34 Resultado obtenidogt(send [a] put-plazas-ocupadas 100) Modificacioacuten de un slotgt(send [a] delete) Eliminacioacuten de la instanciaTrue
3511 Uso de make-instance
Cuando queremos crear una instancia de una clase para ir rellenandola con los resultados o datos quevayamos obteniendo se haria lo siguiente
(bind variable_instancia (make-instance nombre_instancia of nombre_clase))
Una vez creada podemos jugar con dicha instancia en las diferentes reglas siempre que la llamemos enlos activadores
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2859
35 Las clasesinstancias 25
(defrule reglavar_instancia lt- (object (is-a nombre_clase))=gt
)
De esta manera dentro de la regla podemos hacer acciones con la instancia por ejemplo(send var_instancia put-articulo articulo_ejemplo)
3512 Como generar automaacuteticamente nombres de instancia
En ocasiones queremos crear instancias en reglas y queremos que su nombre sea distinto del de otrasque ya tenemos Para ello podemos utilizar las funciones gensym y gensym La primera genera un siacutembolodel estilo genN donde N es un nuacutemero La segunda hace lo mismo pero aseguraacutendose de que ese siacutembolono exista ya Se puede reiniciar el contador que usan estas dos funciones con el operador (setgen ltnumgt)donde ltnumgt es el nuacutemero por el que queremos que empiecen ahora los siacutembolos
Para usar esto para generar el nombre de una instancia podemos hacer
(make-instance (gensym) of ltclasegt)
Cada vez que se ejecute se generaraacute un nombre de instancia nuevoSi creamos instancias de diferentes clases y queremos que las instancias tengan nombres que podamos
identificar podemos concatenar siacutembolos a los siacutembolos generados por gensym por ejemplo
(make-instance (sym-cat pepe- (gensym)) of ltclasegt)
generaraacute una instancia con el nombre pepe-genN
3513 Com fer un getset drsquoun slot drsquouna classe
Per consultar el valor drsquoun slot drsquouna classe ho podem fer enviant-li un missatge de la seguumlent manera
(send ltVARIABLEgt get-ltNOM_ATRIBUTgt)
Per exemple si tenim una instagravencia de la classe Plat ( instancia ) i volem saber el valor del seu slotnom
(send instancia get-nom)
Per assignar un valor a un slot drsquouna drsquoinstagravencia hem drsquoenviar-li un missatge de la seguumlent manera
(send ltVARIABLEgt put-ltNOM_ATRIBUTgt ltVALORgt)On ltVALORgt pot ser un valor o un megravetode que retorni un valor
(send instancia put-nom nom)
3514 iquestCoacutemo acceder a una instancia cuyo nombre conocemos
Si conocemos el nombre de una instancia y necesitamos acceder a ella es decir necesitamos enviarle alguacutenmensaje mediante la funcioacuten send podemos hacerlo directamente escribiendo en lugar de la variable quealmacena la instancia el nombre de la instancia entre corchetes [ ] A continuacioacuten se muestra un ejemplo
(bind altura_rect1 (send [rect1] get-altura))
En este caso se guardaraacute en la variable altura_rect1 el valor de la altura de la instancia que tiene comonombre rect1
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2959
26 Capiacutetulo 3 CLIPS
3515 Obtenir el nom drsquouna classe
Si tenim una instagravencia drsquouna classe i volem saber el nom de la classe (uacutetil si tenim una bona taxonomiade classes) ho podem fer amb el megravetode (class ltINSTANCIAgt)
Si per exemple imaginem que tenim la classe Actor la qual teacute com subclasses la classe APrincipalASecundari i ACameo Imaginem que estem tractant amb instancies drsquoactors i volem saber si la instanciaque estem tractant es de la classe APrincipal
Ho hauriacuteem de fer de la seguumlent manera
(eq (class instancia) APrincipal)
Fixem-nos que APrincipal eacutes un siacutembol no un String (un truco eacutes fixar-se en que no teacute cometes) Si vol-gueacutessim comparar-ho amb un String (per exemple un String introduiumlt per lrsquousuari) ho podriacuteem transformara un String amb el megravetode str-cat
(eq (str-cat (class instancia)) Principal)
3516 Como convierto un INSTANCE-ADRESS en un INSTANCE-NAME
En alguacuten momento nos podemos encontrar con la situacioacuten de que disponemos de un puntero a unainstancia y necesitamos su nombre o lo contrario En ambos casos podemos usar la funcioacuten instance-nameSu funcionamiento es bidireccional podemos introducirle un instance-name y nos devolveraacute un instance-adress y viceversa
1 (defrule imprimir-nombre2 estlt-(object (is-a Estudiante) (edad 25))3 =gt4 (printout t (instance-name est) crlf)5
)
3517 Com iterar a traveacutes drsquoun multi-slot
El seguumlent tambeacute eacutes vagravelid com exemple de com iterar a traveacutes drsquouna llistaImaginem que tenim una instagravencia de la classe Plat a la varible (plat) la qual teacute un multi-slot drsquoinstagravencies
de la classe Ingredient Imaginem que volem imprimir per pantalla el nom drsquoaquests ingredients (slot nomde la classe Ingredient) Necessitarem iterar sobre la llista drsquoingredients
1 (bind i 1)2 (while (lt= i (length$ (send plat get-ingredients)))3 do4 (bind ingredient (nth$ i (send plat get-ingredients)))5 (printout t (send ingredient get-nom) crlf)6 (bind i (+ i 1))7 )
El megravetode (nth$ ltINDEXgtltLLISTAgt) et retorna lrsquoelement situat a INDEX de LLISTAEl megravetode (length$ ltLLISTAgt) retorna el nuacutemero drsquoelements de LLISTA
3518 Coacutemo modificarinsertarborrar valores en un multislot
Los valores de un multislot se pueden cambiar usando la funcioacuten slot-replace$ La sintaxis es la siguiente
(slot-replace$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt ltvalorgt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3059
35 Las clasesinstancias 27
Donde ltiniciogt y ltfingt son el rango de posiciones del multislot que se quiere modificar y ltvalorgtson los valores que queremos reemplazar Obviamente deberaacute haber tantos valores como posiciones hayamosindicado en el rango
Para insertar nuevos valores podemos usar la funcioacuten slot-insert$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltposgt ltvalorgt)
El valor se inserta delante de la posicioacuten indicada si la posicioacuten es mayor que la longitud del multislot secolocaraacute al final
Para borrar elementos de un multislot podemos usar la funcioacuten slot-delete$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt)
Se borraraacuten los elementos que estaacuten en el rango indicado
3519 Coacutemo recorrer un atributo multievaluado
Supongamos que la variable respuesta tiene una lista de instancias
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 aquiacute hacemos lo que queramos4 )5 )
Loop-for-count funciona como un for primero la variable que haraacute de contador luego el valor de origeny luego el valor final Para controlar el final usamos la funcioacuten que he explicado antes i tomaraacute valoresdesde 1 hasta n asiacute que usando la funcioacuten nth$ obtendremos cada uno de los elementos La variable auxiraacute teniendo cada uno de los valores
3520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz)
Es igual que antes pero con dos bucles
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 (bind aux2 (send aux get-slot_que_queremos))4 (loop-for-count (j 1 (length$ aux2)) do5 (bind aux_final (nth$ j aux2))6 aquiacute ya podemos trabajar con el elemento en concreto7 )8 )
Supongamos que respuesta tiene una lista de instancias con el primer bucle haremos lo mismo que antes ir
iterando por esas instancias Una vez que tenemos cada instancia con aux2 con el segundo bucle iteraremosdentro de sus instancias interiores
Por ejemplo si tenemos varios equipos de fuacutetbol y cada equipo tiene varios jugadores en el primer bucleestamos iterando entre los equipos y en el segundo entre los jugadores de cada equipo en particular
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3159
28 Capiacutetulo 3 CLIPS
3521 Com puc esborrar una instagravencia
Per esborrar una instagravencia (per exemple segons la informacioacute que proporcioni lrsquousuari podem deduir queuna segraverie drsquoinstagravencies eacutes impossible que es facin servir per a la solucioacute) ho podem fer enviant un missatgedelete a la instagravencia eacutes a dir (send ltINSTANCIAgtdelete)
(send inst delete)
Un megravetode que podria ser uacutetil de la cara a la pragravectica podria ser el seguumlent
1 (defrule elimina-instancia2 (declare (salience 10))3 elimina-fact lt- (elimina-inst inst)4 =gt5 (send inst delete)6 (retract elimina-fact)
Imaginem que per exemple que volem eliminar una llista drsquoinstagravencies Per eliminar-les podriacuteem recoacuterrerel llistat marcant les instagravencies que volem esborrar afegint el seguumlent fet
(assert (elimina-instancia inst))
Aixiacute com que elimina-instancia teacute un salience alt esborraria les instagravencies marcades quan tingueacutes ocasioacuteDrsquoaquesta manera ens estalviem el problema de recoacuterrer un llistat drsquoinstagravencies amb un iterador mentre
anem eliminant els elements de la llista cosa que pot donar problemes amb lrsquoiterador
3522 Com imprimir una instagravencia
Per imprimir una classe (uacutetil per exemple per mostrar el resultat final) el millor eacutes definir message-handlersPer exemple imaginem que tenim una classe Plat la qual teacute un slot nom de tipus String Si volgueacutessimimprimir per pantalla un missatge que digueacutes
El nom del plat eacutes ndashltnom del platgtndash
Hauriacuteem de definir un message-handler que simplement imprimiacutes per pantalla el valor de lrsquoslot de laforma
(defmesssage-handler ltCLASSNAMEgt ltMESSAGENAMEgt primary ()ltCODIgt
)
Per el cas de lrsquoexemple
1 (defmessage-handler Plat print primary ()2 (printout t -- selfnom --) )3 )
Per cridar-ho nomeacutes caldragrave enviar-li un missatge a la instagravencia amb el nom del message-handler (enaquest cas print)
(send instancia print)
Un message-handler pot cridar a altres message-handlers amb el que es poden encadenar diverses instagraven-cies Per exemple imaginem que tenim la classe Menuacute la qual teacute un atribut plats que eacutes un llista drsquoinstagravenciesde la classe Plat Dintre del message-handler menuacute podriacuteem iterar a traveacutes de la llista de plats enviant elmissatge print que hem definit anteriorment
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3259
36 Programacioacuten 29
3523 Com es navega entre instagravencies relacionades
Per exemple tinc una instagravencia iA que teacute un slot anomenat slotB que eacutes una instagravencia drsquoun frame B Vullsaber el nom de la instagravencia associada al slotB de iA Ho pots fer aixiacute
(bind B (send iA get-slotB))(bind res (send B get-nom))
Si estagraves dins drsquouna condicioacute ho pots simplificar de la forma seguumlent
(bind res (send iAslotB get-nom)
Els dos punts soacuten equivalents al punt de Java
36 Programacioacuten
361 Com introduir un comentari
Els comentaris a CLIPS va darrere de un com per exemple
Comentari
Tambeacute podem afegir comentaris a les nostres regles deffacts deftemplates etc Generalment van darrereel nom de la estructura per exemple
1 (defrule neteja regla per la qual si la cuina estagrave bruta srsquoafegiragrave una tasca de2 neteja
3 (estat-cuina bruta)4 =gt5 (assert (tasca netejar))6 )
362 Referenciar el valor null a CLIPS
Per referenciar el valor null a clips es fa amb el simbol nil Per exemple si volem saber si una instagravenciainst es null ho podriacuteem fer de la seguumlent manera
(eq inst nil)
363 Formas de recorrer una lista
Para recorrer una lista disponemos de diferentes opciones en este FAQ explicaremos como crear unaestructura tipo ldquoWHILErdquo y tipo ldquoFORrdquo
1 While Esta regla se ejecuta hasta que la expresioacuten a evaluar sea falsa Este tipo de estructura se rigepor seguir la sintaxis while - do y se construiriacutea de la siguiente forma
(while ltexpresioacutengt[do] ltaccioacutengt)
Doacutende dependiendo del valor de ltexpresioacutengt
Valor TRUE Se realizaraacute la accioacuten ltaccioacutengt i se volveraacute a evaluar ltexpresioacutengt
Valor FALSE No se ejecutaraacute la accioacuten ltaccioacutengt
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3359
30 Capiacutetulo 3 CLIPS
2 For Esta regla sirve para ejecutar un bucle N (final - inicio) veces Este tipo de estructura se rige porseguir la sintaxis loop-for-count y se construiriacutea de la siguiente forma
(loop-for-count (ltvargtltiniciogtltfinalgt) [do] ltaccioacutengt)
Doacutende
ltvargt Variable que se usara como iacutendice
ltiniciogt Valor inicial que tendraacute ltvargt
ltfinalgt Ultimo valor que tendraacute la variable ltvargt
ltaccioacutengt Accioacuten que es realizaraacute hasta que ltvargt tenga el valor de ltfingt
364 Formas de elegir una opcioacuten
En este apartado explicaremos como crear una estructura if y una estructura switch
If Este tipo de estructura se rige por seguir la sintaxis if - then - else y se construiriacutea de lasiguiente forma
(if ltexpresioacutengtthen ltaccioacutengt[else ltaccioacuten2gt])
Doacutende dependiendo del valor de ltexpresioacutengt
bull Valor TRUE Se realizaraacute la accioacuten ltaccioacutengtbull Valor FALSE Se realizaraacute la accioacuten ltaccioacuten2gt (en caso de haber)
Switch Este tipo de estructura se rige por seguir la sintaxis switch - opciones y se construiriacutea dela siguiente forma
(switch ltexpresioacuten-testgt(case OPCION1 then ACCION1)(case OPCION2 then ACCION2)
([default] ACCION-DEFAULT)
)
Doacutende dependiendo del valor de ltexpresioacuten-casegt se ejecutaraacute una ltaccioacutengt en particular Si nin-guna ltopcioacutengt es correcta se ejecutara la ltaccioacuten-defaultgt
365 Funciones con la clase String
Habitualmente trabajaremos con Strings o cadena de Strings CLIPS proporciona una serie de herramien-tas para trabajar con esta clase
1 Convertir string a MAYUacuteSCULAS A veces es conveniente tener todos los caracteres en mayuacutesculaspara no tener problemas de comparaciones o simplemente por convenio Para ello CLIPS dispone dela funcioacuten upcase la cual convierte a mayuacutesculas un siacutembolo o string
(upcase ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplos
(upcase Ccedillips es divertido) rarr CcedilLIPS ES DIVERTIDO
(upcase Clips_es_divertido) rarr CLIPS_ES_DIVERTIDO
2 Convertir string a MINUacuteSCULAS la funcioacuten es downcase
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3459
36 Programacioacuten 31
3 Concatenacioacuten de strings Tambieacuten es de gran utilidad poder juntar dos o maacutes paraacutemetros en un solostring Todo paraacutemetro a juntar deben ser de uno de los siguientes tipos symbol String integer floato instance-name
(str-cat parametro1 parametro2 parametroN )
Ejemplo
(str-cat IA nota 10) rarr IAnota10
4 Comparacioacuten de strings Funcioacuten que nos indica si dos strings son iguales
(str-compareltexpresioacuten-simboacutelica-o-de-cadenagtltexpresioacuten-simboacutelica-o-de-cadenagt
)
Esta funcioacuten devuelve
0 Si ambos strings son iguales1 Si el primer string es mayor que el segundo string-1 Si el primer string es menor que el segundo string
5 Longitud de un string Muchas veces es de gran utilidad saber que tamantildeo tiene un string
(str-length ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplo
(str-length Inteligencia Artificial) rarr 23
366 iquestCoacutemo obtener el contenido de una variable en un string
Para conseguir un string a partir de un integer float symbol instance-name debes utilizar el comandostr-cat Si a la funcioacuten le pasamos como paraacutemetros varios elementos los transformaraacute a string y losconcatenaraacute La sintaxis de esta funcioacuten es la siguiente (str-cat elementos) Esta funcioacuten la usaremossobre todo cuando queramos realizar comparaciones entre el contenido de una variable y un string ya quepreviamente necesitaremos usar la funcioacuten str-cat para pasar el contenido de la variable a string y realizarde este modo la comparacioacuten de forma correcta
367 iquestComo se crea una lista
Con create$ Todos los operadores sobre listas llevan el siacutembolo $ al final Igual que con las variables sedebe usar bind siempre que se desee modificar una lista
(bind lista (create$ a b c))
368 iquestComo borro un elemento de una lista
Con delete$Usa la siguiente sintaxis(delete$ ltlistagt ltindice-iniciogt ltindice-finalgt)Se borraraacuten todos los elementos del rango entre las posiciones inicio y final ambas incluidas Tambieacuten exis-
tedelete-member$ (delete-member$ ltlistagt ltelementogt) Borraraacute todas las apariciones del elemento enla lista
(delete$ (create$ a b c d e f) 3 5) minusrarr (a b f)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 359
3
En la elaboracioacuten de este documento han intervenido
Javier Biosca Ruiacutez de OjedaJoseacute Camallonga GonzaacutelezJordi Chacoacuten ChacoacutenAdriagrave Figuera PuigMartiacute Forneacutes EstarellasDaniel Golobart CastelloteMarina GrigorevaBorja Jara Garciacutea
Brian Jimeacutenez GraciacuteaIgnacio Llatser MartiacuteVictor Lloveras DiacuteazIsaac Loacutepez AmatViacutector Martiacutenez JuradoLluiacutes Monsalve CarrasquillaEnric Munneacute HernaacutendezJorge Muntildeoz GamaIvan Navarro GonzaacutelezManuel Parrilla GutierrezMarcos Pereira Varela
Pere Sivecas GibertLluiacutes Suntildeol Juliachs
El responsable de la edicioacutencorreccioacutenampliacioacuten del documento es Javier Beacutejar Alonso (bejarlsiupcedu)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 459
Iacutendice general
1 Introduccioacuten 5
2 Protegravegegrave 721 Coacutemo cambiar el nombre de las instancias en Protegravegegrave 722 Com exporto una ontologia de Proteacutegeacute a CLIPS 723 iquestCoacutemo exporto una ontologiacutea de Proteacutegeacute a CLIPS (2a posibilidad) 724 Per quegrave em doacutena error CLIPS al tenir una instancia que hereta de meacutes drsquouna classe 8
3 CLIPS 931 Instalacioacuten del CLIPS 9
311 iquestCoacutemo instalar CLIPS 9312 Entorn finestres VS Consola de comandes 932 Los hechos 9
321 iquestQueacute es un hecho en CLIPS 9322 iquestQueacute es un hecho ordenado (order Facts) 10323 iquestQueacute es un hecho no ordenado (deftemplates facts) 10324 iquestPuedo tener un vector como slot 10325 iquestPuedo asignar propiedades a los slots 10326 iquestQueacute debo utilizar hechos ordenados o no ordenados 11327 Fets o Objectes 11328 Creacioacuten de hechos (assertdeffacts) 11
329 Modificar un fet 113210 Com elimino un fet de la base de fets 1233 Variables 13
331 Variables a CLIPS 13332 Com assignar un valor a una variable 13333 iquestCoacutemo declarar variables globales 13334 iquestCoacutemo trabajar con variables sumando restando por ejemplo contadores 13335 Quina diferegravencia hi ha entre les variables del tipus nom_variable i les del tipus
$nom_variable 13336 Quegrave significa lrsquointerrogant () quan va sol 13337 Quegrave significa el dogravelar ($) quan va sol 14
338 iquestComo puedo ver los hechos presentes en un momento determinado 1434 Las reglas 14
341 iquestCoacutemo construir una regla 14342 iquestCoacutemo gestionar la parte izquierda (LHS) de una regla 14343 iquestCoacutemo obtener la direccioacuten de hechos o instancias situados en LHS 15344 iquestCoacutemo hacer sentencias or en la izquierda de las reglas 16345 Com afegir una condicioacute a la part esquerre drsquouna regla 16346 Puede una misma regla ejecutarse maacutes de una vez 17347 Com puc definir lrsquoordre de les regles 17348 Com forccedilar que una regla sigui la primera 18349 Vull guardar certs valors que es fan servir durant lrsquoexecucioacute de diferents regles Com
ho puc fer 1835 Las clasesinstancias 19
351 Tengo que representar la jerarquiacutea de un frame iquestEs preferible antildeadir las subclases ala ontologiacutea o bien diferenciarlas mediante un slot en la superclase 19
1
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 559
2 Iacutendice general
352 iquestQueacute es un objeto 19353 iquestPorqueacute usar objetos en contexto de la praacutectica de CLIPS de IA 19354 Como se definen las clases 19355 Com consulto una instagravencia a partir drsquouna regla 20356 Tengo problemas en condiciones de reglas con slots de instancias obtenidos con send 21357 Tengo problemas con instancias obtenidas del slot de otra instancia en el patroacuten de
una regla 22358 iquestCoacutemo realizar una buacutesqueda de instancias que cumplan unas restricciones 22359 iquestCoacutemo se interactuacutea con objetos 233510 iquestComo se interactuacutea con las instancias de los objetos 243511 Uso de make-instance 243512 Como generar automaacuteticamente nombres de instancia 253513 Com fer un getset drsquoun slot drsquouna classe 253514 iquestCoacutemo acceder a una instancia cuyo nombre conocemos 253515 Obtenir el nom drsquouna classe 263516 Como convierto un INSTANCE-ADRESS en un INSTANCE-NAME 263517 Com iterar a traveacutes drsquoun multi-slot 263518 Coacutemo modificarinsertarborrar valores en un multislot 263519 Coacutemo recorrer un atributo multievaluado 273520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz) 273521 Com puc esborrar una instagravencia 283522 Com imprimir una instagravencia 283523 Com es navega entre instagravencies relacionades 29
36 Programacioacuten 29361 Com introduir un comentari 29362 Referenciar el valor null a CLIPS 29363 Formas de recorrer una lista 29
364 Formas de elegir una opcioacuten 30365 Funciones con la clase String 30366 iquestCoacutemo obtener el contenido de una variable en un string 31367 iquestComo se crea una lista 31368 iquestComo borro un elemento de una lista 31369 iquestComo inserto elementos en una lista 323610 iquestComo modifico elementos de una lista 323611 iquestComo averiguo el nuacutemero de elementos de una lista 323612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten 323613 iquestComo recorro todos los elementos de una lista 323614 Com trobar si un element forma part drsquouna llista 32
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot 323616 I si tinc un multislot i el vull transformar en un string 333617 iquestCoacutemo obtener un valor aleatorio 333618 Comparaciones 33
37 Los moacutedulos 33371 Quegrave eacutes un mogravedul en CLIPS 33372 Particioacuten en modulos 34373 iquestCoacutemo asignar una construccioacuten en un moacutedulo 34374 Com funcionen les clagraveusules export i import 34375 iquestCoacutemo cambio el moacutedulo actual 35
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS 3538 Funciones 36
381 iquestCoacutemo se crea una funcioacuten en CLIPS 36382 Explicacioacuten de la estructura de una funcioacuten en general 37
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 659
Iacutendice general 3
383 Com definir un paragravemetre drsquouna funcioacute com una llista 38384 Com puc utilitzar una funcioacute a la part esquerra de les regles 38
39 Entrada salida 38391 iquestCoacutemo se imprime por pantalla 38392 iquestAl imprimir por pantalla como hago un salto de liacutenea 39393 Com imprimeixo una liacutenia en blanc 39
394 Com llegir de la entrada standard 39395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeix
com un enter 40396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacute
drsquoentrada quants) com ho faig per assignar-los a un multislot 40310 Funciones uacutetiles 40
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles 403102 Obtener un valor numeacuterico comprendido en un rango 413103 Realizar una pregunta general 413104 iquestCoacutemo se realiza una pregunta binaria 413105 Encuentra la instancia con valor miacutenimo para un slot 41
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valor const 423107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li 433108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla 43
311 Ejecucioacuten de un programa CLIPS 433111 iquestCoacutemo cargamos un programa 433112 iquestCoacutemo probar tu coacutedigo en CLIPS 443113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten 443114 iquestCoacutemo parar una ejecucioacuten 443115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste 44
4 Consejos praacutecticos 45
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve no seacute ni per oncomenccedilar Algun consell 45
42 iquestComo estructuro una practica de CLIPS 4543 Com crear un flux de preguntes 46
431 Com puc ordenar aquest flux de preguntes 46432 I si vull saltar-me una pregunta 47433 Com inicialitzar el flux del programa 48
44 Uso de la funcioacuten modify para ir guardando resultados preferidos 4845 Creacioacuten de la plantilla de recomendacioacuten 49
5 Errores frecuentes 51
51 Quan obro un fitxer en CLIPS em dona un error 5152 Codificacioacute de caragravecters a CLIPS 5153 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots en Protegravegegrave cuando
las importo en CLIPS 5154 Tengo problemas con la hereacutencia de slots en las clases que he definido 5155 Quegrave significa lrsquoerror OBJRTBLD5 5256 Antes compilaba correctamente y ahora da warnings 5257 No puedo editar mi fichero en clips 5258 Redefining 5259 Problemas al consultar las instancias relacionadas con otras 52510 Unable to finde class X cuando definimos instancias 52
511 Expected the beginning of a construct (cuando definimos instancias) 53512 Compila pero no compara bien dos elementos 53513 Expected the beginning of a constructor 53514 Missing function declaration for defruledeffunction 53
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 759
4 Iacutendice general
515 Check appropiate syntax for ifswitchloop-for-count 54516 Problemas con pareacutentesis 54
6 Referencias 5561 On puc trobar informacioacute sobre el llenguatge CLIPS 5562 Otras referencias 55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 859
1 Introduccioacuten
Este documento es el resultado de la recopilacioacuten de los documentos escritos durante el desarrollo de lapraacutectica de sistemas basados en el conocimiento el cuatrimestre de otontildeo del curso 2007-2008
El objetivo de estos documentos era recoger las dudas frecuentes que se encuentra un alumno durante eldesarrollo de la praacutectica de SBCs y consejos praacutecticos que puedan ayudar en el desarrollo
Este documento recoge principalmente dudas frecuentes sobre el entorno CLIPS y su lenguaje de progra-macioacuten
5
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 959
6 Capiacutetulo 1 Introduccioacuten
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1059
2 Protegravegegrave
Para saber como funciona Protegravegegrave usad la ayuda de la aplicacioacuten y el material correspondiente estascuestiones se refieren a como integrar lo que se desarrolla en Protegravegegrave con CLIPS
21 Coacutemo cambiar el nombre de las instancias en Protegravegegrave
En realidad no se trata de cambiar el nombre de las instancias sino de darle algo maacutes visual que unnuacutemero para poder hacer las relaciones Si os encontraacuteis en la pestantildea de crear instancias el uacuteltimo botoacutenes una flecha hacia abajo Darle y luego set display slots Ahiacute debeacuteis indicar con que slot quereacuteis referenciarla instancia
22 Com exporto una ontologia de Proteacutegeacute a CLIPS
A Proteacutegeacute ves a File rarr Export to Format rarr CLIPS Un cop fet aixograve es crearan dos nous fitxers ambles classes i instagravencies de lrsquoontologia (nompont i nompins respectivament)
Despreacutes obre aquests dos fitxers amb un editor de text i copia el seu contingut al fitxer CLIPS de laseguumlent manera
copy-paste de nompont
(definstances instanciescopy-paste de nompins)
23 iquestCoacutemo exporto una ontologiacutea de Proteacutegeacute a CLIPS (2a posibilidad)
Alternativamente a hacer corta y pega de los ficheros de protege en el fichero de CLIPS se puede crearun fichero que cargue todos los ficheros sin tener que juntarlos
Para ello hay que crear un fichero que incluya las oacuterdenes de carga de los diferentes ficheros Por ejemplopodemos llamar a este fichero cargaclp El contenido de este fichero seraacute
(load PATHnompont)(load-instances PATHnompins)(load PATHfichero-de-reglasclp)
Donde PATH es el directorio donde se encuentran vuestros ficherosEste fichero se ha de cargar desde el inteacuterprete mediante la orden batch ((batch cargaclp)) o con
la opcioacuten de menuacute load batch Usando la instruccioacuten load-instances evitamos tener que antildeadir al fichero de instancias la instruccioacuten
definstances
24 Per quegrave em doacutena error CLIPS al tenir una instancia que hereta de meacutesdrsquouna classe
7
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1159
8 Capiacutetulo 2 Protegravegegrave
Proteacutegeacute permet lrsquoheregravencia muacuteltiple en instagravencies perograve CLIPS no En CLIPS nomeacutes poden tenir heregravenciamuacuteltiple las classes perograve no les instagravencies Aixoacute es aixiacute perque el lenguatge de CLIPS es orientat a objectesno es realment un lenguatge drsquoontologiacutees
La manera meacutes senzilla de simular-ho si les clases no tenen ancestres comuns eacutes tenir classes que repre-sentin aquesta heregravencia muacuteltiple i fer que les instagravencies pengin drsquoelles que es com es faria a un llenguatge
orientat a objectesEn el cas de tenir ancestres comuns no es pot fer lrsquounica manera es duplicar la instancia amb nomsdiferents i penjar-les de les clases on es vol tenir-la
De totes maneres el CLIPS permet recuperar fagravecilment les instagravencies que tenen un valor especiacutefic en unslot pel qual el meacutes senzill eacutes tenir una uacutenica jerarquia i incloure altres possibles classificacions com a slotsencara que obviament perdrem la posibilitat de fer servir una jerarquia de valors per aquest
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1259
3 CLIPS
31 Instalacioacuten del CLIPS
311 iquestCoacutemo instalar CLIPS
La herramienta CLIPS es multiplataforma y esta disponible para los tres SO maacutes utilizados MicrosoftWindows Linux y Mac OS X
iquestCoacutemo instalar CLIPS en Windows
Primero de todo debemos bajarnos el programa de la paacutegina oficial de CLIPS accesible desde este link
(httpclipsrulessourceforgenet) Desde el aacuterea de descarga os podreis bajar el instalador parawindows
iquestCoacutemo instalar CLIPS en Linux
En muchas distribuciones de Linux CLIPS esta disponible como un paquete adicional el paquete sueleinstalar la versioacuten con interfaz graacutefico Si no encuentras el paquete especiacutefico para la distribucion que usassiempre puedes compilarlo a partir del paquete con los fuentes
Tambieacuten estaacute la posibilidad de utilisar el emulador de windows WINE Una vez instalado el emulador sepuede instalar CLIPS y este funcionaacute igual que sobre windows
iquestCoacutemo instalar CLIPS en Mac OS X
Primero de todo debemos bajarnos el programa de la paacutegina oficial de CLIPS accesible desde este link(httpclipsrulessourceforgenet ) Desde el aacuterea de descarga podeis bajar el intalador para MACOS X
312 Entorn finestres VS Consola de comandes
Encara que lrsquoentorn de finestres eacutes molt meacutes intuiumltiu CLIPS a la seva versioacute en liacutenea de comandes eacutes moltmeacutes ragravepid (segurament perquegrave no ha de mostrar en tot moment lrsquoagenda de fets les instancies les regles
etc)La diferencia de velocitat eacutes molt notable en cas de problemes de rendiment o de sensacioacute que lrsquoentorn
de finestres es queda penjat (o directament es tanca sense previ aviacutes) recomanem provar la versioacute en liacuteneade comandes
32 Los hechos
321 iquestQueacute es un hecho en CLIPS
Conceptualmente un hecho representa un dato abstracto del cual almacenamos valores Se puede vercomo una lista de campos donde el primer campo hace referencia al ldquodatordquo al cual le asignamos una listade valores que le suceden teniendo una relacioacuten entre siacute
Formalmente el primer campo es un siacutembolo y los campos restantes son valores
9
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1359
10 Capiacutetulo 3 CLIPS
(siacutembolo valor1 valor2 valorN)
322 iquestQueacute es un hecho ordenado (order Facts)
Un hecho ordenado tienen formato libre por lo tanto no existe restriccioacuten alguna en el orden de los campos
Los campos de un hecho ordenado pueden ser de cualquier tipo primitivo de datos excepto el primero quedebe ser un siacutembolo Como ejemplo tenemos
1 (hermanos Antonio Javier Carlos)2 (padre Pedro David)
323 iquestQueacute es un hecho no ordenado (deftemplates facts)
A traveacutes de los hechos no ordenados podemos abstraernos de la estructura de un hecho asignado unnombre a cada campo (slots)
1 (deftemplate nombre-template comentario2 (slot nombre-slot (tipo-del-slot))3 (multislot nombre-slot (tipo-del-slot))4 )
Por ejemplo
1 (deftemplate avioacuten2 (slot nombre_avion (type STRING))3 (slot compania (type STRING))
4 (slot numero_plazas (type INTEGER) (default 100))
324 iquestPuedo tener un vector como slot
Si debe declararse como multislot
325 iquestPuedo asignar propiedades a los slots
Siacute las maacutes importantes son
Type El tipo de dato primitivo que contiene (en mayuacutesculas)
Allowed-X Permite especificar un conjunto de valores permitidos Siendo X un tipo de datos primitivo(en minuacutesculas y plural) rarr si el slot toma un valor del tipo X debe pertenecer a los valores permi-tidos X puede ser values especificando entonces todos los valores posibles que puede tomar el slotindependientemente del tipo de dato
Range Especifica un rango para slots numeacutericos
Cardinality Nuacutemeros miacutenimo y maacuteximo de elementos que puede tener un multislot
Default Valor por defecto Si ponemos NONE como valor por defecto significaraacute que no se podraacute crear la
instancia a no ser que se especifique el valor de ese slot
1 (deftemplate estudiante2 (slot edad (type INTEGER) (range 0 99))
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1459
32 Los hechos 11
3 (multislot asignaturas (type STRING) (cardinality 1 5))4 (slot num-carreres (default 1))5 (multislot notas (allowed-strings MH NP))6 )
326 iquestQueacute debo utilizar hechos ordenados o no ordenados
Como se puede intuir si tenemos un conjunto de hechos los cuales conceptualmente pertenecen al mismoaacutembito seraacute una solucioacuten maacutes elegante agruparlos a traveacutes de un deftemplate En caso que tengamos quealguacuten hecho aislado seraacute mas sencillo declararlo como un hecho ordenado
327 Fets o Objectes
Veient la definicioacute de deftemplate podem confondrersquons a lrsquohora de decidir si fer servir fets o fer servirobjectes
Deixant de banda altres diferegravencies ja comentades (les classes suporten jerarquia de classes heregravenciaetc) els objectes es fan servir per representar el coneixement (mitjanccedilant un conjunt drsquoinstagravencies)
Aixiacute que generalment farem servir classes i objectes per representar coneixement mentre que farem servirels fets per portar control sobre lrsquoexecucioacute del problema
Per exemple podriacuteem definir un deftemplate per emmagatzemar un resultat o per poder controlar lrsquoestatde lrsquoexecucioacute
A la pragravectica de Mikeo (penjada a la web de lrsquoassignatura) teniacuteem un deftemplate habitacion-actual
1 (deftemplate habitacion-actual2 (slot habitacion)3 (slot area-restante)4
(slot presupuesto-restante)5 (slot precio-total)6 (slot prioridad-actual)7 )
Amb el qual controlagravevem la construccioacute drsquouna habitacioacute Assignagravevem una instagravencia de la classe habita-cioacute al slot habitacion de habitacion-actual i mitjanccedilant una segraverie de regles que feien unificacioacute ambhabitacion-actual actuagravevem sobre lrsquohabitacioacute drsquouna manera o drsquoun altre
328 Creacioacuten de hechos (assertdeffacts)
Si queremos crear un solo hecho utilizaremos el comando assert Por ejemplo (assert (casa roja))Si por el contrario queremos crear una estructura ordenada de hechos utilizaremos deffacts
(deffacts mishechos (casa roja) (pelota azul))
329 Modificar un fet
Per modificar un fet (per exemple molt uacutetil si estem treballant amb deftemplates) ho podem fer mitjanccedilant(modify ltINSTANCIAgtltFETSgt)
Per exemple si tingueacutessim el deftemplate persona
1 (deftemplate persona2 (slot nom)3 (slot edad)4 (slot dni)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1559
12 Capiacutetulo 3 CLIPS
I hagueacutessim afegit el fet
(assert (persona (nom Pepe)(edad 25)(dni 46974431)))
I el fet
(assert (aniversari 46974431))
Podriacuteem tenir la seguumlent regla
1 (defrule aniv2 aniversari lt- (aniversari dni)3 persona lt- (persona (edat edat)(dni dni))4 =gt5 (retract aniversari)6 (modify persona (edat (+ 1 edat)))7 )
La qual srsquoactivaragrave si hi ha un fet aniversari drsquouna persona Fent servir el dni indicat al fet aniversaribusquem el fet persona que teacute el mateix dni Deixem el valor edat a la variable edat per poder treballaramb ella meacutes endavant
Hem agafat tambeacute la direccioacute del fet aniversari per tal de poder esborrar-lo de la base de fets Aixograve srsquohafet per dues raons
Primer per mantenir meacutes neta la base de fets Segon i meacutes important Com que hem canviat el fet laregla tornaragrave a fer unificacioacute amb el fet (perquegrave ara eacutes diferent) amb la regla aniversari amb el que entrariadintre drsquoun bucle sense fi on srsquoaniria incrementant lrsquoedat de la persona
Un cop hem esborrat el fet aniversari incrementem en 1 el valor del slot edat de la persona fent servirla variable edat que hem declarat a la part esquerre de la regla
El comportament de modify es fer un retract del fet a la base de fets i despreacutes fer un assert amb els nous
valors Si volem canviar mes drsquoun slot del fet es convenient canviar-los tots a la vegada La raoacute es que cadavegada que fem un modify lrsquoapuntador al fet es modifica i lrsquoapuntador que tenim a la variable que hem fetservir ja no es vagravelid
Si no temim mes remei que fer la modificacioacute del fet pas a pas srsquoha de saber que la crida a modify retornalrsquoapuntador al nou fet Si el guardem a altra variable (o a la mateixa) podrem continuar modificant el fetamb la nova referegravencia
3210 Com elimino un fet de la base de fets
Per eliminar un fet de la base de fets ho podem fer amb la paraula clau (retract ltFETgt) on ltFETgt eacutes
un punter al fetPer obtenir aquest fet ho podem fer fent servir ltVARgtlt- ltFETgt a la part esquerre de la reglaPer exemple
1 (defrule accionsvent2 vent lt- (vent tipus)3 =gt4 (switch tipus5 (case poc then (assert (accio persiana0)))6 (case normal then (assert (accio persiana50)))7 (case molt then (assert (accio persiana100)))8 )9 (retract vent)
10 )
Afegiragrave fets per realitzar les accions pertinents i esborraragrave el fet de la base de fets
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1659
33 Variables 13
33 Variables
331 Variables a CLIPS
No cal declarar una variable (ni el seu tipus) nomeacutes cal afegir un interrogant al comenccedilament drsquoun simbol
per indicar que eacutes una variableCLIPS srsquoencarrega del control de tipus depenent del que assignem a la variablePer exemple testvar correspondria a la variable testvar Si per exemple assigneacutessim lrsquoenter 3 a
testvar CLIPS tractaria la variable com una variable entera
332 Com assignar un valor a una variable
Per assignar un valor a una variable es fa servir el megravetode (bind) amb la forma
(bind ltVARIABLEgtltVALORgt)
On ltVALORgt pot ser un valor o un megravetode que retorni un valor Per exemple si volem assignar un 4 a lavariable var
(bind var 4)
O per exemple podriacuteem assignar a la variable var la suma de 2 meacutes 2
(bind var (+ 2 2))
333 iquestCoacutemo declarar variables globales
Para crear una variable global hay que meterla dentro de la construccioacuten defglobal La declaracioacuten de la
variable seguiraacute el modelo nombreVariable = expresioacutenPor ejemplo
(defglobal presupuesto = 0)
Pueden aparecer en la parte izquierda de las reglas si no son utilizadas para asignar un valor y su cambiono activa reglas pero no pueden ser paraacutemetros de funciones ni meacutetodos
334 iquestCoacutemo trabajar con variables sumando restando por ejemplo contadores
La mejor forma es con variables globales se definen asiacute (defglobal x = 0) puede ser el valor quequeramos tanto nuacutemero string Y si queremos sumarle 10 por ejemplo
(bind x (+ x 10))
Las variables locales como por ejemplo x soacutelo tienen valor mientras dura su ejecucioacuten y eso suele ser enesa misma liacutenea o en un bucle Si le damos valor a x y luego preguntamos por ella nos diraacute que no existe
335 Quina diferegravencia hi ha entre les variables del tipus nom_variable i les del tipus $nom_variable
Les primeres contenen un sol valor i les segones en poder contenir meacutes drsquoun (o cap)
336 Quegrave significa lrsquointerrogant () quan va sol
Eacutes una variable anogravenima Pots utilitzar sense posar-hi cap nom si no trsquointeressa el valor en concret Perexemple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1759
14 Capiacutetulo 3 CLIPS
(Primer filtre_preu )
Aquesta condicioacute significa ldquosi el fet (Primer filtre_preu) teacute algun valorrdquo O sigui que si tingueacutessimel fet (Primer filtre_preu ok) es compliria la condicioacute (i si en comptes de ldquookrdquo fos ldquopatatardquo tambeacute escompliria) En canvi si el fet fos uacutenicament (Primer filtre_preu) no es compliria la condicioacute
337 Quegrave significa el dogravelar ($) quan va sol
Eacutes com lrsquointerrogant perograve admet meacutes drsquoun valor Per exemple
(Primer filtre_preu $ ok)
donaragrave cert pels fets de lrsquoestil (Primer filtre_preu patata ok) (Primer filtre_preu hola ok)(Primer filtre_preu patata hola ok) (Primer filtre_preu ok) Eacutes a dir no importa els valors quehi hagi entre filtre_preu i ok si al final hi ha un ok
338 iquestComo puedo ver los hechos presentes en un momento determinado
Abriendo la Facts Window en Window de la barra de menuacute
34 Las reglas
341 iquestCoacutemo construir una regla
Para construir una regla utilizaremos la construccioacuten defrule
Sintaxis
(defrule ltnombre-reglagt [ltcomentariogt][ltdeclaracioacutengt]ltelemento-condicioacutengt Parte izquierda (LHS)
=gtltaccioacutengt) Parte dcha (RHS) de la regla
Una regla consta de un conjunto de condiciones (antecedente) tambieacuten denominados elementos condicio-nales (EC) o parte izquierda (LHS) y de un conjunto de acciones (consecuente) tambieacuten denominado partederecha de la regla (RHS) La regla se activaraacute siempre que se satisfagan todos los EC mediante hechos oinstancias que los cumplan
Si se introduce en la base de reglas una nueva regla con el mismo nombre que el de una existente la nuevaregla reemplazaraacute a la antigua
Si una regla no tiene parte izquierda es decir no tiene elementos condicionales entonces el hecho(initial-fact) actuaraacute como el elemento condicional para ese tipo de reglas y la regla se activaraacute cadavez que se ejecute un comando reset
342 iquestCoacutemo gestionar la parte izquierda (LHS) de una regla
Declarar hechosSi no se especifica ninguna condicioacuten la regla se activaraacute siempre Una condicioacuten puede ser un simple hecho
(Ej vegetariano) o un hecho ordenado con unos valores concretos (Ej (persona (nombre Juan))) Si loque queremos es obtener el valor de un hecho insertaremos una variable en su lugar (Ej (persona (nombre
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1859
34 Las reglas 15
n)) ) Entonces entraraacute en la regla para cada valor posible que pueda asignar a la variable n a partir delos hechos
Si queremos indicar cualquier valor utilizaremos el siacutembolo y para cualquier lista el siacutembolo $ (Ej(evento ) (estilo $) ) Tambieacuten existe la opcioacuten de guardar en una variable una referencia al objetoEllo se consigue poniendo var lt- a su izquierda (Ej p lt- (persona (nombre Juan))) Se puede usarpor ejemplo para pasaacuterselo de paraacutemetro a una funcioacuten llamada en la RHS
Establecer condiciones
Ademaacutes podemos especificar restricciones adicionales sobre los valores que puede tomar un campo de unhecho Existen tres tipos principales de restricciones Conectadas (por orden de precedencia o prioridad)
not (~) Evita que cierto campo cumpla determinada restriccioacuten
and (amp) Combina dos restricciones conjuntivamente
or (|) Combina dos restricciones disjuntivamente
De predicado () Obliga a que cierto campo cumpla determinada condicioacuten (especificada por el predicado)
Por valor devuelto por una funcioacuten = Permite llamar a una funcioacuten y utilizar el valor devuelto pararestringir el valor que pueda tomar un campo de un hecho
Se puede comprobar si se cumple una determinada condicioacuten mediante el constructor test Dentro detest se pueden hacer llamadas a cualquier funcioacuten o predicado ya sea primitiva de CLIPS o definidapor nosotros
Combinar elementos
Los diferentes elementos de la parte izquierda van impliacutecitamente unidos mediante una AND que indicaconjuncioacuten No obstante podemos hacerlo expliacutecitamente mediante (and (cond1) (cond2)) aunque suelen
utilizarse para anidar ANDs dentro de ORsOR Sirve para hacer una disyuncioacuten (or (cond1) (cond2)) Es equivalente a escribir varias reglas en lasque cada una de ellas tenga uno de los componentes del OR en su parte izquierda y la misma parte derecha
NOT Sirve para detectar si no existe un determinado hecho (Ej (not (estilo sibarita)))exists Cuando a un conjunto de elementos se le antecede exists se comprueba que hay al menos un
hecho en la base de hechos que cumpla la condicioacuten (Ej (exists(bebida precio (ltprecio 5))) )forall Permite comprobar si todos los hechos que satisfacen un determinado patroacuten cumplen una serie
de condiciones (Ej (forall(plato (estilo moderno)))
343 iquestCoacutemo obtener la direccioacuten de hechos o instancias situados en LHS
En algunas ocasiones vamos a necesitar realizar alguacuten tipo de accioacuten en la parte derecha de las reglassobre hechos o instancias que cumplan unas determinadas condiciones Pero para ello necesitaremos primerotener acceso a estos elementos para despueacutes poder operar sobre ellos Esto lo conseguiremos guardando ladireccioacuten del elemento en una variable hacieacutendolo del siguiente modo
variable_direccion lt- (elemento)
Pongamos un ejemplo para ver realmente el funcionamiento y uso de esta posibilidad que CLIPS nosofrece
1 (defrule imprime-area2 instancia lt- (object (is-a Rectangulo))3 =gt4 (printout t Area del rectangulo (instance-name instancia)5 (send instancia calcula-area) crlf)6 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1959
16 Capiacutetulo 3 CLIPS
Cuando se ejecuta esta regla se imprimiraacuten las aacutereas de todas las instancias de la clase Rectangulo Enla parte izquierda de la regla lo que hacemos es guardar en la variable instancia la direccioacuten de la instanciade Rectangulo que estamos tratando en ese momento La regla se ejecutaraacute para todas las instanciasalmacenadas en la memoria de trabajo que cumplan la condicioacuten (is-a Rectangulo) es decir para todaslas instancias de la clase Rectangulo En la parte derecha de la regla donde se ejecutan las acciones podemosver que se imprimiraacute para cada instancia lo siguiente Area del rectangulo [nombre_instancia] aacuterea
del rectaacutengulo La funcioacuten instance-name nos devuelve el nombre de la instancia que le pasamos porparaacutemetro Ademaacutes hemos llamado al gestor de mensajes calcula-area para que nos devuelva el area delrectaacutengulo
344 iquestCoacutemo hacer sentencias or en la izquierda de las reglas
Con (or ) Si por ejemplo tenemos dos hechos (a) y (b) y queremos ejecutar la derecha de la reglacuando se cumpla uno de los dos tendremos que hacer (or (a) (b)) Atencioacuten porque la parte derecha seejecutaraacute tantas veces como veces se cumpla cada uno de los hechos si para nosotros existe tanto (a) como(b) la parte derecha se ejecutaraacute dos veces Para que soacutelo se usa una vez podemos hacer combinaciones de
or y and (funciona igual) o usar un patroacuten por ejemplo (persona Juan|Pedro) soacutelo se ejecutariacutea una vez
345 Com afegir una condicioacute a la part esquerre drsquouna regla
A vegades eacutes necessari que una regla srsquoinstanciiuml si es produeix una condicioacute especial (i no un fet) Per feraixoacute farem servir la comanda (test ltCONDICIOgt)
Per exemple imaginem que la nostre base de fets compte amb un fet (preu valor) amb un preudeterminat Imaginem que volem una regla que srsquoinstanciiuml quan aquest valor eacutes meacutes gran que 30
Per fer-ho fent servir tot el que hem explicat
1 (defrule preucar2 (preu preu)3 (test (gt preu 30))4 =gt5 (printout t El preu es mes gran que 30)6 )
Eacutes a dir si el preu eacutes meacutes gran que 30 srsquoimprimiragrave un missatge per pantallaAquestes condicions poden contenir ANDs i ORs de varies condicionsPer exemple
1 (defrule preulimit2 (preu preu)3 factminim lt- (preuminim minim)4 factmax lt- (preumaxim maxim)5 (test (and (gt preu minim) (lt preu maxim) ))6 =gt7 (retract factminim)8 (retract factmax)9 (printout t El preu estagrave dintre del rang)
On comprovarem si el preu estagrave dintre drsquoun rang determinat i en aquest cas esborra els fets que contenen
el magravexim preu i el miacutenim preu i mostra un missatge per pantalla
346 Puede una misma regla ejecutarse maacutes de una vez
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2059
34 Las reglas 17
Es muy importante entender que cada regla se ejecutaraacute una vez por cada combinacioacuten de valores en suLHS
1 (defrule regla2 (color col)3 (peso pes)4 =gt5
Si tengo tres colores y dos pesos asertados la regla se ejecutaraacute 6 veces una con cada combinacioacuten decolor y peso
347 Com puc definir lrsquoordre de les regles
La idea drsquoun sistema basant en regles eacutes no definir un ordre lineal drsquoaquestes (costa deixar de pensar de
forma iterativa)En el cas de necessitar que una regla srsquoexecuti despreacutes drsquouna altre pots fer servir Fets la regla anteriorcrea un fet que la segona regla tindragrave a la part esquerra
1 (defrule pregunta12 =gt3 (assert (pregunta1Feta))4 5 )6
7 (defrule pregunta2
8 (pregunta1Feta)9 =gt
10 11 )
I finalment pots usar la propietat salience Aquesta propietat indica la prioritat drsquoexecucioacute de les regles( les regles amb salience majors srsquoexecutaran abans ) Pot prendre valors positius i negatius entre -10000 y+10000 Per defecte les regles tenen salience 0
1 (defrule pregunta12 (declare (salience 2))3 =gt4 5 )6
7 (defrule pregunta28 (declare (salience 1))9 =gt
10 11 )
El valor indicado en la propiedad salience puede ser el nuacutemero directamente o una expresioacuten por ejemplovariable10 podemos usar variable para elegir que regla se ejecutaraacute
Las prioridades deben ser usadas solo para determinar el orden en el que se disparan algunas reglas sobreotras no para fijar el flujo de control ya que la principal ventaja de un sistema basado en reglas es larepresentacioacuten declarativa del conocimiento y de esta forma abusando de las prioridades conduce a unsistema procedimental
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2159
18 Capiacutetulo 3 CLIPS
348 Com forccedilar que una regla sigui la primera
Per que aquesta regla sigui la primera ha de tenir el salience meacutes gran de totes
1 (defrule presentacio2 (declare (salience 20))3 =gt4 (printout t ------ Benvingut ----- crlf)5 )
349 Vull guardar certs valors que es fan servir durant lrsquoexecucioacute de diferents regles Com hopuc fer
Tens principalment dues alternatives Si el valor eacutes un tipus bagravesic pots fer servir una variable global ambla sintaxi seguumlent
(defglobal nom_variable = valor)
Aquesta sentegravencia no va a dins de cap funcioacute ni regla es posa sola a la part que creguis convenient delcodi Vegem un exemple
(defglobal preu_minim_primer = 1000)
Per fer-la servir es fa exactament de la mateixa manera que amb una variable normal perograve has de posarels dos asteriscs Per exemple
(bind preu_minim_primer curr-preu)
Per altra banda si el valor o valors que vols guardar han de ser instagravencies una bona estrategravegia pot serutilitzar un deftemplate Eacutes uacutetil sobretot per anar guardant solucions temporals o llistes drsquoelements quepoden formar part de la solucioacute
Per utilitzar-ho has de seguir els passos seguumlents
1 Definir el deftemplate
(deftemplate nom_del_deftemplate(multislot nom_multislot)
(slot nom_slot)
)
Amb un exemple es veuragrave meacutes clar
(deftemplate llista-plats(multislot primers)(multislot segons)(multislot postres)
)
2 Inicialitzar el deftemplate
(defrule[condicions vagraveries] La condicioacute base eacutes que llista-plats no srsquoha inicialitzat encara
(not (llista-plats))=gt
llista conteacute els valors de llista-plats (que de moment estan buits)(bind llista (assert (llista-plats)))
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2259
35 Las clasesinstancias 19
3 Assignar-li valors
(bind segons_plats (find-all-instances ((plat Plat)) TRUE)(modify llista (segons segons_plats))
4 Recuperar els valors
(defrule[condicions vagraveries]llista lt- (llista-plats (segons $segons_plats))
=gt
Ara la variable $segons_plats conteacute tots els elements de segons
35 Las clasesinstancias
351 Tengo que representar la jerarquiacutea de un frame iquestEs preferible antildeadir las subclases a laontologiacutea o bien diferenciarlas mediante un slot en la superclase
Las dos formas son vaacutelidas pero es recomendable representarlas en clases separadas cuando se vayan abuscar instancias de ese tipo ya que asiacute no tendremos que hacer un recorrido por todas las de la superclaseNo obstante si soacutelo se trata de una caracteriacutestica puntual del frame y no vamos a hacer buacutesquedas de unaexclusiva subclase entonces seraacute maacutes eficiente antildeadir un slot debido a su mejor accesibilidad
352 iquestQueacute es un objeto
Podriacuteamos decir que un objeto es un hecho no ordenado con herencia
353 iquestPorqueacute usar objetos en contexto de la praacutectica de CLIPS de IA
Como bien sabemos una parte de la praacutectica de SBCrsquos consisten en crear la ontologiacutea Esta ontologiacutease exporta para poder interactuar con CLIPS en formato pins y pont El archivo pont contendraacute ladeclaracioacuten de todas las clases creadas previamente por Protege (defclass ) El archivo pins contendraacute
todas las instancias de las clases declaradas en el archivo pont Como puede intuir el lector se necesitaraacuteinteractuar con los objetos previamente creados por Protegravegegrave
354 Como se definen las clases
Para definir las clases usaremos el constructor defclass
(defclass ltnombregt [ltcomentariogt](is-a ltnombre-de-superclasegt)[(role concrete | abstract)]
[(pattern-match reactive | non-reactive)]ltslotgt definicioacuten de los atributos de la clase
ltdocumentacioacuten-handlergt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2359
20 Capiacutetulo 3 CLIPS
En caso de desear que la nueva clase herede las propiedades de otra ya existente el nombre de esta deberaacuteespecificarse despues de is-a El rol determinaraacute si la clase es concreta (se puede instanciar) o abstracta(destinada a ser superclase) El pattern-match debe declararse como reactivo si se desea que las instanciasde la clase puedan unificar con los elementos objeto de las reglas (siacutembolo lt-) Los slots correspondena los atributos de la clase y los handlers a las funciones de eacutesta Los handlers se pueden declarar en ladeclaracioacuten de la propia clase pero se deben definir externamente Dado que no aporta ninguna ventaja
declararlos es recomendable definirlos directamente Noacutetese que todo aquello que estaacute entre corchetes ([])constituye informacioacuten adicional que no es obligatorio especificar
1 (defclass Persona2 (is-a Ser_Vivo)3 (role concrete)4 (single-slot edad5 (type INTEGER)6 (range 1 99)7 (cardinality 0 1)8 (create-accessor read-write)9 )
10 (multislot amigos11 (type INSTANCE)12 (allowed-classes Persona)13 )14 )
El comportamiento y declaracioacuten de los slots es ideacutentico al de los slots de los hechos ordenados Losatributos de tipo INSTANCE (referencian otras instancias) estan en formato INSTANCE-NAME
355 Com consulto una instagravencia a partir drsquouna regla
Podem fer servir la part esquerre drsquouna regla per trobar instagravencies Lrsquouacutes eacutes molt semblant a trobar elpunter a un fet fent servir
(object [(is-a ltNOM_CLASSEgt)|(name ltNOM_INSTANCIA)|(ltNOM-SLOTgt ltVALORVARIABLE))])
Per exemple si volem que una regla srsquoinstanciiuml si tenim instanciat un plat de la classe Plat podriem ferservir
1 (defrule tenimplat2 plat lt- (object (is-a Plat))3 =gt4 (print t (send plat get-nom) crlf)
La regla imprimiragrave el nom del plat que trobi Eacutes important notar que srsquoactivaragrave per cada instagravencia de platque tinguem a la base de coneixement
Podem consultar els valors de la instancia fent servir condicions a la part esquerre de la regla Per exemplesi nomeacutes volgueacutessim els plats amb un preu meacutes gran que 30
1 (defrule platCar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Srsquoactivaragrave per tots els plats amb un preu major a 30
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2459
35 Las clasesinstancias 21
Srsquoha drsquoanar amb cura per aquest tipus de regla ja que si la base de coneixement eacutes molt amplia pot acabarderivant amb problemes de memograveria
Per exemple si en comptes de preguntar per una instagravencia de Plat pregunteacutessim per dues instancies dePlat
1 (defrule platsCars2 plat1 lt- (object (is-a Plat) (Preu p1))3 plat2 lt- (object (is-a Plat) (Preu p2))4 (test (gt p1 30))5 (test (gt p2 30))6 =gt7 (print t (send plat1 get-nom) i (send plat1 get-nom) soacuten cars8 crlf)9 )
Faria unificacioacute amb totes les combinacions possibles (amb repeticions) de dos plats de tota la base deconeixement Aixograve es podria anar ampliant fins fer-se intractable
Si tenim drsquoalguna manera el nom de la instancia podem fer
1 (defrule platPicant2 (cuina (plat p))3 (object (name p) (picant pi))4 =gt5 (print t picant pi crlf)6 )
Aixoacute es pot servir per crear condicions que facin servir noms drsquoinstancies que tenim almacenats a slotsdrsquoaltres instancies per exemple
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send v get-Preu) crlf)6 )
Aquesta regla imprimiria el preu del vi asociat al plat si es negre
356 Tengo problemas en condiciones de reglas con slots de instancias obtenidos con send
A veces dan problemas las reglas en las que las condiciones sobre los valores de los slots de una instanciase escriben usando mensajes get sobre los atributos de una instancia en lugar de utilizar patrones paraobtenerlos por ejemplo la regla
1 (defrule platcar2 plat lt- (object (is-a Plat) )3 (test (gt (send plat get-Preu) 30))4 =gt5 (print t (send plat get-nom) es car6 crlf)7 )
No funciona correctamente en CLIPS pero la regla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2559
22 Capiacutetulo 3 CLIPS
1 (defrule platcar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Siacute lo haceEn el caso de que el valor del slot sea booleano se puede escribir la regla como
1 (defrule platpicant2 plat lt- (object (is-a Plat) (Picant TRUE))3 =gt4 (print t (send plat get-nom) es picant crlf)
En el caso de que el slot sea a su vez una instancia se puede utilizar para obtener los valores de estainstancia en la condicion como se explica en la pregunta anterior
357 Tengo problemas con instancias obtenidas del slot de otra instancia en el patroacuten de unaregla
Este problema aparece cuando el patron de una regla instancia una variable a un nombre de instancia yesta no esta definida en el modulo de la regla por ejemplo si la regla siguiente pertenece a un modulo queno es el de la instancia
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4
=gt5 (print t preu (send v get-Preu) crlf)6 )
La regla se quejaraacute de que la instancia no existe al enviarle el send ya que solo se busca la instancia dentrodel moacutedulo de la regla y no en los importados Para arreglar esto se puede usar la funcioacuten (instance-address[ltMODULOgt|] ltINSTANCIAgt) que busca la direccion de la instancia en un modulo concreto o en todos losmoacutedulos que se importan () Deberiacuteamos entonces escribir la regla
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send (instance-address v) get-Preu) crlf)6 )
358 iquestCoacutemo realizar una buacutesqueda de instancias que cumplan unas restricciones
CLIPS nos ofrece varias funciones de buacutesqueda de instancias que cumplan unas determinadas restriccionesque a nosotros nos interese
La funcioacuten find-instance Esta funcioacuten devuelve la primera instancia que cumple todas las restric-ciones indicadas
La funcioacuten find-all-instances Esta funcioacuten devuelve todas las instancias que cumplen las restric-ciones indicadas
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2659
35 Las clasesinstancias 23
La sintaxis de ambas funciones es igual exceptuando el nombre de la funcioacuten(find-all-instances (clase_instancias) (restricciones))A continuacioacuten se muestran varios ejemplos
(bind rectangulos (find-all-instances ((inst Rectangulo)) (gtinstaltura 10))) Des-pueacutes de ejecutar esta funcioacuten en la variable rectangulos habraacute una lista con todas las instancias de la
clase Rectangulo cuya altura sea superior a 10(bind rectangulos (find-all-instances ((inst Rectangulo)) (and (gtinstaltura 10) (=instanchura 7)))) Este trozo de coacutedigo hace que en la variable rectangulos se guarde una listade las instancias de la clase Rectangulo que tienen una altura superior a 10 y una anchura igual a 7
Estas funciones que CLIPS nos ofrece tienen otra funcionalidad y es que podemos realizar buacutesquedas deconjuntos de instancias
(bind rectangulos (find-all-instances ((a Rectangulo) (b Rectangulo)) (= aalturabaltura))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas de instancias de laclase Rectangulo que tienen la misma altura
Por uacuteltimo es necesario comentar que se pueden realizar buacutesquedas de conjuntos de instancias que seande distintas clases
(bind figuras (find-all-instances ((rect Rectangulo) (circ Circulo)) (= rectalturacircradio))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas ltrectangulocirculogtque cumplan que la altura del rectaacutengulo sea igual al radio del ciacuterculo
Existen maacutes comandos para obtener instancias pero son menos utilizadas a nivel baacutesico como pueden serany-instancep do-for-instance do-for-all-instances y delayed-do-for-all-instances
359 iquestCoacutemo se interactuacutea con objetos
La interaccioacuten con objetos se efectuacutea mediante lo que se denomina mensaje
(defmessage-handlerltnombre-clasegtltnombre-mensajegt[lttipo-handlergt] [ltcomentariogt]ltparaacutemetrogt [ltparaacutemetro-comodiacutengt])ltaccioacutengt
)
Un gestor de mensajes consta de 7 partes
1 Nombre de clase a la que el gestor estaraacute asociado
2 Nombre del mensaje
3 Tipo de gestor (Nosotros habitualmente usaremos primary que viene por defecto)
4 Comentario (opcional)
5 Lista de paraacutemetros6 Paraacutemetro comodiacuten (para gestionar muacuteltiples paraacutemetros)
7 Secuencia de acciones o expresiones que seraacuten ejecutadas por el gestor
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2759
24 Capiacutetulo 3 CLIPS
Enfocado a la praacutectica de CLIPS la maacutes comuacuten es que queramos interactuar con objetos para
1 Imprimir los objetos Un ejemplo
1 (defmessage-handler avion imprimir-beneficio ()
2 Para implementar funciones calculadas asociadas al objeto Un ejemplo
1 (defmessage-handler avion calcular-beneficio ()2 ( selfplazas-ocupadas selfprecio-billete))3 )
Como se puede observar el paraacutemetro impliacutecito self contiene la instancia activa para este mensaje
3510 iquestComo se interactuacutea con las instancias de los objetos
Podremos interactuar entre las instancias de los objetos mediante la funcioacuten send
(send ltexpresioacuten-de-objetogtltnombre-de-mensajegtltexpresioacutengt)Donde se toman como argumentos el objeto destino del mensaje el mensaje mismo y otros paraacutemetros
que debieran ser pasados a los gestoresParticularmente en el aacutembito de la praacutectica usualmente necesitaremos utilizar el envioacute de mensajes de
tipo get put and delete Estos mensajes tiene la siguiente sintaxis
get-ltnombre-atributogt
put-ltnombre-atributogt
delete
Aquiacute tenemos un ejemplo de como utilizarlo recordando que ponemos entre corchetes la instancia la cualse enviacutea el mensaje
(defclass avion (is-a USER)(role concrete)(slot precio-billete (create-accessor read) (default 34))(slot plazas-ocupadas (create-accessor write) (default 0)))
Clase creada
gt(make-instance a of avion) Creacioacuten de una instancia de avion[a]
gt(send [a] get-precio-billete) Obtencioacuten de un slot34 Resultado obtenidogt(send [a] put-plazas-ocupadas 100) Modificacioacuten de un slotgt(send [a] delete) Eliminacioacuten de la instanciaTrue
3511 Uso de make-instance
Cuando queremos crear una instancia de una clase para ir rellenandola con los resultados o datos quevayamos obteniendo se haria lo siguiente
(bind variable_instancia (make-instance nombre_instancia of nombre_clase))
Una vez creada podemos jugar con dicha instancia en las diferentes reglas siempre que la llamemos enlos activadores
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2859
35 Las clasesinstancias 25
(defrule reglavar_instancia lt- (object (is-a nombre_clase))=gt
)
De esta manera dentro de la regla podemos hacer acciones con la instancia por ejemplo(send var_instancia put-articulo articulo_ejemplo)
3512 Como generar automaacuteticamente nombres de instancia
En ocasiones queremos crear instancias en reglas y queremos que su nombre sea distinto del de otrasque ya tenemos Para ello podemos utilizar las funciones gensym y gensym La primera genera un siacutembolodel estilo genN donde N es un nuacutemero La segunda hace lo mismo pero aseguraacutendose de que ese siacutembolono exista ya Se puede reiniciar el contador que usan estas dos funciones con el operador (setgen ltnumgt)donde ltnumgt es el nuacutemero por el que queremos que empiecen ahora los siacutembolos
Para usar esto para generar el nombre de una instancia podemos hacer
(make-instance (gensym) of ltclasegt)
Cada vez que se ejecute se generaraacute un nombre de instancia nuevoSi creamos instancias de diferentes clases y queremos que las instancias tengan nombres que podamos
identificar podemos concatenar siacutembolos a los siacutembolos generados por gensym por ejemplo
(make-instance (sym-cat pepe- (gensym)) of ltclasegt)
generaraacute una instancia con el nombre pepe-genN
3513 Com fer un getset drsquoun slot drsquouna classe
Per consultar el valor drsquoun slot drsquouna classe ho podem fer enviant-li un missatge de la seguumlent manera
(send ltVARIABLEgt get-ltNOM_ATRIBUTgt)
Per exemple si tenim una instagravencia de la classe Plat ( instancia ) i volem saber el valor del seu slotnom
(send instancia get-nom)
Per assignar un valor a un slot drsquouna drsquoinstagravencia hem drsquoenviar-li un missatge de la seguumlent manera
(send ltVARIABLEgt put-ltNOM_ATRIBUTgt ltVALORgt)On ltVALORgt pot ser un valor o un megravetode que retorni un valor
(send instancia put-nom nom)
3514 iquestCoacutemo acceder a una instancia cuyo nombre conocemos
Si conocemos el nombre de una instancia y necesitamos acceder a ella es decir necesitamos enviarle alguacutenmensaje mediante la funcioacuten send podemos hacerlo directamente escribiendo en lugar de la variable quealmacena la instancia el nombre de la instancia entre corchetes [ ] A continuacioacuten se muestra un ejemplo
(bind altura_rect1 (send [rect1] get-altura))
En este caso se guardaraacute en la variable altura_rect1 el valor de la altura de la instancia que tiene comonombre rect1
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2959
26 Capiacutetulo 3 CLIPS
3515 Obtenir el nom drsquouna classe
Si tenim una instagravencia drsquouna classe i volem saber el nom de la classe (uacutetil si tenim una bona taxonomiade classes) ho podem fer amb el megravetode (class ltINSTANCIAgt)
Si per exemple imaginem que tenim la classe Actor la qual teacute com subclasses la classe APrincipalASecundari i ACameo Imaginem que estem tractant amb instancies drsquoactors i volem saber si la instanciaque estem tractant es de la classe APrincipal
Ho hauriacuteem de fer de la seguumlent manera
(eq (class instancia) APrincipal)
Fixem-nos que APrincipal eacutes un siacutembol no un String (un truco eacutes fixar-se en que no teacute cometes) Si vol-gueacutessim comparar-ho amb un String (per exemple un String introduiumlt per lrsquousuari) ho podriacuteem transformara un String amb el megravetode str-cat
(eq (str-cat (class instancia)) Principal)
3516 Como convierto un INSTANCE-ADRESS en un INSTANCE-NAME
En alguacuten momento nos podemos encontrar con la situacioacuten de que disponemos de un puntero a unainstancia y necesitamos su nombre o lo contrario En ambos casos podemos usar la funcioacuten instance-nameSu funcionamiento es bidireccional podemos introducirle un instance-name y nos devolveraacute un instance-adress y viceversa
1 (defrule imprimir-nombre2 estlt-(object (is-a Estudiante) (edad 25))3 =gt4 (printout t (instance-name est) crlf)5
)
3517 Com iterar a traveacutes drsquoun multi-slot
El seguumlent tambeacute eacutes vagravelid com exemple de com iterar a traveacutes drsquouna llistaImaginem que tenim una instagravencia de la classe Plat a la varible (plat) la qual teacute un multi-slot drsquoinstagravencies
de la classe Ingredient Imaginem que volem imprimir per pantalla el nom drsquoaquests ingredients (slot nomde la classe Ingredient) Necessitarem iterar sobre la llista drsquoingredients
1 (bind i 1)2 (while (lt= i (length$ (send plat get-ingredients)))3 do4 (bind ingredient (nth$ i (send plat get-ingredients)))5 (printout t (send ingredient get-nom) crlf)6 (bind i (+ i 1))7 )
El megravetode (nth$ ltINDEXgtltLLISTAgt) et retorna lrsquoelement situat a INDEX de LLISTAEl megravetode (length$ ltLLISTAgt) retorna el nuacutemero drsquoelements de LLISTA
3518 Coacutemo modificarinsertarborrar valores en un multislot
Los valores de un multislot se pueden cambiar usando la funcioacuten slot-replace$ La sintaxis es la siguiente
(slot-replace$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt ltvalorgt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3059
35 Las clasesinstancias 27
Donde ltiniciogt y ltfingt son el rango de posiciones del multislot que se quiere modificar y ltvalorgtson los valores que queremos reemplazar Obviamente deberaacute haber tantos valores como posiciones hayamosindicado en el rango
Para insertar nuevos valores podemos usar la funcioacuten slot-insert$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltposgt ltvalorgt)
El valor se inserta delante de la posicioacuten indicada si la posicioacuten es mayor que la longitud del multislot secolocaraacute al final
Para borrar elementos de un multislot podemos usar la funcioacuten slot-delete$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt)
Se borraraacuten los elementos que estaacuten en el rango indicado
3519 Coacutemo recorrer un atributo multievaluado
Supongamos que la variable respuesta tiene una lista de instancias
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 aquiacute hacemos lo que queramos4 )5 )
Loop-for-count funciona como un for primero la variable que haraacute de contador luego el valor de origeny luego el valor final Para controlar el final usamos la funcioacuten que he explicado antes i tomaraacute valoresdesde 1 hasta n asiacute que usando la funcioacuten nth$ obtendremos cada uno de los elementos La variable auxiraacute teniendo cada uno de los valores
3520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz)
Es igual que antes pero con dos bucles
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 (bind aux2 (send aux get-slot_que_queremos))4 (loop-for-count (j 1 (length$ aux2)) do5 (bind aux_final (nth$ j aux2))6 aquiacute ya podemos trabajar con el elemento en concreto7 )8 )
Supongamos que respuesta tiene una lista de instancias con el primer bucle haremos lo mismo que antes ir
iterando por esas instancias Una vez que tenemos cada instancia con aux2 con el segundo bucle iteraremosdentro de sus instancias interiores
Por ejemplo si tenemos varios equipos de fuacutetbol y cada equipo tiene varios jugadores en el primer bucleestamos iterando entre los equipos y en el segundo entre los jugadores de cada equipo en particular
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3159
28 Capiacutetulo 3 CLIPS
3521 Com puc esborrar una instagravencia
Per esborrar una instagravencia (per exemple segons la informacioacute que proporcioni lrsquousuari podem deduir queuna segraverie drsquoinstagravencies eacutes impossible que es facin servir per a la solucioacute) ho podem fer enviant un missatgedelete a la instagravencia eacutes a dir (send ltINSTANCIAgtdelete)
(send inst delete)
Un megravetode que podria ser uacutetil de la cara a la pragravectica podria ser el seguumlent
1 (defrule elimina-instancia2 (declare (salience 10))3 elimina-fact lt- (elimina-inst inst)4 =gt5 (send inst delete)6 (retract elimina-fact)
Imaginem que per exemple que volem eliminar una llista drsquoinstagravencies Per eliminar-les podriacuteem recoacuterrerel llistat marcant les instagravencies que volem esborrar afegint el seguumlent fet
(assert (elimina-instancia inst))
Aixiacute com que elimina-instancia teacute un salience alt esborraria les instagravencies marcades quan tingueacutes ocasioacuteDrsquoaquesta manera ens estalviem el problema de recoacuterrer un llistat drsquoinstagravencies amb un iterador mentre
anem eliminant els elements de la llista cosa que pot donar problemes amb lrsquoiterador
3522 Com imprimir una instagravencia
Per imprimir una classe (uacutetil per exemple per mostrar el resultat final) el millor eacutes definir message-handlersPer exemple imaginem que tenim una classe Plat la qual teacute un slot nom de tipus String Si volgueacutessimimprimir per pantalla un missatge que digueacutes
El nom del plat eacutes ndashltnom del platgtndash
Hauriacuteem de definir un message-handler que simplement imprimiacutes per pantalla el valor de lrsquoslot de laforma
(defmesssage-handler ltCLASSNAMEgt ltMESSAGENAMEgt primary ()ltCODIgt
)
Per el cas de lrsquoexemple
1 (defmessage-handler Plat print primary ()2 (printout t -- selfnom --) )3 )
Per cridar-ho nomeacutes caldragrave enviar-li un missatge a la instagravencia amb el nom del message-handler (enaquest cas print)
(send instancia print)
Un message-handler pot cridar a altres message-handlers amb el que es poden encadenar diverses instagraven-cies Per exemple imaginem que tenim la classe Menuacute la qual teacute un atribut plats que eacutes un llista drsquoinstagravenciesde la classe Plat Dintre del message-handler menuacute podriacuteem iterar a traveacutes de la llista de plats enviant elmissatge print que hem definit anteriorment
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3259
36 Programacioacuten 29
3523 Com es navega entre instagravencies relacionades
Per exemple tinc una instagravencia iA que teacute un slot anomenat slotB que eacutes una instagravencia drsquoun frame B Vullsaber el nom de la instagravencia associada al slotB de iA Ho pots fer aixiacute
(bind B (send iA get-slotB))(bind res (send B get-nom))
Si estagraves dins drsquouna condicioacute ho pots simplificar de la forma seguumlent
(bind res (send iAslotB get-nom)
Els dos punts soacuten equivalents al punt de Java
36 Programacioacuten
361 Com introduir un comentari
Els comentaris a CLIPS va darrere de un com per exemple
Comentari
Tambeacute podem afegir comentaris a les nostres regles deffacts deftemplates etc Generalment van darrereel nom de la estructura per exemple
1 (defrule neteja regla per la qual si la cuina estagrave bruta srsquoafegiragrave una tasca de2 neteja
3 (estat-cuina bruta)4 =gt5 (assert (tasca netejar))6 )
362 Referenciar el valor null a CLIPS
Per referenciar el valor null a clips es fa amb el simbol nil Per exemple si volem saber si una instagravenciainst es null ho podriacuteem fer de la seguumlent manera
(eq inst nil)
363 Formas de recorrer una lista
Para recorrer una lista disponemos de diferentes opciones en este FAQ explicaremos como crear unaestructura tipo ldquoWHILErdquo y tipo ldquoFORrdquo
1 While Esta regla se ejecuta hasta que la expresioacuten a evaluar sea falsa Este tipo de estructura se rigepor seguir la sintaxis while - do y se construiriacutea de la siguiente forma
(while ltexpresioacutengt[do] ltaccioacutengt)
Doacutende dependiendo del valor de ltexpresioacutengt
Valor TRUE Se realizaraacute la accioacuten ltaccioacutengt i se volveraacute a evaluar ltexpresioacutengt
Valor FALSE No se ejecutaraacute la accioacuten ltaccioacutengt
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3359
30 Capiacutetulo 3 CLIPS
2 For Esta regla sirve para ejecutar un bucle N (final - inicio) veces Este tipo de estructura se rige porseguir la sintaxis loop-for-count y se construiriacutea de la siguiente forma
(loop-for-count (ltvargtltiniciogtltfinalgt) [do] ltaccioacutengt)
Doacutende
ltvargt Variable que se usara como iacutendice
ltiniciogt Valor inicial que tendraacute ltvargt
ltfinalgt Ultimo valor que tendraacute la variable ltvargt
ltaccioacutengt Accioacuten que es realizaraacute hasta que ltvargt tenga el valor de ltfingt
364 Formas de elegir una opcioacuten
En este apartado explicaremos como crear una estructura if y una estructura switch
If Este tipo de estructura se rige por seguir la sintaxis if - then - else y se construiriacutea de lasiguiente forma
(if ltexpresioacutengtthen ltaccioacutengt[else ltaccioacuten2gt])
Doacutende dependiendo del valor de ltexpresioacutengt
bull Valor TRUE Se realizaraacute la accioacuten ltaccioacutengtbull Valor FALSE Se realizaraacute la accioacuten ltaccioacuten2gt (en caso de haber)
Switch Este tipo de estructura se rige por seguir la sintaxis switch - opciones y se construiriacutea dela siguiente forma
(switch ltexpresioacuten-testgt(case OPCION1 then ACCION1)(case OPCION2 then ACCION2)
([default] ACCION-DEFAULT)
)
Doacutende dependiendo del valor de ltexpresioacuten-casegt se ejecutaraacute una ltaccioacutengt en particular Si nin-guna ltopcioacutengt es correcta se ejecutara la ltaccioacuten-defaultgt
365 Funciones con la clase String
Habitualmente trabajaremos con Strings o cadena de Strings CLIPS proporciona una serie de herramien-tas para trabajar con esta clase
1 Convertir string a MAYUacuteSCULAS A veces es conveniente tener todos los caracteres en mayuacutesculaspara no tener problemas de comparaciones o simplemente por convenio Para ello CLIPS dispone dela funcioacuten upcase la cual convierte a mayuacutesculas un siacutembolo o string
(upcase ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplos
(upcase Ccedillips es divertido) rarr CcedilLIPS ES DIVERTIDO
(upcase Clips_es_divertido) rarr CLIPS_ES_DIVERTIDO
2 Convertir string a MINUacuteSCULAS la funcioacuten es downcase
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3459
36 Programacioacuten 31
3 Concatenacioacuten de strings Tambieacuten es de gran utilidad poder juntar dos o maacutes paraacutemetros en un solostring Todo paraacutemetro a juntar deben ser de uno de los siguientes tipos symbol String integer floato instance-name
(str-cat parametro1 parametro2 parametroN )
Ejemplo
(str-cat IA nota 10) rarr IAnota10
4 Comparacioacuten de strings Funcioacuten que nos indica si dos strings son iguales
(str-compareltexpresioacuten-simboacutelica-o-de-cadenagtltexpresioacuten-simboacutelica-o-de-cadenagt
)
Esta funcioacuten devuelve
0 Si ambos strings son iguales1 Si el primer string es mayor que el segundo string-1 Si el primer string es menor que el segundo string
5 Longitud de un string Muchas veces es de gran utilidad saber que tamantildeo tiene un string
(str-length ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplo
(str-length Inteligencia Artificial) rarr 23
366 iquestCoacutemo obtener el contenido de una variable en un string
Para conseguir un string a partir de un integer float symbol instance-name debes utilizar el comandostr-cat Si a la funcioacuten le pasamos como paraacutemetros varios elementos los transformaraacute a string y losconcatenaraacute La sintaxis de esta funcioacuten es la siguiente (str-cat elementos) Esta funcioacuten la usaremossobre todo cuando queramos realizar comparaciones entre el contenido de una variable y un string ya quepreviamente necesitaremos usar la funcioacuten str-cat para pasar el contenido de la variable a string y realizarde este modo la comparacioacuten de forma correcta
367 iquestComo se crea una lista
Con create$ Todos los operadores sobre listas llevan el siacutembolo $ al final Igual que con las variables sedebe usar bind siempre que se desee modificar una lista
(bind lista (create$ a b c))
368 iquestComo borro un elemento de una lista
Con delete$Usa la siguiente sintaxis(delete$ ltlistagt ltindice-iniciogt ltindice-finalgt)Se borraraacuten todos los elementos del rango entre las posiciones inicio y final ambas incluidas Tambieacuten exis-
tedelete-member$ (delete-member$ ltlistagt ltelementogt) Borraraacute todas las apariciones del elemento enla lista
(delete$ (create$ a b c d e f) 3 5) minusrarr (a b f)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 459
Iacutendice general
1 Introduccioacuten 5
2 Protegravegegrave 721 Coacutemo cambiar el nombre de las instancias en Protegravegegrave 722 Com exporto una ontologia de Proteacutegeacute a CLIPS 723 iquestCoacutemo exporto una ontologiacutea de Proteacutegeacute a CLIPS (2a posibilidad) 724 Per quegrave em doacutena error CLIPS al tenir una instancia que hereta de meacutes drsquouna classe 8
3 CLIPS 931 Instalacioacuten del CLIPS 9
311 iquestCoacutemo instalar CLIPS 9312 Entorn finestres VS Consola de comandes 932 Los hechos 9
321 iquestQueacute es un hecho en CLIPS 9322 iquestQueacute es un hecho ordenado (order Facts) 10323 iquestQueacute es un hecho no ordenado (deftemplates facts) 10324 iquestPuedo tener un vector como slot 10325 iquestPuedo asignar propiedades a los slots 10326 iquestQueacute debo utilizar hechos ordenados o no ordenados 11327 Fets o Objectes 11328 Creacioacuten de hechos (assertdeffacts) 11
329 Modificar un fet 113210 Com elimino un fet de la base de fets 1233 Variables 13
331 Variables a CLIPS 13332 Com assignar un valor a una variable 13333 iquestCoacutemo declarar variables globales 13334 iquestCoacutemo trabajar con variables sumando restando por ejemplo contadores 13335 Quina diferegravencia hi ha entre les variables del tipus nom_variable i les del tipus
$nom_variable 13336 Quegrave significa lrsquointerrogant () quan va sol 13337 Quegrave significa el dogravelar ($) quan va sol 14
338 iquestComo puedo ver los hechos presentes en un momento determinado 1434 Las reglas 14
341 iquestCoacutemo construir una regla 14342 iquestCoacutemo gestionar la parte izquierda (LHS) de una regla 14343 iquestCoacutemo obtener la direccioacuten de hechos o instancias situados en LHS 15344 iquestCoacutemo hacer sentencias or en la izquierda de las reglas 16345 Com afegir una condicioacute a la part esquerre drsquouna regla 16346 Puede una misma regla ejecutarse maacutes de una vez 17347 Com puc definir lrsquoordre de les regles 17348 Com forccedilar que una regla sigui la primera 18349 Vull guardar certs valors que es fan servir durant lrsquoexecucioacute de diferents regles Com
ho puc fer 1835 Las clasesinstancias 19
351 Tengo que representar la jerarquiacutea de un frame iquestEs preferible antildeadir las subclases ala ontologiacutea o bien diferenciarlas mediante un slot en la superclase 19
1
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 559
2 Iacutendice general
352 iquestQueacute es un objeto 19353 iquestPorqueacute usar objetos en contexto de la praacutectica de CLIPS de IA 19354 Como se definen las clases 19355 Com consulto una instagravencia a partir drsquouna regla 20356 Tengo problemas en condiciones de reglas con slots de instancias obtenidos con send 21357 Tengo problemas con instancias obtenidas del slot de otra instancia en el patroacuten de
una regla 22358 iquestCoacutemo realizar una buacutesqueda de instancias que cumplan unas restricciones 22359 iquestCoacutemo se interactuacutea con objetos 233510 iquestComo se interactuacutea con las instancias de los objetos 243511 Uso de make-instance 243512 Como generar automaacuteticamente nombres de instancia 253513 Com fer un getset drsquoun slot drsquouna classe 253514 iquestCoacutemo acceder a una instancia cuyo nombre conocemos 253515 Obtenir el nom drsquouna classe 263516 Como convierto un INSTANCE-ADRESS en un INSTANCE-NAME 263517 Com iterar a traveacutes drsquoun multi-slot 263518 Coacutemo modificarinsertarborrar valores en un multislot 263519 Coacutemo recorrer un atributo multievaluado 273520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz) 273521 Com puc esborrar una instagravencia 283522 Com imprimir una instagravencia 283523 Com es navega entre instagravencies relacionades 29
36 Programacioacuten 29361 Com introduir un comentari 29362 Referenciar el valor null a CLIPS 29363 Formas de recorrer una lista 29
364 Formas de elegir una opcioacuten 30365 Funciones con la clase String 30366 iquestCoacutemo obtener el contenido de una variable en un string 31367 iquestComo se crea una lista 31368 iquestComo borro un elemento de una lista 31369 iquestComo inserto elementos en una lista 323610 iquestComo modifico elementos de una lista 323611 iquestComo averiguo el nuacutemero de elementos de una lista 323612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten 323613 iquestComo recorro todos los elementos de una lista 323614 Com trobar si un element forma part drsquouna llista 32
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot 323616 I si tinc un multislot i el vull transformar en un string 333617 iquestCoacutemo obtener un valor aleatorio 333618 Comparaciones 33
37 Los moacutedulos 33371 Quegrave eacutes un mogravedul en CLIPS 33372 Particioacuten en modulos 34373 iquestCoacutemo asignar una construccioacuten en un moacutedulo 34374 Com funcionen les clagraveusules export i import 34375 iquestCoacutemo cambio el moacutedulo actual 35
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS 3538 Funciones 36
381 iquestCoacutemo se crea una funcioacuten en CLIPS 36382 Explicacioacuten de la estructura de una funcioacuten en general 37
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 659
Iacutendice general 3
383 Com definir un paragravemetre drsquouna funcioacute com una llista 38384 Com puc utilitzar una funcioacute a la part esquerra de les regles 38
39 Entrada salida 38391 iquestCoacutemo se imprime por pantalla 38392 iquestAl imprimir por pantalla como hago un salto de liacutenea 39393 Com imprimeixo una liacutenia en blanc 39
394 Com llegir de la entrada standard 39395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeix
com un enter 40396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacute
drsquoentrada quants) com ho faig per assignar-los a un multislot 40310 Funciones uacutetiles 40
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles 403102 Obtener un valor numeacuterico comprendido en un rango 413103 Realizar una pregunta general 413104 iquestCoacutemo se realiza una pregunta binaria 413105 Encuentra la instancia con valor miacutenimo para un slot 41
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valor const 423107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li 433108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla 43
311 Ejecucioacuten de un programa CLIPS 433111 iquestCoacutemo cargamos un programa 433112 iquestCoacutemo probar tu coacutedigo en CLIPS 443113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten 443114 iquestCoacutemo parar una ejecucioacuten 443115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste 44
4 Consejos praacutecticos 45
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve no seacute ni per oncomenccedilar Algun consell 45
42 iquestComo estructuro una practica de CLIPS 4543 Com crear un flux de preguntes 46
431 Com puc ordenar aquest flux de preguntes 46432 I si vull saltar-me una pregunta 47433 Com inicialitzar el flux del programa 48
44 Uso de la funcioacuten modify para ir guardando resultados preferidos 4845 Creacioacuten de la plantilla de recomendacioacuten 49
5 Errores frecuentes 51
51 Quan obro un fitxer en CLIPS em dona un error 5152 Codificacioacute de caragravecters a CLIPS 5153 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots en Protegravegegrave cuando
las importo en CLIPS 5154 Tengo problemas con la hereacutencia de slots en las clases que he definido 5155 Quegrave significa lrsquoerror OBJRTBLD5 5256 Antes compilaba correctamente y ahora da warnings 5257 No puedo editar mi fichero en clips 5258 Redefining 5259 Problemas al consultar las instancias relacionadas con otras 52510 Unable to finde class X cuando definimos instancias 52
511 Expected the beginning of a construct (cuando definimos instancias) 53512 Compila pero no compara bien dos elementos 53513 Expected the beginning of a constructor 53514 Missing function declaration for defruledeffunction 53
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 759
4 Iacutendice general
515 Check appropiate syntax for ifswitchloop-for-count 54516 Problemas con pareacutentesis 54
6 Referencias 5561 On puc trobar informacioacute sobre el llenguatge CLIPS 5562 Otras referencias 55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 859
1 Introduccioacuten
Este documento es el resultado de la recopilacioacuten de los documentos escritos durante el desarrollo de lapraacutectica de sistemas basados en el conocimiento el cuatrimestre de otontildeo del curso 2007-2008
El objetivo de estos documentos era recoger las dudas frecuentes que se encuentra un alumno durante eldesarrollo de la praacutectica de SBCs y consejos praacutecticos que puedan ayudar en el desarrollo
Este documento recoge principalmente dudas frecuentes sobre el entorno CLIPS y su lenguaje de progra-macioacuten
5
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 959
6 Capiacutetulo 1 Introduccioacuten
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1059
2 Protegravegegrave
Para saber como funciona Protegravegegrave usad la ayuda de la aplicacioacuten y el material correspondiente estascuestiones se refieren a como integrar lo que se desarrolla en Protegravegegrave con CLIPS
21 Coacutemo cambiar el nombre de las instancias en Protegravegegrave
En realidad no se trata de cambiar el nombre de las instancias sino de darle algo maacutes visual que unnuacutemero para poder hacer las relaciones Si os encontraacuteis en la pestantildea de crear instancias el uacuteltimo botoacutenes una flecha hacia abajo Darle y luego set display slots Ahiacute debeacuteis indicar con que slot quereacuteis referenciarla instancia
22 Com exporto una ontologia de Proteacutegeacute a CLIPS
A Proteacutegeacute ves a File rarr Export to Format rarr CLIPS Un cop fet aixograve es crearan dos nous fitxers ambles classes i instagravencies de lrsquoontologia (nompont i nompins respectivament)
Despreacutes obre aquests dos fitxers amb un editor de text i copia el seu contingut al fitxer CLIPS de laseguumlent manera
copy-paste de nompont
(definstances instanciescopy-paste de nompins)
23 iquestCoacutemo exporto una ontologiacutea de Proteacutegeacute a CLIPS (2a posibilidad)
Alternativamente a hacer corta y pega de los ficheros de protege en el fichero de CLIPS se puede crearun fichero que cargue todos los ficheros sin tener que juntarlos
Para ello hay que crear un fichero que incluya las oacuterdenes de carga de los diferentes ficheros Por ejemplopodemos llamar a este fichero cargaclp El contenido de este fichero seraacute
(load PATHnompont)(load-instances PATHnompins)(load PATHfichero-de-reglasclp)
Donde PATH es el directorio donde se encuentran vuestros ficherosEste fichero se ha de cargar desde el inteacuterprete mediante la orden batch ((batch cargaclp)) o con
la opcioacuten de menuacute load batch Usando la instruccioacuten load-instances evitamos tener que antildeadir al fichero de instancias la instruccioacuten
definstances
24 Per quegrave em doacutena error CLIPS al tenir una instancia que hereta de meacutesdrsquouna classe
7
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1159
8 Capiacutetulo 2 Protegravegegrave
Proteacutegeacute permet lrsquoheregravencia muacuteltiple en instagravencies perograve CLIPS no En CLIPS nomeacutes poden tenir heregravenciamuacuteltiple las classes perograve no les instagravencies Aixoacute es aixiacute perque el lenguatge de CLIPS es orientat a objectesno es realment un lenguatge drsquoontologiacutees
La manera meacutes senzilla de simular-ho si les clases no tenen ancestres comuns eacutes tenir classes que repre-sentin aquesta heregravencia muacuteltiple i fer que les instagravencies pengin drsquoelles que es com es faria a un llenguatge
orientat a objectesEn el cas de tenir ancestres comuns no es pot fer lrsquounica manera es duplicar la instancia amb nomsdiferents i penjar-les de les clases on es vol tenir-la
De totes maneres el CLIPS permet recuperar fagravecilment les instagravencies que tenen un valor especiacutefic en unslot pel qual el meacutes senzill eacutes tenir una uacutenica jerarquia i incloure altres possibles classificacions com a slotsencara que obviament perdrem la posibilitat de fer servir una jerarquia de valors per aquest
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1259
3 CLIPS
31 Instalacioacuten del CLIPS
311 iquestCoacutemo instalar CLIPS
La herramienta CLIPS es multiplataforma y esta disponible para los tres SO maacutes utilizados MicrosoftWindows Linux y Mac OS X
iquestCoacutemo instalar CLIPS en Windows
Primero de todo debemos bajarnos el programa de la paacutegina oficial de CLIPS accesible desde este link
(httpclipsrulessourceforgenet) Desde el aacuterea de descarga os podreis bajar el instalador parawindows
iquestCoacutemo instalar CLIPS en Linux
En muchas distribuciones de Linux CLIPS esta disponible como un paquete adicional el paquete sueleinstalar la versioacuten con interfaz graacutefico Si no encuentras el paquete especiacutefico para la distribucion que usassiempre puedes compilarlo a partir del paquete con los fuentes
Tambieacuten estaacute la posibilidad de utilisar el emulador de windows WINE Una vez instalado el emulador sepuede instalar CLIPS y este funcionaacute igual que sobre windows
iquestCoacutemo instalar CLIPS en Mac OS X
Primero de todo debemos bajarnos el programa de la paacutegina oficial de CLIPS accesible desde este link(httpclipsrulessourceforgenet ) Desde el aacuterea de descarga podeis bajar el intalador para MACOS X
312 Entorn finestres VS Consola de comandes
Encara que lrsquoentorn de finestres eacutes molt meacutes intuiumltiu CLIPS a la seva versioacute en liacutenea de comandes eacutes moltmeacutes ragravepid (segurament perquegrave no ha de mostrar en tot moment lrsquoagenda de fets les instancies les regles
etc)La diferencia de velocitat eacutes molt notable en cas de problemes de rendiment o de sensacioacute que lrsquoentorn
de finestres es queda penjat (o directament es tanca sense previ aviacutes) recomanem provar la versioacute en liacuteneade comandes
32 Los hechos
321 iquestQueacute es un hecho en CLIPS
Conceptualmente un hecho representa un dato abstracto del cual almacenamos valores Se puede vercomo una lista de campos donde el primer campo hace referencia al ldquodatordquo al cual le asignamos una listade valores que le suceden teniendo una relacioacuten entre siacute
Formalmente el primer campo es un siacutembolo y los campos restantes son valores
9
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1359
10 Capiacutetulo 3 CLIPS
(siacutembolo valor1 valor2 valorN)
322 iquestQueacute es un hecho ordenado (order Facts)
Un hecho ordenado tienen formato libre por lo tanto no existe restriccioacuten alguna en el orden de los campos
Los campos de un hecho ordenado pueden ser de cualquier tipo primitivo de datos excepto el primero quedebe ser un siacutembolo Como ejemplo tenemos
1 (hermanos Antonio Javier Carlos)2 (padre Pedro David)
323 iquestQueacute es un hecho no ordenado (deftemplates facts)
A traveacutes de los hechos no ordenados podemos abstraernos de la estructura de un hecho asignado unnombre a cada campo (slots)
1 (deftemplate nombre-template comentario2 (slot nombre-slot (tipo-del-slot))3 (multislot nombre-slot (tipo-del-slot))4 )
Por ejemplo
1 (deftemplate avioacuten2 (slot nombre_avion (type STRING))3 (slot compania (type STRING))
4 (slot numero_plazas (type INTEGER) (default 100))
324 iquestPuedo tener un vector como slot
Si debe declararse como multislot
325 iquestPuedo asignar propiedades a los slots
Siacute las maacutes importantes son
Type El tipo de dato primitivo que contiene (en mayuacutesculas)
Allowed-X Permite especificar un conjunto de valores permitidos Siendo X un tipo de datos primitivo(en minuacutesculas y plural) rarr si el slot toma un valor del tipo X debe pertenecer a los valores permi-tidos X puede ser values especificando entonces todos los valores posibles que puede tomar el slotindependientemente del tipo de dato
Range Especifica un rango para slots numeacutericos
Cardinality Nuacutemeros miacutenimo y maacuteximo de elementos que puede tener un multislot
Default Valor por defecto Si ponemos NONE como valor por defecto significaraacute que no se podraacute crear la
instancia a no ser que se especifique el valor de ese slot
1 (deftemplate estudiante2 (slot edad (type INTEGER) (range 0 99))
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1459
32 Los hechos 11
3 (multislot asignaturas (type STRING) (cardinality 1 5))4 (slot num-carreres (default 1))5 (multislot notas (allowed-strings MH NP))6 )
326 iquestQueacute debo utilizar hechos ordenados o no ordenados
Como se puede intuir si tenemos un conjunto de hechos los cuales conceptualmente pertenecen al mismoaacutembito seraacute una solucioacuten maacutes elegante agruparlos a traveacutes de un deftemplate En caso que tengamos quealguacuten hecho aislado seraacute mas sencillo declararlo como un hecho ordenado
327 Fets o Objectes
Veient la definicioacute de deftemplate podem confondrersquons a lrsquohora de decidir si fer servir fets o fer servirobjectes
Deixant de banda altres diferegravencies ja comentades (les classes suporten jerarquia de classes heregravenciaetc) els objectes es fan servir per representar el coneixement (mitjanccedilant un conjunt drsquoinstagravencies)
Aixiacute que generalment farem servir classes i objectes per representar coneixement mentre que farem servirels fets per portar control sobre lrsquoexecucioacute del problema
Per exemple podriacuteem definir un deftemplate per emmagatzemar un resultat o per poder controlar lrsquoestatde lrsquoexecucioacute
A la pragravectica de Mikeo (penjada a la web de lrsquoassignatura) teniacuteem un deftemplate habitacion-actual
1 (deftemplate habitacion-actual2 (slot habitacion)3 (slot area-restante)4
(slot presupuesto-restante)5 (slot precio-total)6 (slot prioridad-actual)7 )
Amb el qual controlagravevem la construccioacute drsquouna habitacioacute Assignagravevem una instagravencia de la classe habita-cioacute al slot habitacion de habitacion-actual i mitjanccedilant una segraverie de regles que feien unificacioacute ambhabitacion-actual actuagravevem sobre lrsquohabitacioacute drsquouna manera o drsquoun altre
328 Creacioacuten de hechos (assertdeffacts)
Si queremos crear un solo hecho utilizaremos el comando assert Por ejemplo (assert (casa roja))Si por el contrario queremos crear una estructura ordenada de hechos utilizaremos deffacts
(deffacts mishechos (casa roja) (pelota azul))
329 Modificar un fet
Per modificar un fet (per exemple molt uacutetil si estem treballant amb deftemplates) ho podem fer mitjanccedilant(modify ltINSTANCIAgtltFETSgt)
Per exemple si tingueacutessim el deftemplate persona
1 (deftemplate persona2 (slot nom)3 (slot edad)4 (slot dni)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1559
12 Capiacutetulo 3 CLIPS
I hagueacutessim afegit el fet
(assert (persona (nom Pepe)(edad 25)(dni 46974431)))
I el fet
(assert (aniversari 46974431))
Podriacuteem tenir la seguumlent regla
1 (defrule aniv2 aniversari lt- (aniversari dni)3 persona lt- (persona (edat edat)(dni dni))4 =gt5 (retract aniversari)6 (modify persona (edat (+ 1 edat)))7 )
La qual srsquoactivaragrave si hi ha un fet aniversari drsquouna persona Fent servir el dni indicat al fet aniversaribusquem el fet persona que teacute el mateix dni Deixem el valor edat a la variable edat per poder treballaramb ella meacutes endavant
Hem agafat tambeacute la direccioacute del fet aniversari per tal de poder esborrar-lo de la base de fets Aixograve srsquohafet per dues raons
Primer per mantenir meacutes neta la base de fets Segon i meacutes important Com que hem canviat el fet laregla tornaragrave a fer unificacioacute amb el fet (perquegrave ara eacutes diferent) amb la regla aniversari amb el que entrariadintre drsquoun bucle sense fi on srsquoaniria incrementant lrsquoedat de la persona
Un cop hem esborrat el fet aniversari incrementem en 1 el valor del slot edat de la persona fent servirla variable edat que hem declarat a la part esquerre de la regla
El comportament de modify es fer un retract del fet a la base de fets i despreacutes fer un assert amb els nous
valors Si volem canviar mes drsquoun slot del fet es convenient canviar-los tots a la vegada La raoacute es que cadavegada que fem un modify lrsquoapuntador al fet es modifica i lrsquoapuntador que tenim a la variable que hem fetservir ja no es vagravelid
Si no temim mes remei que fer la modificacioacute del fet pas a pas srsquoha de saber que la crida a modify retornalrsquoapuntador al nou fet Si el guardem a altra variable (o a la mateixa) podrem continuar modificant el fetamb la nova referegravencia
3210 Com elimino un fet de la base de fets
Per eliminar un fet de la base de fets ho podem fer amb la paraula clau (retract ltFETgt) on ltFETgt eacutes
un punter al fetPer obtenir aquest fet ho podem fer fent servir ltVARgtlt- ltFETgt a la part esquerre de la reglaPer exemple
1 (defrule accionsvent2 vent lt- (vent tipus)3 =gt4 (switch tipus5 (case poc then (assert (accio persiana0)))6 (case normal then (assert (accio persiana50)))7 (case molt then (assert (accio persiana100)))8 )9 (retract vent)
10 )
Afegiragrave fets per realitzar les accions pertinents i esborraragrave el fet de la base de fets
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1659
33 Variables 13
33 Variables
331 Variables a CLIPS
No cal declarar una variable (ni el seu tipus) nomeacutes cal afegir un interrogant al comenccedilament drsquoun simbol
per indicar que eacutes una variableCLIPS srsquoencarrega del control de tipus depenent del que assignem a la variablePer exemple testvar correspondria a la variable testvar Si per exemple assigneacutessim lrsquoenter 3 a
testvar CLIPS tractaria la variable com una variable entera
332 Com assignar un valor a una variable
Per assignar un valor a una variable es fa servir el megravetode (bind) amb la forma
(bind ltVARIABLEgtltVALORgt)
On ltVALORgt pot ser un valor o un megravetode que retorni un valor Per exemple si volem assignar un 4 a lavariable var
(bind var 4)
O per exemple podriacuteem assignar a la variable var la suma de 2 meacutes 2
(bind var (+ 2 2))
333 iquestCoacutemo declarar variables globales
Para crear una variable global hay que meterla dentro de la construccioacuten defglobal La declaracioacuten de la
variable seguiraacute el modelo nombreVariable = expresioacutenPor ejemplo
(defglobal presupuesto = 0)
Pueden aparecer en la parte izquierda de las reglas si no son utilizadas para asignar un valor y su cambiono activa reglas pero no pueden ser paraacutemetros de funciones ni meacutetodos
334 iquestCoacutemo trabajar con variables sumando restando por ejemplo contadores
La mejor forma es con variables globales se definen asiacute (defglobal x = 0) puede ser el valor quequeramos tanto nuacutemero string Y si queremos sumarle 10 por ejemplo
(bind x (+ x 10))
Las variables locales como por ejemplo x soacutelo tienen valor mientras dura su ejecucioacuten y eso suele ser enesa misma liacutenea o en un bucle Si le damos valor a x y luego preguntamos por ella nos diraacute que no existe
335 Quina diferegravencia hi ha entre les variables del tipus nom_variable i les del tipus $nom_variable
Les primeres contenen un sol valor i les segones en poder contenir meacutes drsquoun (o cap)
336 Quegrave significa lrsquointerrogant () quan va sol
Eacutes una variable anogravenima Pots utilitzar sense posar-hi cap nom si no trsquointeressa el valor en concret Perexemple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1759
14 Capiacutetulo 3 CLIPS
(Primer filtre_preu )
Aquesta condicioacute significa ldquosi el fet (Primer filtre_preu) teacute algun valorrdquo O sigui que si tingueacutessimel fet (Primer filtre_preu ok) es compliria la condicioacute (i si en comptes de ldquookrdquo fos ldquopatatardquo tambeacute escompliria) En canvi si el fet fos uacutenicament (Primer filtre_preu) no es compliria la condicioacute
337 Quegrave significa el dogravelar ($) quan va sol
Eacutes com lrsquointerrogant perograve admet meacutes drsquoun valor Per exemple
(Primer filtre_preu $ ok)
donaragrave cert pels fets de lrsquoestil (Primer filtre_preu patata ok) (Primer filtre_preu hola ok)(Primer filtre_preu patata hola ok) (Primer filtre_preu ok) Eacutes a dir no importa els valors quehi hagi entre filtre_preu i ok si al final hi ha un ok
338 iquestComo puedo ver los hechos presentes en un momento determinado
Abriendo la Facts Window en Window de la barra de menuacute
34 Las reglas
341 iquestCoacutemo construir una regla
Para construir una regla utilizaremos la construccioacuten defrule
Sintaxis
(defrule ltnombre-reglagt [ltcomentariogt][ltdeclaracioacutengt]ltelemento-condicioacutengt Parte izquierda (LHS)
=gtltaccioacutengt) Parte dcha (RHS) de la regla
Una regla consta de un conjunto de condiciones (antecedente) tambieacuten denominados elementos condicio-nales (EC) o parte izquierda (LHS) y de un conjunto de acciones (consecuente) tambieacuten denominado partederecha de la regla (RHS) La regla se activaraacute siempre que se satisfagan todos los EC mediante hechos oinstancias que los cumplan
Si se introduce en la base de reglas una nueva regla con el mismo nombre que el de una existente la nuevaregla reemplazaraacute a la antigua
Si una regla no tiene parte izquierda es decir no tiene elementos condicionales entonces el hecho(initial-fact) actuaraacute como el elemento condicional para ese tipo de reglas y la regla se activaraacute cadavez que se ejecute un comando reset
342 iquestCoacutemo gestionar la parte izquierda (LHS) de una regla
Declarar hechosSi no se especifica ninguna condicioacuten la regla se activaraacute siempre Una condicioacuten puede ser un simple hecho
(Ej vegetariano) o un hecho ordenado con unos valores concretos (Ej (persona (nombre Juan))) Si loque queremos es obtener el valor de un hecho insertaremos una variable en su lugar (Ej (persona (nombre
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1859
34 Las reglas 15
n)) ) Entonces entraraacute en la regla para cada valor posible que pueda asignar a la variable n a partir delos hechos
Si queremos indicar cualquier valor utilizaremos el siacutembolo y para cualquier lista el siacutembolo $ (Ej(evento ) (estilo $) ) Tambieacuten existe la opcioacuten de guardar en una variable una referencia al objetoEllo se consigue poniendo var lt- a su izquierda (Ej p lt- (persona (nombre Juan))) Se puede usarpor ejemplo para pasaacuterselo de paraacutemetro a una funcioacuten llamada en la RHS
Establecer condiciones
Ademaacutes podemos especificar restricciones adicionales sobre los valores que puede tomar un campo de unhecho Existen tres tipos principales de restricciones Conectadas (por orden de precedencia o prioridad)
not (~) Evita que cierto campo cumpla determinada restriccioacuten
and (amp) Combina dos restricciones conjuntivamente
or (|) Combina dos restricciones disjuntivamente
De predicado () Obliga a que cierto campo cumpla determinada condicioacuten (especificada por el predicado)
Por valor devuelto por una funcioacuten = Permite llamar a una funcioacuten y utilizar el valor devuelto pararestringir el valor que pueda tomar un campo de un hecho
Se puede comprobar si se cumple una determinada condicioacuten mediante el constructor test Dentro detest se pueden hacer llamadas a cualquier funcioacuten o predicado ya sea primitiva de CLIPS o definidapor nosotros
Combinar elementos
Los diferentes elementos de la parte izquierda van impliacutecitamente unidos mediante una AND que indicaconjuncioacuten No obstante podemos hacerlo expliacutecitamente mediante (and (cond1) (cond2)) aunque suelen
utilizarse para anidar ANDs dentro de ORsOR Sirve para hacer una disyuncioacuten (or (cond1) (cond2)) Es equivalente a escribir varias reglas en lasque cada una de ellas tenga uno de los componentes del OR en su parte izquierda y la misma parte derecha
NOT Sirve para detectar si no existe un determinado hecho (Ej (not (estilo sibarita)))exists Cuando a un conjunto de elementos se le antecede exists se comprueba que hay al menos un
hecho en la base de hechos que cumpla la condicioacuten (Ej (exists(bebida precio (ltprecio 5))) )forall Permite comprobar si todos los hechos que satisfacen un determinado patroacuten cumplen una serie
de condiciones (Ej (forall(plato (estilo moderno)))
343 iquestCoacutemo obtener la direccioacuten de hechos o instancias situados en LHS
En algunas ocasiones vamos a necesitar realizar alguacuten tipo de accioacuten en la parte derecha de las reglassobre hechos o instancias que cumplan unas determinadas condiciones Pero para ello necesitaremos primerotener acceso a estos elementos para despueacutes poder operar sobre ellos Esto lo conseguiremos guardando ladireccioacuten del elemento en una variable hacieacutendolo del siguiente modo
variable_direccion lt- (elemento)
Pongamos un ejemplo para ver realmente el funcionamiento y uso de esta posibilidad que CLIPS nosofrece
1 (defrule imprime-area2 instancia lt- (object (is-a Rectangulo))3 =gt4 (printout t Area del rectangulo (instance-name instancia)5 (send instancia calcula-area) crlf)6 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1959
16 Capiacutetulo 3 CLIPS
Cuando se ejecuta esta regla se imprimiraacuten las aacutereas de todas las instancias de la clase Rectangulo Enla parte izquierda de la regla lo que hacemos es guardar en la variable instancia la direccioacuten de la instanciade Rectangulo que estamos tratando en ese momento La regla se ejecutaraacute para todas las instanciasalmacenadas en la memoria de trabajo que cumplan la condicioacuten (is-a Rectangulo) es decir para todaslas instancias de la clase Rectangulo En la parte derecha de la regla donde se ejecutan las acciones podemosver que se imprimiraacute para cada instancia lo siguiente Area del rectangulo [nombre_instancia] aacuterea
del rectaacutengulo La funcioacuten instance-name nos devuelve el nombre de la instancia que le pasamos porparaacutemetro Ademaacutes hemos llamado al gestor de mensajes calcula-area para que nos devuelva el area delrectaacutengulo
344 iquestCoacutemo hacer sentencias or en la izquierda de las reglas
Con (or ) Si por ejemplo tenemos dos hechos (a) y (b) y queremos ejecutar la derecha de la reglacuando se cumpla uno de los dos tendremos que hacer (or (a) (b)) Atencioacuten porque la parte derecha seejecutaraacute tantas veces como veces se cumpla cada uno de los hechos si para nosotros existe tanto (a) como(b) la parte derecha se ejecutaraacute dos veces Para que soacutelo se usa una vez podemos hacer combinaciones de
or y and (funciona igual) o usar un patroacuten por ejemplo (persona Juan|Pedro) soacutelo se ejecutariacutea una vez
345 Com afegir una condicioacute a la part esquerre drsquouna regla
A vegades eacutes necessari que una regla srsquoinstanciiuml si es produeix una condicioacute especial (i no un fet) Per feraixoacute farem servir la comanda (test ltCONDICIOgt)
Per exemple imaginem que la nostre base de fets compte amb un fet (preu valor) amb un preudeterminat Imaginem que volem una regla que srsquoinstanciiuml quan aquest valor eacutes meacutes gran que 30
Per fer-ho fent servir tot el que hem explicat
1 (defrule preucar2 (preu preu)3 (test (gt preu 30))4 =gt5 (printout t El preu es mes gran que 30)6 )
Eacutes a dir si el preu eacutes meacutes gran que 30 srsquoimprimiragrave un missatge per pantallaAquestes condicions poden contenir ANDs i ORs de varies condicionsPer exemple
1 (defrule preulimit2 (preu preu)3 factminim lt- (preuminim minim)4 factmax lt- (preumaxim maxim)5 (test (and (gt preu minim) (lt preu maxim) ))6 =gt7 (retract factminim)8 (retract factmax)9 (printout t El preu estagrave dintre del rang)
On comprovarem si el preu estagrave dintre drsquoun rang determinat i en aquest cas esborra els fets que contenen
el magravexim preu i el miacutenim preu i mostra un missatge per pantalla
346 Puede una misma regla ejecutarse maacutes de una vez
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2059
34 Las reglas 17
Es muy importante entender que cada regla se ejecutaraacute una vez por cada combinacioacuten de valores en suLHS
1 (defrule regla2 (color col)3 (peso pes)4 =gt5
Si tengo tres colores y dos pesos asertados la regla se ejecutaraacute 6 veces una con cada combinacioacuten decolor y peso
347 Com puc definir lrsquoordre de les regles
La idea drsquoun sistema basant en regles eacutes no definir un ordre lineal drsquoaquestes (costa deixar de pensar de
forma iterativa)En el cas de necessitar que una regla srsquoexecuti despreacutes drsquouna altre pots fer servir Fets la regla anteriorcrea un fet que la segona regla tindragrave a la part esquerra
1 (defrule pregunta12 =gt3 (assert (pregunta1Feta))4 5 )6
7 (defrule pregunta2
8 (pregunta1Feta)9 =gt
10 11 )
I finalment pots usar la propietat salience Aquesta propietat indica la prioritat drsquoexecucioacute de les regles( les regles amb salience majors srsquoexecutaran abans ) Pot prendre valors positius i negatius entre -10000 y+10000 Per defecte les regles tenen salience 0
1 (defrule pregunta12 (declare (salience 2))3 =gt4 5 )6
7 (defrule pregunta28 (declare (salience 1))9 =gt
10 11 )
El valor indicado en la propiedad salience puede ser el nuacutemero directamente o una expresioacuten por ejemplovariable10 podemos usar variable para elegir que regla se ejecutaraacute
Las prioridades deben ser usadas solo para determinar el orden en el que se disparan algunas reglas sobreotras no para fijar el flujo de control ya que la principal ventaja de un sistema basado en reglas es larepresentacioacuten declarativa del conocimiento y de esta forma abusando de las prioridades conduce a unsistema procedimental
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2159
18 Capiacutetulo 3 CLIPS
348 Com forccedilar que una regla sigui la primera
Per que aquesta regla sigui la primera ha de tenir el salience meacutes gran de totes
1 (defrule presentacio2 (declare (salience 20))3 =gt4 (printout t ------ Benvingut ----- crlf)5 )
349 Vull guardar certs valors que es fan servir durant lrsquoexecucioacute de diferents regles Com hopuc fer
Tens principalment dues alternatives Si el valor eacutes un tipus bagravesic pots fer servir una variable global ambla sintaxi seguumlent
(defglobal nom_variable = valor)
Aquesta sentegravencia no va a dins de cap funcioacute ni regla es posa sola a la part que creguis convenient delcodi Vegem un exemple
(defglobal preu_minim_primer = 1000)
Per fer-la servir es fa exactament de la mateixa manera que amb una variable normal perograve has de posarels dos asteriscs Per exemple
(bind preu_minim_primer curr-preu)
Per altra banda si el valor o valors que vols guardar han de ser instagravencies una bona estrategravegia pot serutilitzar un deftemplate Eacutes uacutetil sobretot per anar guardant solucions temporals o llistes drsquoelements quepoden formar part de la solucioacute
Per utilitzar-ho has de seguir els passos seguumlents
1 Definir el deftemplate
(deftemplate nom_del_deftemplate(multislot nom_multislot)
(slot nom_slot)
)
Amb un exemple es veuragrave meacutes clar
(deftemplate llista-plats(multislot primers)(multislot segons)(multislot postres)
)
2 Inicialitzar el deftemplate
(defrule[condicions vagraveries] La condicioacute base eacutes que llista-plats no srsquoha inicialitzat encara
(not (llista-plats))=gt
llista conteacute els valors de llista-plats (que de moment estan buits)(bind llista (assert (llista-plats)))
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2259
35 Las clasesinstancias 19
3 Assignar-li valors
(bind segons_plats (find-all-instances ((plat Plat)) TRUE)(modify llista (segons segons_plats))
4 Recuperar els valors
(defrule[condicions vagraveries]llista lt- (llista-plats (segons $segons_plats))
=gt
Ara la variable $segons_plats conteacute tots els elements de segons
35 Las clasesinstancias
351 Tengo que representar la jerarquiacutea de un frame iquestEs preferible antildeadir las subclases a laontologiacutea o bien diferenciarlas mediante un slot en la superclase
Las dos formas son vaacutelidas pero es recomendable representarlas en clases separadas cuando se vayan abuscar instancias de ese tipo ya que asiacute no tendremos que hacer un recorrido por todas las de la superclaseNo obstante si soacutelo se trata de una caracteriacutestica puntual del frame y no vamos a hacer buacutesquedas de unaexclusiva subclase entonces seraacute maacutes eficiente antildeadir un slot debido a su mejor accesibilidad
352 iquestQueacute es un objeto
Podriacuteamos decir que un objeto es un hecho no ordenado con herencia
353 iquestPorqueacute usar objetos en contexto de la praacutectica de CLIPS de IA
Como bien sabemos una parte de la praacutectica de SBCrsquos consisten en crear la ontologiacutea Esta ontologiacutease exporta para poder interactuar con CLIPS en formato pins y pont El archivo pont contendraacute ladeclaracioacuten de todas las clases creadas previamente por Protege (defclass ) El archivo pins contendraacute
todas las instancias de las clases declaradas en el archivo pont Como puede intuir el lector se necesitaraacuteinteractuar con los objetos previamente creados por Protegravegegrave
354 Como se definen las clases
Para definir las clases usaremos el constructor defclass
(defclass ltnombregt [ltcomentariogt](is-a ltnombre-de-superclasegt)[(role concrete | abstract)]
[(pattern-match reactive | non-reactive)]ltslotgt definicioacuten de los atributos de la clase
ltdocumentacioacuten-handlergt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2359
20 Capiacutetulo 3 CLIPS
En caso de desear que la nueva clase herede las propiedades de otra ya existente el nombre de esta deberaacuteespecificarse despues de is-a El rol determinaraacute si la clase es concreta (se puede instanciar) o abstracta(destinada a ser superclase) El pattern-match debe declararse como reactivo si se desea que las instanciasde la clase puedan unificar con los elementos objeto de las reglas (siacutembolo lt-) Los slots correspondena los atributos de la clase y los handlers a las funciones de eacutesta Los handlers se pueden declarar en ladeclaracioacuten de la propia clase pero se deben definir externamente Dado que no aporta ninguna ventaja
declararlos es recomendable definirlos directamente Noacutetese que todo aquello que estaacute entre corchetes ([])constituye informacioacuten adicional que no es obligatorio especificar
1 (defclass Persona2 (is-a Ser_Vivo)3 (role concrete)4 (single-slot edad5 (type INTEGER)6 (range 1 99)7 (cardinality 0 1)8 (create-accessor read-write)9 )
10 (multislot amigos11 (type INSTANCE)12 (allowed-classes Persona)13 )14 )
El comportamiento y declaracioacuten de los slots es ideacutentico al de los slots de los hechos ordenados Losatributos de tipo INSTANCE (referencian otras instancias) estan en formato INSTANCE-NAME
355 Com consulto una instagravencia a partir drsquouna regla
Podem fer servir la part esquerre drsquouna regla per trobar instagravencies Lrsquouacutes eacutes molt semblant a trobar elpunter a un fet fent servir
(object [(is-a ltNOM_CLASSEgt)|(name ltNOM_INSTANCIA)|(ltNOM-SLOTgt ltVALORVARIABLE))])
Per exemple si volem que una regla srsquoinstanciiuml si tenim instanciat un plat de la classe Plat podriem ferservir
1 (defrule tenimplat2 plat lt- (object (is-a Plat))3 =gt4 (print t (send plat get-nom) crlf)
La regla imprimiragrave el nom del plat que trobi Eacutes important notar que srsquoactivaragrave per cada instagravencia de platque tinguem a la base de coneixement
Podem consultar els valors de la instancia fent servir condicions a la part esquerre de la regla Per exemplesi nomeacutes volgueacutessim els plats amb un preu meacutes gran que 30
1 (defrule platCar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Srsquoactivaragrave per tots els plats amb un preu major a 30
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2459
35 Las clasesinstancias 21
Srsquoha drsquoanar amb cura per aquest tipus de regla ja que si la base de coneixement eacutes molt amplia pot acabarderivant amb problemes de memograveria
Per exemple si en comptes de preguntar per una instagravencia de Plat pregunteacutessim per dues instancies dePlat
1 (defrule platsCars2 plat1 lt- (object (is-a Plat) (Preu p1))3 plat2 lt- (object (is-a Plat) (Preu p2))4 (test (gt p1 30))5 (test (gt p2 30))6 =gt7 (print t (send plat1 get-nom) i (send plat1 get-nom) soacuten cars8 crlf)9 )
Faria unificacioacute amb totes les combinacions possibles (amb repeticions) de dos plats de tota la base deconeixement Aixograve es podria anar ampliant fins fer-se intractable
Si tenim drsquoalguna manera el nom de la instancia podem fer
1 (defrule platPicant2 (cuina (plat p))3 (object (name p) (picant pi))4 =gt5 (print t picant pi crlf)6 )
Aixoacute es pot servir per crear condicions que facin servir noms drsquoinstancies que tenim almacenats a slotsdrsquoaltres instancies per exemple
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send v get-Preu) crlf)6 )
Aquesta regla imprimiria el preu del vi asociat al plat si es negre
356 Tengo problemas en condiciones de reglas con slots de instancias obtenidos con send
A veces dan problemas las reglas en las que las condiciones sobre los valores de los slots de una instanciase escriben usando mensajes get sobre los atributos de una instancia en lugar de utilizar patrones paraobtenerlos por ejemplo la regla
1 (defrule platcar2 plat lt- (object (is-a Plat) )3 (test (gt (send plat get-Preu) 30))4 =gt5 (print t (send plat get-nom) es car6 crlf)7 )
No funciona correctamente en CLIPS pero la regla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2559
22 Capiacutetulo 3 CLIPS
1 (defrule platcar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Siacute lo haceEn el caso de que el valor del slot sea booleano se puede escribir la regla como
1 (defrule platpicant2 plat lt- (object (is-a Plat) (Picant TRUE))3 =gt4 (print t (send plat get-nom) es picant crlf)
En el caso de que el slot sea a su vez una instancia se puede utilizar para obtener los valores de estainstancia en la condicion como se explica en la pregunta anterior
357 Tengo problemas con instancias obtenidas del slot de otra instancia en el patroacuten de unaregla
Este problema aparece cuando el patron de una regla instancia una variable a un nombre de instancia yesta no esta definida en el modulo de la regla por ejemplo si la regla siguiente pertenece a un modulo queno es el de la instancia
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4
=gt5 (print t preu (send v get-Preu) crlf)6 )
La regla se quejaraacute de que la instancia no existe al enviarle el send ya que solo se busca la instancia dentrodel moacutedulo de la regla y no en los importados Para arreglar esto se puede usar la funcioacuten (instance-address[ltMODULOgt|] ltINSTANCIAgt) que busca la direccion de la instancia en un modulo concreto o en todos losmoacutedulos que se importan () Deberiacuteamos entonces escribir la regla
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send (instance-address v) get-Preu) crlf)6 )
358 iquestCoacutemo realizar una buacutesqueda de instancias que cumplan unas restricciones
CLIPS nos ofrece varias funciones de buacutesqueda de instancias que cumplan unas determinadas restriccionesque a nosotros nos interese
La funcioacuten find-instance Esta funcioacuten devuelve la primera instancia que cumple todas las restric-ciones indicadas
La funcioacuten find-all-instances Esta funcioacuten devuelve todas las instancias que cumplen las restric-ciones indicadas
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2659
35 Las clasesinstancias 23
La sintaxis de ambas funciones es igual exceptuando el nombre de la funcioacuten(find-all-instances (clase_instancias) (restricciones))A continuacioacuten se muestran varios ejemplos
(bind rectangulos (find-all-instances ((inst Rectangulo)) (gtinstaltura 10))) Des-pueacutes de ejecutar esta funcioacuten en la variable rectangulos habraacute una lista con todas las instancias de la
clase Rectangulo cuya altura sea superior a 10(bind rectangulos (find-all-instances ((inst Rectangulo)) (and (gtinstaltura 10) (=instanchura 7)))) Este trozo de coacutedigo hace que en la variable rectangulos se guarde una listade las instancias de la clase Rectangulo que tienen una altura superior a 10 y una anchura igual a 7
Estas funciones que CLIPS nos ofrece tienen otra funcionalidad y es que podemos realizar buacutesquedas deconjuntos de instancias
(bind rectangulos (find-all-instances ((a Rectangulo) (b Rectangulo)) (= aalturabaltura))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas de instancias de laclase Rectangulo que tienen la misma altura
Por uacuteltimo es necesario comentar que se pueden realizar buacutesquedas de conjuntos de instancias que seande distintas clases
(bind figuras (find-all-instances ((rect Rectangulo) (circ Circulo)) (= rectalturacircradio))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas ltrectangulocirculogtque cumplan que la altura del rectaacutengulo sea igual al radio del ciacuterculo
Existen maacutes comandos para obtener instancias pero son menos utilizadas a nivel baacutesico como pueden serany-instancep do-for-instance do-for-all-instances y delayed-do-for-all-instances
359 iquestCoacutemo se interactuacutea con objetos
La interaccioacuten con objetos se efectuacutea mediante lo que se denomina mensaje
(defmessage-handlerltnombre-clasegtltnombre-mensajegt[lttipo-handlergt] [ltcomentariogt]ltparaacutemetrogt [ltparaacutemetro-comodiacutengt])ltaccioacutengt
)
Un gestor de mensajes consta de 7 partes
1 Nombre de clase a la que el gestor estaraacute asociado
2 Nombre del mensaje
3 Tipo de gestor (Nosotros habitualmente usaremos primary que viene por defecto)
4 Comentario (opcional)
5 Lista de paraacutemetros6 Paraacutemetro comodiacuten (para gestionar muacuteltiples paraacutemetros)
7 Secuencia de acciones o expresiones que seraacuten ejecutadas por el gestor
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2759
24 Capiacutetulo 3 CLIPS
Enfocado a la praacutectica de CLIPS la maacutes comuacuten es que queramos interactuar con objetos para
1 Imprimir los objetos Un ejemplo
1 (defmessage-handler avion imprimir-beneficio ()
2 Para implementar funciones calculadas asociadas al objeto Un ejemplo
1 (defmessage-handler avion calcular-beneficio ()2 ( selfplazas-ocupadas selfprecio-billete))3 )
Como se puede observar el paraacutemetro impliacutecito self contiene la instancia activa para este mensaje
3510 iquestComo se interactuacutea con las instancias de los objetos
Podremos interactuar entre las instancias de los objetos mediante la funcioacuten send
(send ltexpresioacuten-de-objetogtltnombre-de-mensajegtltexpresioacutengt)Donde se toman como argumentos el objeto destino del mensaje el mensaje mismo y otros paraacutemetros
que debieran ser pasados a los gestoresParticularmente en el aacutembito de la praacutectica usualmente necesitaremos utilizar el envioacute de mensajes de
tipo get put and delete Estos mensajes tiene la siguiente sintaxis
get-ltnombre-atributogt
put-ltnombre-atributogt
delete
Aquiacute tenemos un ejemplo de como utilizarlo recordando que ponemos entre corchetes la instancia la cualse enviacutea el mensaje
(defclass avion (is-a USER)(role concrete)(slot precio-billete (create-accessor read) (default 34))(slot plazas-ocupadas (create-accessor write) (default 0)))
Clase creada
gt(make-instance a of avion) Creacioacuten de una instancia de avion[a]
gt(send [a] get-precio-billete) Obtencioacuten de un slot34 Resultado obtenidogt(send [a] put-plazas-ocupadas 100) Modificacioacuten de un slotgt(send [a] delete) Eliminacioacuten de la instanciaTrue
3511 Uso de make-instance
Cuando queremos crear una instancia de una clase para ir rellenandola con los resultados o datos quevayamos obteniendo se haria lo siguiente
(bind variable_instancia (make-instance nombre_instancia of nombre_clase))
Una vez creada podemos jugar con dicha instancia en las diferentes reglas siempre que la llamemos enlos activadores
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2859
35 Las clasesinstancias 25
(defrule reglavar_instancia lt- (object (is-a nombre_clase))=gt
)
De esta manera dentro de la regla podemos hacer acciones con la instancia por ejemplo(send var_instancia put-articulo articulo_ejemplo)
3512 Como generar automaacuteticamente nombres de instancia
En ocasiones queremos crear instancias en reglas y queremos que su nombre sea distinto del de otrasque ya tenemos Para ello podemos utilizar las funciones gensym y gensym La primera genera un siacutembolodel estilo genN donde N es un nuacutemero La segunda hace lo mismo pero aseguraacutendose de que ese siacutembolono exista ya Se puede reiniciar el contador que usan estas dos funciones con el operador (setgen ltnumgt)donde ltnumgt es el nuacutemero por el que queremos que empiecen ahora los siacutembolos
Para usar esto para generar el nombre de una instancia podemos hacer
(make-instance (gensym) of ltclasegt)
Cada vez que se ejecute se generaraacute un nombre de instancia nuevoSi creamos instancias de diferentes clases y queremos que las instancias tengan nombres que podamos
identificar podemos concatenar siacutembolos a los siacutembolos generados por gensym por ejemplo
(make-instance (sym-cat pepe- (gensym)) of ltclasegt)
generaraacute una instancia con el nombre pepe-genN
3513 Com fer un getset drsquoun slot drsquouna classe
Per consultar el valor drsquoun slot drsquouna classe ho podem fer enviant-li un missatge de la seguumlent manera
(send ltVARIABLEgt get-ltNOM_ATRIBUTgt)
Per exemple si tenim una instagravencia de la classe Plat ( instancia ) i volem saber el valor del seu slotnom
(send instancia get-nom)
Per assignar un valor a un slot drsquouna drsquoinstagravencia hem drsquoenviar-li un missatge de la seguumlent manera
(send ltVARIABLEgt put-ltNOM_ATRIBUTgt ltVALORgt)On ltVALORgt pot ser un valor o un megravetode que retorni un valor
(send instancia put-nom nom)
3514 iquestCoacutemo acceder a una instancia cuyo nombre conocemos
Si conocemos el nombre de una instancia y necesitamos acceder a ella es decir necesitamos enviarle alguacutenmensaje mediante la funcioacuten send podemos hacerlo directamente escribiendo en lugar de la variable quealmacena la instancia el nombre de la instancia entre corchetes [ ] A continuacioacuten se muestra un ejemplo
(bind altura_rect1 (send [rect1] get-altura))
En este caso se guardaraacute en la variable altura_rect1 el valor de la altura de la instancia que tiene comonombre rect1
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2959
26 Capiacutetulo 3 CLIPS
3515 Obtenir el nom drsquouna classe
Si tenim una instagravencia drsquouna classe i volem saber el nom de la classe (uacutetil si tenim una bona taxonomiade classes) ho podem fer amb el megravetode (class ltINSTANCIAgt)
Si per exemple imaginem que tenim la classe Actor la qual teacute com subclasses la classe APrincipalASecundari i ACameo Imaginem que estem tractant amb instancies drsquoactors i volem saber si la instanciaque estem tractant es de la classe APrincipal
Ho hauriacuteem de fer de la seguumlent manera
(eq (class instancia) APrincipal)
Fixem-nos que APrincipal eacutes un siacutembol no un String (un truco eacutes fixar-se en que no teacute cometes) Si vol-gueacutessim comparar-ho amb un String (per exemple un String introduiumlt per lrsquousuari) ho podriacuteem transformara un String amb el megravetode str-cat
(eq (str-cat (class instancia)) Principal)
3516 Como convierto un INSTANCE-ADRESS en un INSTANCE-NAME
En alguacuten momento nos podemos encontrar con la situacioacuten de que disponemos de un puntero a unainstancia y necesitamos su nombre o lo contrario En ambos casos podemos usar la funcioacuten instance-nameSu funcionamiento es bidireccional podemos introducirle un instance-name y nos devolveraacute un instance-adress y viceversa
1 (defrule imprimir-nombre2 estlt-(object (is-a Estudiante) (edad 25))3 =gt4 (printout t (instance-name est) crlf)5
)
3517 Com iterar a traveacutes drsquoun multi-slot
El seguumlent tambeacute eacutes vagravelid com exemple de com iterar a traveacutes drsquouna llistaImaginem que tenim una instagravencia de la classe Plat a la varible (plat) la qual teacute un multi-slot drsquoinstagravencies
de la classe Ingredient Imaginem que volem imprimir per pantalla el nom drsquoaquests ingredients (slot nomde la classe Ingredient) Necessitarem iterar sobre la llista drsquoingredients
1 (bind i 1)2 (while (lt= i (length$ (send plat get-ingredients)))3 do4 (bind ingredient (nth$ i (send plat get-ingredients)))5 (printout t (send ingredient get-nom) crlf)6 (bind i (+ i 1))7 )
El megravetode (nth$ ltINDEXgtltLLISTAgt) et retorna lrsquoelement situat a INDEX de LLISTAEl megravetode (length$ ltLLISTAgt) retorna el nuacutemero drsquoelements de LLISTA
3518 Coacutemo modificarinsertarborrar valores en un multislot
Los valores de un multislot se pueden cambiar usando la funcioacuten slot-replace$ La sintaxis es la siguiente
(slot-replace$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt ltvalorgt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3059
35 Las clasesinstancias 27
Donde ltiniciogt y ltfingt son el rango de posiciones del multislot que se quiere modificar y ltvalorgtson los valores que queremos reemplazar Obviamente deberaacute haber tantos valores como posiciones hayamosindicado en el rango
Para insertar nuevos valores podemos usar la funcioacuten slot-insert$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltposgt ltvalorgt)
El valor se inserta delante de la posicioacuten indicada si la posicioacuten es mayor que la longitud del multislot secolocaraacute al final
Para borrar elementos de un multislot podemos usar la funcioacuten slot-delete$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt)
Se borraraacuten los elementos que estaacuten en el rango indicado
3519 Coacutemo recorrer un atributo multievaluado
Supongamos que la variable respuesta tiene una lista de instancias
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 aquiacute hacemos lo que queramos4 )5 )
Loop-for-count funciona como un for primero la variable que haraacute de contador luego el valor de origeny luego el valor final Para controlar el final usamos la funcioacuten que he explicado antes i tomaraacute valoresdesde 1 hasta n asiacute que usando la funcioacuten nth$ obtendremos cada uno de los elementos La variable auxiraacute teniendo cada uno de los valores
3520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz)
Es igual que antes pero con dos bucles
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 (bind aux2 (send aux get-slot_que_queremos))4 (loop-for-count (j 1 (length$ aux2)) do5 (bind aux_final (nth$ j aux2))6 aquiacute ya podemos trabajar con el elemento en concreto7 )8 )
Supongamos que respuesta tiene una lista de instancias con el primer bucle haremos lo mismo que antes ir
iterando por esas instancias Una vez que tenemos cada instancia con aux2 con el segundo bucle iteraremosdentro de sus instancias interiores
Por ejemplo si tenemos varios equipos de fuacutetbol y cada equipo tiene varios jugadores en el primer bucleestamos iterando entre los equipos y en el segundo entre los jugadores de cada equipo en particular
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3159
28 Capiacutetulo 3 CLIPS
3521 Com puc esborrar una instagravencia
Per esborrar una instagravencia (per exemple segons la informacioacute que proporcioni lrsquousuari podem deduir queuna segraverie drsquoinstagravencies eacutes impossible que es facin servir per a la solucioacute) ho podem fer enviant un missatgedelete a la instagravencia eacutes a dir (send ltINSTANCIAgtdelete)
(send inst delete)
Un megravetode que podria ser uacutetil de la cara a la pragravectica podria ser el seguumlent
1 (defrule elimina-instancia2 (declare (salience 10))3 elimina-fact lt- (elimina-inst inst)4 =gt5 (send inst delete)6 (retract elimina-fact)
Imaginem que per exemple que volem eliminar una llista drsquoinstagravencies Per eliminar-les podriacuteem recoacuterrerel llistat marcant les instagravencies que volem esborrar afegint el seguumlent fet
(assert (elimina-instancia inst))
Aixiacute com que elimina-instancia teacute un salience alt esborraria les instagravencies marcades quan tingueacutes ocasioacuteDrsquoaquesta manera ens estalviem el problema de recoacuterrer un llistat drsquoinstagravencies amb un iterador mentre
anem eliminant els elements de la llista cosa que pot donar problemes amb lrsquoiterador
3522 Com imprimir una instagravencia
Per imprimir una classe (uacutetil per exemple per mostrar el resultat final) el millor eacutes definir message-handlersPer exemple imaginem que tenim una classe Plat la qual teacute un slot nom de tipus String Si volgueacutessimimprimir per pantalla un missatge que digueacutes
El nom del plat eacutes ndashltnom del platgtndash
Hauriacuteem de definir un message-handler que simplement imprimiacutes per pantalla el valor de lrsquoslot de laforma
(defmesssage-handler ltCLASSNAMEgt ltMESSAGENAMEgt primary ()ltCODIgt
)
Per el cas de lrsquoexemple
1 (defmessage-handler Plat print primary ()2 (printout t -- selfnom --) )3 )
Per cridar-ho nomeacutes caldragrave enviar-li un missatge a la instagravencia amb el nom del message-handler (enaquest cas print)
(send instancia print)
Un message-handler pot cridar a altres message-handlers amb el que es poden encadenar diverses instagraven-cies Per exemple imaginem que tenim la classe Menuacute la qual teacute un atribut plats que eacutes un llista drsquoinstagravenciesde la classe Plat Dintre del message-handler menuacute podriacuteem iterar a traveacutes de la llista de plats enviant elmissatge print que hem definit anteriorment
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3259
36 Programacioacuten 29
3523 Com es navega entre instagravencies relacionades
Per exemple tinc una instagravencia iA que teacute un slot anomenat slotB que eacutes una instagravencia drsquoun frame B Vullsaber el nom de la instagravencia associada al slotB de iA Ho pots fer aixiacute
(bind B (send iA get-slotB))(bind res (send B get-nom))
Si estagraves dins drsquouna condicioacute ho pots simplificar de la forma seguumlent
(bind res (send iAslotB get-nom)
Els dos punts soacuten equivalents al punt de Java
36 Programacioacuten
361 Com introduir un comentari
Els comentaris a CLIPS va darrere de un com per exemple
Comentari
Tambeacute podem afegir comentaris a les nostres regles deffacts deftemplates etc Generalment van darrereel nom de la estructura per exemple
1 (defrule neteja regla per la qual si la cuina estagrave bruta srsquoafegiragrave una tasca de2 neteja
3 (estat-cuina bruta)4 =gt5 (assert (tasca netejar))6 )
362 Referenciar el valor null a CLIPS
Per referenciar el valor null a clips es fa amb el simbol nil Per exemple si volem saber si una instagravenciainst es null ho podriacuteem fer de la seguumlent manera
(eq inst nil)
363 Formas de recorrer una lista
Para recorrer una lista disponemos de diferentes opciones en este FAQ explicaremos como crear unaestructura tipo ldquoWHILErdquo y tipo ldquoFORrdquo
1 While Esta regla se ejecuta hasta que la expresioacuten a evaluar sea falsa Este tipo de estructura se rigepor seguir la sintaxis while - do y se construiriacutea de la siguiente forma
(while ltexpresioacutengt[do] ltaccioacutengt)
Doacutende dependiendo del valor de ltexpresioacutengt
Valor TRUE Se realizaraacute la accioacuten ltaccioacutengt i se volveraacute a evaluar ltexpresioacutengt
Valor FALSE No se ejecutaraacute la accioacuten ltaccioacutengt
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3359
30 Capiacutetulo 3 CLIPS
2 For Esta regla sirve para ejecutar un bucle N (final - inicio) veces Este tipo de estructura se rige porseguir la sintaxis loop-for-count y se construiriacutea de la siguiente forma
(loop-for-count (ltvargtltiniciogtltfinalgt) [do] ltaccioacutengt)
Doacutende
ltvargt Variable que se usara como iacutendice
ltiniciogt Valor inicial que tendraacute ltvargt
ltfinalgt Ultimo valor que tendraacute la variable ltvargt
ltaccioacutengt Accioacuten que es realizaraacute hasta que ltvargt tenga el valor de ltfingt
364 Formas de elegir una opcioacuten
En este apartado explicaremos como crear una estructura if y una estructura switch
If Este tipo de estructura se rige por seguir la sintaxis if - then - else y se construiriacutea de lasiguiente forma
(if ltexpresioacutengtthen ltaccioacutengt[else ltaccioacuten2gt])
Doacutende dependiendo del valor de ltexpresioacutengt
bull Valor TRUE Se realizaraacute la accioacuten ltaccioacutengtbull Valor FALSE Se realizaraacute la accioacuten ltaccioacuten2gt (en caso de haber)
Switch Este tipo de estructura se rige por seguir la sintaxis switch - opciones y se construiriacutea dela siguiente forma
(switch ltexpresioacuten-testgt(case OPCION1 then ACCION1)(case OPCION2 then ACCION2)
([default] ACCION-DEFAULT)
)
Doacutende dependiendo del valor de ltexpresioacuten-casegt se ejecutaraacute una ltaccioacutengt en particular Si nin-guna ltopcioacutengt es correcta se ejecutara la ltaccioacuten-defaultgt
365 Funciones con la clase String
Habitualmente trabajaremos con Strings o cadena de Strings CLIPS proporciona una serie de herramien-tas para trabajar con esta clase
1 Convertir string a MAYUacuteSCULAS A veces es conveniente tener todos los caracteres en mayuacutesculaspara no tener problemas de comparaciones o simplemente por convenio Para ello CLIPS dispone dela funcioacuten upcase la cual convierte a mayuacutesculas un siacutembolo o string
(upcase ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplos
(upcase Ccedillips es divertido) rarr CcedilLIPS ES DIVERTIDO
(upcase Clips_es_divertido) rarr CLIPS_ES_DIVERTIDO
2 Convertir string a MINUacuteSCULAS la funcioacuten es downcase
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3459
36 Programacioacuten 31
3 Concatenacioacuten de strings Tambieacuten es de gran utilidad poder juntar dos o maacutes paraacutemetros en un solostring Todo paraacutemetro a juntar deben ser de uno de los siguientes tipos symbol String integer floato instance-name
(str-cat parametro1 parametro2 parametroN )
Ejemplo
(str-cat IA nota 10) rarr IAnota10
4 Comparacioacuten de strings Funcioacuten que nos indica si dos strings son iguales
(str-compareltexpresioacuten-simboacutelica-o-de-cadenagtltexpresioacuten-simboacutelica-o-de-cadenagt
)
Esta funcioacuten devuelve
0 Si ambos strings son iguales1 Si el primer string es mayor que el segundo string-1 Si el primer string es menor que el segundo string
5 Longitud de un string Muchas veces es de gran utilidad saber que tamantildeo tiene un string
(str-length ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplo
(str-length Inteligencia Artificial) rarr 23
366 iquestCoacutemo obtener el contenido de una variable en un string
Para conseguir un string a partir de un integer float symbol instance-name debes utilizar el comandostr-cat Si a la funcioacuten le pasamos como paraacutemetros varios elementos los transformaraacute a string y losconcatenaraacute La sintaxis de esta funcioacuten es la siguiente (str-cat elementos) Esta funcioacuten la usaremossobre todo cuando queramos realizar comparaciones entre el contenido de una variable y un string ya quepreviamente necesitaremos usar la funcioacuten str-cat para pasar el contenido de la variable a string y realizarde este modo la comparacioacuten de forma correcta
367 iquestComo se crea una lista
Con create$ Todos los operadores sobre listas llevan el siacutembolo $ al final Igual que con las variables sedebe usar bind siempre que se desee modificar una lista
(bind lista (create$ a b c))
368 iquestComo borro un elemento de una lista
Con delete$Usa la siguiente sintaxis(delete$ ltlistagt ltindice-iniciogt ltindice-finalgt)Se borraraacuten todos los elementos del rango entre las posiciones inicio y final ambas incluidas Tambieacuten exis-
tedelete-member$ (delete-member$ ltlistagt ltelementogt) Borraraacute todas las apariciones del elemento enla lista
(delete$ (create$ a b c d e f) 3 5) minusrarr (a b f)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 559
2 Iacutendice general
352 iquestQueacute es un objeto 19353 iquestPorqueacute usar objetos en contexto de la praacutectica de CLIPS de IA 19354 Como se definen las clases 19355 Com consulto una instagravencia a partir drsquouna regla 20356 Tengo problemas en condiciones de reglas con slots de instancias obtenidos con send 21357 Tengo problemas con instancias obtenidas del slot de otra instancia en el patroacuten de
una regla 22358 iquestCoacutemo realizar una buacutesqueda de instancias que cumplan unas restricciones 22359 iquestCoacutemo se interactuacutea con objetos 233510 iquestComo se interactuacutea con las instancias de los objetos 243511 Uso de make-instance 243512 Como generar automaacuteticamente nombres de instancia 253513 Com fer un getset drsquoun slot drsquouna classe 253514 iquestCoacutemo acceder a una instancia cuyo nombre conocemos 253515 Obtenir el nom drsquouna classe 263516 Como convierto un INSTANCE-ADRESS en un INSTANCE-NAME 263517 Com iterar a traveacutes drsquoun multi-slot 263518 Coacutemo modificarinsertarborrar valores en un multislot 263519 Coacutemo recorrer un atributo multievaluado 273520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz) 273521 Com puc esborrar una instagravencia 283522 Com imprimir una instagravencia 283523 Com es navega entre instagravencies relacionades 29
36 Programacioacuten 29361 Com introduir un comentari 29362 Referenciar el valor null a CLIPS 29363 Formas de recorrer una lista 29
364 Formas de elegir una opcioacuten 30365 Funciones con la clase String 30366 iquestCoacutemo obtener el contenido de una variable en un string 31367 iquestComo se crea una lista 31368 iquestComo borro un elemento de una lista 31369 iquestComo inserto elementos en una lista 323610 iquestComo modifico elementos de una lista 323611 iquestComo averiguo el nuacutemero de elementos de una lista 323612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten 323613 iquestComo recorro todos los elementos de una lista 323614 Com trobar si un element forma part drsquouna llista 32
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot 323616 I si tinc un multislot i el vull transformar en un string 333617 iquestCoacutemo obtener un valor aleatorio 333618 Comparaciones 33
37 Los moacutedulos 33371 Quegrave eacutes un mogravedul en CLIPS 33372 Particioacuten en modulos 34373 iquestCoacutemo asignar una construccioacuten en un moacutedulo 34374 Com funcionen les clagraveusules export i import 34375 iquestCoacutemo cambio el moacutedulo actual 35
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS 3538 Funciones 36
381 iquestCoacutemo se crea una funcioacuten en CLIPS 36382 Explicacioacuten de la estructura de una funcioacuten en general 37
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 659
Iacutendice general 3
383 Com definir un paragravemetre drsquouna funcioacute com una llista 38384 Com puc utilitzar una funcioacute a la part esquerra de les regles 38
39 Entrada salida 38391 iquestCoacutemo se imprime por pantalla 38392 iquestAl imprimir por pantalla como hago un salto de liacutenea 39393 Com imprimeixo una liacutenia en blanc 39
394 Com llegir de la entrada standard 39395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeix
com un enter 40396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacute
drsquoentrada quants) com ho faig per assignar-los a un multislot 40310 Funciones uacutetiles 40
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles 403102 Obtener un valor numeacuterico comprendido en un rango 413103 Realizar una pregunta general 413104 iquestCoacutemo se realiza una pregunta binaria 413105 Encuentra la instancia con valor miacutenimo para un slot 41
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valor const 423107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li 433108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla 43
311 Ejecucioacuten de un programa CLIPS 433111 iquestCoacutemo cargamos un programa 433112 iquestCoacutemo probar tu coacutedigo en CLIPS 443113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten 443114 iquestCoacutemo parar una ejecucioacuten 443115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste 44
4 Consejos praacutecticos 45
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve no seacute ni per oncomenccedilar Algun consell 45
42 iquestComo estructuro una practica de CLIPS 4543 Com crear un flux de preguntes 46
431 Com puc ordenar aquest flux de preguntes 46432 I si vull saltar-me una pregunta 47433 Com inicialitzar el flux del programa 48
44 Uso de la funcioacuten modify para ir guardando resultados preferidos 4845 Creacioacuten de la plantilla de recomendacioacuten 49
5 Errores frecuentes 51
51 Quan obro un fitxer en CLIPS em dona un error 5152 Codificacioacute de caragravecters a CLIPS 5153 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots en Protegravegegrave cuando
las importo en CLIPS 5154 Tengo problemas con la hereacutencia de slots en las clases que he definido 5155 Quegrave significa lrsquoerror OBJRTBLD5 5256 Antes compilaba correctamente y ahora da warnings 5257 No puedo editar mi fichero en clips 5258 Redefining 5259 Problemas al consultar las instancias relacionadas con otras 52510 Unable to finde class X cuando definimos instancias 52
511 Expected the beginning of a construct (cuando definimos instancias) 53512 Compila pero no compara bien dos elementos 53513 Expected the beginning of a constructor 53514 Missing function declaration for defruledeffunction 53
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 759
4 Iacutendice general
515 Check appropiate syntax for ifswitchloop-for-count 54516 Problemas con pareacutentesis 54
6 Referencias 5561 On puc trobar informacioacute sobre el llenguatge CLIPS 5562 Otras referencias 55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 859
1 Introduccioacuten
Este documento es el resultado de la recopilacioacuten de los documentos escritos durante el desarrollo de lapraacutectica de sistemas basados en el conocimiento el cuatrimestre de otontildeo del curso 2007-2008
El objetivo de estos documentos era recoger las dudas frecuentes que se encuentra un alumno durante eldesarrollo de la praacutectica de SBCs y consejos praacutecticos que puedan ayudar en el desarrollo
Este documento recoge principalmente dudas frecuentes sobre el entorno CLIPS y su lenguaje de progra-macioacuten
5
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 959
6 Capiacutetulo 1 Introduccioacuten
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1059
2 Protegravegegrave
Para saber como funciona Protegravegegrave usad la ayuda de la aplicacioacuten y el material correspondiente estascuestiones se refieren a como integrar lo que se desarrolla en Protegravegegrave con CLIPS
21 Coacutemo cambiar el nombre de las instancias en Protegravegegrave
En realidad no se trata de cambiar el nombre de las instancias sino de darle algo maacutes visual que unnuacutemero para poder hacer las relaciones Si os encontraacuteis en la pestantildea de crear instancias el uacuteltimo botoacutenes una flecha hacia abajo Darle y luego set display slots Ahiacute debeacuteis indicar con que slot quereacuteis referenciarla instancia
22 Com exporto una ontologia de Proteacutegeacute a CLIPS
A Proteacutegeacute ves a File rarr Export to Format rarr CLIPS Un cop fet aixograve es crearan dos nous fitxers ambles classes i instagravencies de lrsquoontologia (nompont i nompins respectivament)
Despreacutes obre aquests dos fitxers amb un editor de text i copia el seu contingut al fitxer CLIPS de laseguumlent manera
copy-paste de nompont
(definstances instanciescopy-paste de nompins)
23 iquestCoacutemo exporto una ontologiacutea de Proteacutegeacute a CLIPS (2a posibilidad)
Alternativamente a hacer corta y pega de los ficheros de protege en el fichero de CLIPS se puede crearun fichero que cargue todos los ficheros sin tener que juntarlos
Para ello hay que crear un fichero que incluya las oacuterdenes de carga de los diferentes ficheros Por ejemplopodemos llamar a este fichero cargaclp El contenido de este fichero seraacute
(load PATHnompont)(load-instances PATHnompins)(load PATHfichero-de-reglasclp)
Donde PATH es el directorio donde se encuentran vuestros ficherosEste fichero se ha de cargar desde el inteacuterprete mediante la orden batch ((batch cargaclp)) o con
la opcioacuten de menuacute load batch Usando la instruccioacuten load-instances evitamos tener que antildeadir al fichero de instancias la instruccioacuten
definstances
24 Per quegrave em doacutena error CLIPS al tenir una instancia que hereta de meacutesdrsquouna classe
7
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1159
8 Capiacutetulo 2 Protegravegegrave
Proteacutegeacute permet lrsquoheregravencia muacuteltiple en instagravencies perograve CLIPS no En CLIPS nomeacutes poden tenir heregravenciamuacuteltiple las classes perograve no les instagravencies Aixoacute es aixiacute perque el lenguatge de CLIPS es orientat a objectesno es realment un lenguatge drsquoontologiacutees
La manera meacutes senzilla de simular-ho si les clases no tenen ancestres comuns eacutes tenir classes que repre-sentin aquesta heregravencia muacuteltiple i fer que les instagravencies pengin drsquoelles que es com es faria a un llenguatge
orientat a objectesEn el cas de tenir ancestres comuns no es pot fer lrsquounica manera es duplicar la instancia amb nomsdiferents i penjar-les de les clases on es vol tenir-la
De totes maneres el CLIPS permet recuperar fagravecilment les instagravencies que tenen un valor especiacutefic en unslot pel qual el meacutes senzill eacutes tenir una uacutenica jerarquia i incloure altres possibles classificacions com a slotsencara que obviament perdrem la posibilitat de fer servir una jerarquia de valors per aquest
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1259
3 CLIPS
31 Instalacioacuten del CLIPS
311 iquestCoacutemo instalar CLIPS
La herramienta CLIPS es multiplataforma y esta disponible para los tres SO maacutes utilizados MicrosoftWindows Linux y Mac OS X
iquestCoacutemo instalar CLIPS en Windows
Primero de todo debemos bajarnos el programa de la paacutegina oficial de CLIPS accesible desde este link
(httpclipsrulessourceforgenet) Desde el aacuterea de descarga os podreis bajar el instalador parawindows
iquestCoacutemo instalar CLIPS en Linux
En muchas distribuciones de Linux CLIPS esta disponible como un paquete adicional el paquete sueleinstalar la versioacuten con interfaz graacutefico Si no encuentras el paquete especiacutefico para la distribucion que usassiempre puedes compilarlo a partir del paquete con los fuentes
Tambieacuten estaacute la posibilidad de utilisar el emulador de windows WINE Una vez instalado el emulador sepuede instalar CLIPS y este funcionaacute igual que sobre windows
iquestCoacutemo instalar CLIPS en Mac OS X
Primero de todo debemos bajarnos el programa de la paacutegina oficial de CLIPS accesible desde este link(httpclipsrulessourceforgenet ) Desde el aacuterea de descarga podeis bajar el intalador para MACOS X
312 Entorn finestres VS Consola de comandes
Encara que lrsquoentorn de finestres eacutes molt meacutes intuiumltiu CLIPS a la seva versioacute en liacutenea de comandes eacutes moltmeacutes ragravepid (segurament perquegrave no ha de mostrar en tot moment lrsquoagenda de fets les instancies les regles
etc)La diferencia de velocitat eacutes molt notable en cas de problemes de rendiment o de sensacioacute que lrsquoentorn
de finestres es queda penjat (o directament es tanca sense previ aviacutes) recomanem provar la versioacute en liacuteneade comandes
32 Los hechos
321 iquestQueacute es un hecho en CLIPS
Conceptualmente un hecho representa un dato abstracto del cual almacenamos valores Se puede vercomo una lista de campos donde el primer campo hace referencia al ldquodatordquo al cual le asignamos una listade valores que le suceden teniendo una relacioacuten entre siacute
Formalmente el primer campo es un siacutembolo y los campos restantes son valores
9
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1359
10 Capiacutetulo 3 CLIPS
(siacutembolo valor1 valor2 valorN)
322 iquestQueacute es un hecho ordenado (order Facts)
Un hecho ordenado tienen formato libre por lo tanto no existe restriccioacuten alguna en el orden de los campos
Los campos de un hecho ordenado pueden ser de cualquier tipo primitivo de datos excepto el primero quedebe ser un siacutembolo Como ejemplo tenemos
1 (hermanos Antonio Javier Carlos)2 (padre Pedro David)
323 iquestQueacute es un hecho no ordenado (deftemplates facts)
A traveacutes de los hechos no ordenados podemos abstraernos de la estructura de un hecho asignado unnombre a cada campo (slots)
1 (deftemplate nombre-template comentario2 (slot nombre-slot (tipo-del-slot))3 (multislot nombre-slot (tipo-del-slot))4 )
Por ejemplo
1 (deftemplate avioacuten2 (slot nombre_avion (type STRING))3 (slot compania (type STRING))
4 (slot numero_plazas (type INTEGER) (default 100))
324 iquestPuedo tener un vector como slot
Si debe declararse como multislot
325 iquestPuedo asignar propiedades a los slots
Siacute las maacutes importantes son
Type El tipo de dato primitivo que contiene (en mayuacutesculas)
Allowed-X Permite especificar un conjunto de valores permitidos Siendo X un tipo de datos primitivo(en minuacutesculas y plural) rarr si el slot toma un valor del tipo X debe pertenecer a los valores permi-tidos X puede ser values especificando entonces todos los valores posibles que puede tomar el slotindependientemente del tipo de dato
Range Especifica un rango para slots numeacutericos
Cardinality Nuacutemeros miacutenimo y maacuteximo de elementos que puede tener un multislot
Default Valor por defecto Si ponemos NONE como valor por defecto significaraacute que no se podraacute crear la
instancia a no ser que se especifique el valor de ese slot
1 (deftemplate estudiante2 (slot edad (type INTEGER) (range 0 99))
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1459
32 Los hechos 11
3 (multislot asignaturas (type STRING) (cardinality 1 5))4 (slot num-carreres (default 1))5 (multislot notas (allowed-strings MH NP))6 )
326 iquestQueacute debo utilizar hechos ordenados o no ordenados
Como se puede intuir si tenemos un conjunto de hechos los cuales conceptualmente pertenecen al mismoaacutembito seraacute una solucioacuten maacutes elegante agruparlos a traveacutes de un deftemplate En caso que tengamos quealguacuten hecho aislado seraacute mas sencillo declararlo como un hecho ordenado
327 Fets o Objectes
Veient la definicioacute de deftemplate podem confondrersquons a lrsquohora de decidir si fer servir fets o fer servirobjectes
Deixant de banda altres diferegravencies ja comentades (les classes suporten jerarquia de classes heregravenciaetc) els objectes es fan servir per representar el coneixement (mitjanccedilant un conjunt drsquoinstagravencies)
Aixiacute que generalment farem servir classes i objectes per representar coneixement mentre que farem servirels fets per portar control sobre lrsquoexecucioacute del problema
Per exemple podriacuteem definir un deftemplate per emmagatzemar un resultat o per poder controlar lrsquoestatde lrsquoexecucioacute
A la pragravectica de Mikeo (penjada a la web de lrsquoassignatura) teniacuteem un deftemplate habitacion-actual
1 (deftemplate habitacion-actual2 (slot habitacion)3 (slot area-restante)4
(slot presupuesto-restante)5 (slot precio-total)6 (slot prioridad-actual)7 )
Amb el qual controlagravevem la construccioacute drsquouna habitacioacute Assignagravevem una instagravencia de la classe habita-cioacute al slot habitacion de habitacion-actual i mitjanccedilant una segraverie de regles que feien unificacioacute ambhabitacion-actual actuagravevem sobre lrsquohabitacioacute drsquouna manera o drsquoun altre
328 Creacioacuten de hechos (assertdeffacts)
Si queremos crear un solo hecho utilizaremos el comando assert Por ejemplo (assert (casa roja))Si por el contrario queremos crear una estructura ordenada de hechos utilizaremos deffacts
(deffacts mishechos (casa roja) (pelota azul))
329 Modificar un fet
Per modificar un fet (per exemple molt uacutetil si estem treballant amb deftemplates) ho podem fer mitjanccedilant(modify ltINSTANCIAgtltFETSgt)
Per exemple si tingueacutessim el deftemplate persona
1 (deftemplate persona2 (slot nom)3 (slot edad)4 (slot dni)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1559
12 Capiacutetulo 3 CLIPS
I hagueacutessim afegit el fet
(assert (persona (nom Pepe)(edad 25)(dni 46974431)))
I el fet
(assert (aniversari 46974431))
Podriacuteem tenir la seguumlent regla
1 (defrule aniv2 aniversari lt- (aniversari dni)3 persona lt- (persona (edat edat)(dni dni))4 =gt5 (retract aniversari)6 (modify persona (edat (+ 1 edat)))7 )
La qual srsquoactivaragrave si hi ha un fet aniversari drsquouna persona Fent servir el dni indicat al fet aniversaribusquem el fet persona que teacute el mateix dni Deixem el valor edat a la variable edat per poder treballaramb ella meacutes endavant
Hem agafat tambeacute la direccioacute del fet aniversari per tal de poder esborrar-lo de la base de fets Aixograve srsquohafet per dues raons
Primer per mantenir meacutes neta la base de fets Segon i meacutes important Com que hem canviat el fet laregla tornaragrave a fer unificacioacute amb el fet (perquegrave ara eacutes diferent) amb la regla aniversari amb el que entrariadintre drsquoun bucle sense fi on srsquoaniria incrementant lrsquoedat de la persona
Un cop hem esborrat el fet aniversari incrementem en 1 el valor del slot edat de la persona fent servirla variable edat que hem declarat a la part esquerre de la regla
El comportament de modify es fer un retract del fet a la base de fets i despreacutes fer un assert amb els nous
valors Si volem canviar mes drsquoun slot del fet es convenient canviar-los tots a la vegada La raoacute es que cadavegada que fem un modify lrsquoapuntador al fet es modifica i lrsquoapuntador que tenim a la variable que hem fetservir ja no es vagravelid
Si no temim mes remei que fer la modificacioacute del fet pas a pas srsquoha de saber que la crida a modify retornalrsquoapuntador al nou fet Si el guardem a altra variable (o a la mateixa) podrem continuar modificant el fetamb la nova referegravencia
3210 Com elimino un fet de la base de fets
Per eliminar un fet de la base de fets ho podem fer amb la paraula clau (retract ltFETgt) on ltFETgt eacutes
un punter al fetPer obtenir aquest fet ho podem fer fent servir ltVARgtlt- ltFETgt a la part esquerre de la reglaPer exemple
1 (defrule accionsvent2 vent lt- (vent tipus)3 =gt4 (switch tipus5 (case poc then (assert (accio persiana0)))6 (case normal then (assert (accio persiana50)))7 (case molt then (assert (accio persiana100)))8 )9 (retract vent)
10 )
Afegiragrave fets per realitzar les accions pertinents i esborraragrave el fet de la base de fets
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1659
33 Variables 13
33 Variables
331 Variables a CLIPS
No cal declarar una variable (ni el seu tipus) nomeacutes cal afegir un interrogant al comenccedilament drsquoun simbol
per indicar que eacutes una variableCLIPS srsquoencarrega del control de tipus depenent del que assignem a la variablePer exemple testvar correspondria a la variable testvar Si per exemple assigneacutessim lrsquoenter 3 a
testvar CLIPS tractaria la variable com una variable entera
332 Com assignar un valor a una variable
Per assignar un valor a una variable es fa servir el megravetode (bind) amb la forma
(bind ltVARIABLEgtltVALORgt)
On ltVALORgt pot ser un valor o un megravetode que retorni un valor Per exemple si volem assignar un 4 a lavariable var
(bind var 4)
O per exemple podriacuteem assignar a la variable var la suma de 2 meacutes 2
(bind var (+ 2 2))
333 iquestCoacutemo declarar variables globales
Para crear una variable global hay que meterla dentro de la construccioacuten defglobal La declaracioacuten de la
variable seguiraacute el modelo nombreVariable = expresioacutenPor ejemplo
(defglobal presupuesto = 0)
Pueden aparecer en la parte izquierda de las reglas si no son utilizadas para asignar un valor y su cambiono activa reglas pero no pueden ser paraacutemetros de funciones ni meacutetodos
334 iquestCoacutemo trabajar con variables sumando restando por ejemplo contadores
La mejor forma es con variables globales se definen asiacute (defglobal x = 0) puede ser el valor quequeramos tanto nuacutemero string Y si queremos sumarle 10 por ejemplo
(bind x (+ x 10))
Las variables locales como por ejemplo x soacutelo tienen valor mientras dura su ejecucioacuten y eso suele ser enesa misma liacutenea o en un bucle Si le damos valor a x y luego preguntamos por ella nos diraacute que no existe
335 Quina diferegravencia hi ha entre les variables del tipus nom_variable i les del tipus $nom_variable
Les primeres contenen un sol valor i les segones en poder contenir meacutes drsquoun (o cap)
336 Quegrave significa lrsquointerrogant () quan va sol
Eacutes una variable anogravenima Pots utilitzar sense posar-hi cap nom si no trsquointeressa el valor en concret Perexemple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1759
14 Capiacutetulo 3 CLIPS
(Primer filtre_preu )
Aquesta condicioacute significa ldquosi el fet (Primer filtre_preu) teacute algun valorrdquo O sigui que si tingueacutessimel fet (Primer filtre_preu ok) es compliria la condicioacute (i si en comptes de ldquookrdquo fos ldquopatatardquo tambeacute escompliria) En canvi si el fet fos uacutenicament (Primer filtre_preu) no es compliria la condicioacute
337 Quegrave significa el dogravelar ($) quan va sol
Eacutes com lrsquointerrogant perograve admet meacutes drsquoun valor Per exemple
(Primer filtre_preu $ ok)
donaragrave cert pels fets de lrsquoestil (Primer filtre_preu patata ok) (Primer filtre_preu hola ok)(Primer filtre_preu patata hola ok) (Primer filtre_preu ok) Eacutes a dir no importa els valors quehi hagi entre filtre_preu i ok si al final hi ha un ok
338 iquestComo puedo ver los hechos presentes en un momento determinado
Abriendo la Facts Window en Window de la barra de menuacute
34 Las reglas
341 iquestCoacutemo construir una regla
Para construir una regla utilizaremos la construccioacuten defrule
Sintaxis
(defrule ltnombre-reglagt [ltcomentariogt][ltdeclaracioacutengt]ltelemento-condicioacutengt Parte izquierda (LHS)
=gtltaccioacutengt) Parte dcha (RHS) de la regla
Una regla consta de un conjunto de condiciones (antecedente) tambieacuten denominados elementos condicio-nales (EC) o parte izquierda (LHS) y de un conjunto de acciones (consecuente) tambieacuten denominado partederecha de la regla (RHS) La regla se activaraacute siempre que se satisfagan todos los EC mediante hechos oinstancias que los cumplan
Si se introduce en la base de reglas una nueva regla con el mismo nombre que el de una existente la nuevaregla reemplazaraacute a la antigua
Si una regla no tiene parte izquierda es decir no tiene elementos condicionales entonces el hecho(initial-fact) actuaraacute como el elemento condicional para ese tipo de reglas y la regla se activaraacute cadavez que se ejecute un comando reset
342 iquestCoacutemo gestionar la parte izquierda (LHS) de una regla
Declarar hechosSi no se especifica ninguna condicioacuten la regla se activaraacute siempre Una condicioacuten puede ser un simple hecho
(Ej vegetariano) o un hecho ordenado con unos valores concretos (Ej (persona (nombre Juan))) Si loque queremos es obtener el valor de un hecho insertaremos una variable en su lugar (Ej (persona (nombre
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1859
34 Las reglas 15
n)) ) Entonces entraraacute en la regla para cada valor posible que pueda asignar a la variable n a partir delos hechos
Si queremos indicar cualquier valor utilizaremos el siacutembolo y para cualquier lista el siacutembolo $ (Ej(evento ) (estilo $) ) Tambieacuten existe la opcioacuten de guardar en una variable una referencia al objetoEllo se consigue poniendo var lt- a su izquierda (Ej p lt- (persona (nombre Juan))) Se puede usarpor ejemplo para pasaacuterselo de paraacutemetro a una funcioacuten llamada en la RHS
Establecer condiciones
Ademaacutes podemos especificar restricciones adicionales sobre los valores que puede tomar un campo de unhecho Existen tres tipos principales de restricciones Conectadas (por orden de precedencia o prioridad)
not (~) Evita que cierto campo cumpla determinada restriccioacuten
and (amp) Combina dos restricciones conjuntivamente
or (|) Combina dos restricciones disjuntivamente
De predicado () Obliga a que cierto campo cumpla determinada condicioacuten (especificada por el predicado)
Por valor devuelto por una funcioacuten = Permite llamar a una funcioacuten y utilizar el valor devuelto pararestringir el valor que pueda tomar un campo de un hecho
Se puede comprobar si se cumple una determinada condicioacuten mediante el constructor test Dentro detest se pueden hacer llamadas a cualquier funcioacuten o predicado ya sea primitiva de CLIPS o definidapor nosotros
Combinar elementos
Los diferentes elementos de la parte izquierda van impliacutecitamente unidos mediante una AND que indicaconjuncioacuten No obstante podemos hacerlo expliacutecitamente mediante (and (cond1) (cond2)) aunque suelen
utilizarse para anidar ANDs dentro de ORsOR Sirve para hacer una disyuncioacuten (or (cond1) (cond2)) Es equivalente a escribir varias reglas en lasque cada una de ellas tenga uno de los componentes del OR en su parte izquierda y la misma parte derecha
NOT Sirve para detectar si no existe un determinado hecho (Ej (not (estilo sibarita)))exists Cuando a un conjunto de elementos se le antecede exists se comprueba que hay al menos un
hecho en la base de hechos que cumpla la condicioacuten (Ej (exists(bebida precio (ltprecio 5))) )forall Permite comprobar si todos los hechos que satisfacen un determinado patroacuten cumplen una serie
de condiciones (Ej (forall(plato (estilo moderno)))
343 iquestCoacutemo obtener la direccioacuten de hechos o instancias situados en LHS
En algunas ocasiones vamos a necesitar realizar alguacuten tipo de accioacuten en la parte derecha de las reglassobre hechos o instancias que cumplan unas determinadas condiciones Pero para ello necesitaremos primerotener acceso a estos elementos para despueacutes poder operar sobre ellos Esto lo conseguiremos guardando ladireccioacuten del elemento en una variable hacieacutendolo del siguiente modo
variable_direccion lt- (elemento)
Pongamos un ejemplo para ver realmente el funcionamiento y uso de esta posibilidad que CLIPS nosofrece
1 (defrule imprime-area2 instancia lt- (object (is-a Rectangulo))3 =gt4 (printout t Area del rectangulo (instance-name instancia)5 (send instancia calcula-area) crlf)6 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1959
16 Capiacutetulo 3 CLIPS
Cuando se ejecuta esta regla se imprimiraacuten las aacutereas de todas las instancias de la clase Rectangulo Enla parte izquierda de la regla lo que hacemos es guardar en la variable instancia la direccioacuten de la instanciade Rectangulo que estamos tratando en ese momento La regla se ejecutaraacute para todas las instanciasalmacenadas en la memoria de trabajo que cumplan la condicioacuten (is-a Rectangulo) es decir para todaslas instancias de la clase Rectangulo En la parte derecha de la regla donde se ejecutan las acciones podemosver que se imprimiraacute para cada instancia lo siguiente Area del rectangulo [nombre_instancia] aacuterea
del rectaacutengulo La funcioacuten instance-name nos devuelve el nombre de la instancia que le pasamos porparaacutemetro Ademaacutes hemos llamado al gestor de mensajes calcula-area para que nos devuelva el area delrectaacutengulo
344 iquestCoacutemo hacer sentencias or en la izquierda de las reglas
Con (or ) Si por ejemplo tenemos dos hechos (a) y (b) y queremos ejecutar la derecha de la reglacuando se cumpla uno de los dos tendremos que hacer (or (a) (b)) Atencioacuten porque la parte derecha seejecutaraacute tantas veces como veces se cumpla cada uno de los hechos si para nosotros existe tanto (a) como(b) la parte derecha se ejecutaraacute dos veces Para que soacutelo se usa una vez podemos hacer combinaciones de
or y and (funciona igual) o usar un patroacuten por ejemplo (persona Juan|Pedro) soacutelo se ejecutariacutea una vez
345 Com afegir una condicioacute a la part esquerre drsquouna regla
A vegades eacutes necessari que una regla srsquoinstanciiuml si es produeix una condicioacute especial (i no un fet) Per feraixoacute farem servir la comanda (test ltCONDICIOgt)
Per exemple imaginem que la nostre base de fets compte amb un fet (preu valor) amb un preudeterminat Imaginem que volem una regla que srsquoinstanciiuml quan aquest valor eacutes meacutes gran que 30
Per fer-ho fent servir tot el que hem explicat
1 (defrule preucar2 (preu preu)3 (test (gt preu 30))4 =gt5 (printout t El preu es mes gran que 30)6 )
Eacutes a dir si el preu eacutes meacutes gran que 30 srsquoimprimiragrave un missatge per pantallaAquestes condicions poden contenir ANDs i ORs de varies condicionsPer exemple
1 (defrule preulimit2 (preu preu)3 factminim lt- (preuminim minim)4 factmax lt- (preumaxim maxim)5 (test (and (gt preu minim) (lt preu maxim) ))6 =gt7 (retract factminim)8 (retract factmax)9 (printout t El preu estagrave dintre del rang)
On comprovarem si el preu estagrave dintre drsquoun rang determinat i en aquest cas esborra els fets que contenen
el magravexim preu i el miacutenim preu i mostra un missatge per pantalla
346 Puede una misma regla ejecutarse maacutes de una vez
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2059
34 Las reglas 17
Es muy importante entender que cada regla se ejecutaraacute una vez por cada combinacioacuten de valores en suLHS
1 (defrule regla2 (color col)3 (peso pes)4 =gt5
Si tengo tres colores y dos pesos asertados la regla se ejecutaraacute 6 veces una con cada combinacioacuten decolor y peso
347 Com puc definir lrsquoordre de les regles
La idea drsquoun sistema basant en regles eacutes no definir un ordre lineal drsquoaquestes (costa deixar de pensar de
forma iterativa)En el cas de necessitar que una regla srsquoexecuti despreacutes drsquouna altre pots fer servir Fets la regla anteriorcrea un fet que la segona regla tindragrave a la part esquerra
1 (defrule pregunta12 =gt3 (assert (pregunta1Feta))4 5 )6
7 (defrule pregunta2
8 (pregunta1Feta)9 =gt
10 11 )
I finalment pots usar la propietat salience Aquesta propietat indica la prioritat drsquoexecucioacute de les regles( les regles amb salience majors srsquoexecutaran abans ) Pot prendre valors positius i negatius entre -10000 y+10000 Per defecte les regles tenen salience 0
1 (defrule pregunta12 (declare (salience 2))3 =gt4 5 )6
7 (defrule pregunta28 (declare (salience 1))9 =gt
10 11 )
El valor indicado en la propiedad salience puede ser el nuacutemero directamente o una expresioacuten por ejemplovariable10 podemos usar variable para elegir que regla se ejecutaraacute
Las prioridades deben ser usadas solo para determinar el orden en el que se disparan algunas reglas sobreotras no para fijar el flujo de control ya que la principal ventaja de un sistema basado en reglas es larepresentacioacuten declarativa del conocimiento y de esta forma abusando de las prioridades conduce a unsistema procedimental
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2159
18 Capiacutetulo 3 CLIPS
348 Com forccedilar que una regla sigui la primera
Per que aquesta regla sigui la primera ha de tenir el salience meacutes gran de totes
1 (defrule presentacio2 (declare (salience 20))3 =gt4 (printout t ------ Benvingut ----- crlf)5 )
349 Vull guardar certs valors que es fan servir durant lrsquoexecucioacute de diferents regles Com hopuc fer
Tens principalment dues alternatives Si el valor eacutes un tipus bagravesic pots fer servir una variable global ambla sintaxi seguumlent
(defglobal nom_variable = valor)
Aquesta sentegravencia no va a dins de cap funcioacute ni regla es posa sola a la part que creguis convenient delcodi Vegem un exemple
(defglobal preu_minim_primer = 1000)
Per fer-la servir es fa exactament de la mateixa manera que amb una variable normal perograve has de posarels dos asteriscs Per exemple
(bind preu_minim_primer curr-preu)
Per altra banda si el valor o valors que vols guardar han de ser instagravencies una bona estrategravegia pot serutilitzar un deftemplate Eacutes uacutetil sobretot per anar guardant solucions temporals o llistes drsquoelements quepoden formar part de la solucioacute
Per utilitzar-ho has de seguir els passos seguumlents
1 Definir el deftemplate
(deftemplate nom_del_deftemplate(multislot nom_multislot)
(slot nom_slot)
)
Amb un exemple es veuragrave meacutes clar
(deftemplate llista-plats(multislot primers)(multislot segons)(multislot postres)
)
2 Inicialitzar el deftemplate
(defrule[condicions vagraveries] La condicioacute base eacutes que llista-plats no srsquoha inicialitzat encara
(not (llista-plats))=gt
llista conteacute els valors de llista-plats (que de moment estan buits)(bind llista (assert (llista-plats)))
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2259
35 Las clasesinstancias 19
3 Assignar-li valors
(bind segons_plats (find-all-instances ((plat Plat)) TRUE)(modify llista (segons segons_plats))
4 Recuperar els valors
(defrule[condicions vagraveries]llista lt- (llista-plats (segons $segons_plats))
=gt
Ara la variable $segons_plats conteacute tots els elements de segons
35 Las clasesinstancias
351 Tengo que representar la jerarquiacutea de un frame iquestEs preferible antildeadir las subclases a laontologiacutea o bien diferenciarlas mediante un slot en la superclase
Las dos formas son vaacutelidas pero es recomendable representarlas en clases separadas cuando se vayan abuscar instancias de ese tipo ya que asiacute no tendremos que hacer un recorrido por todas las de la superclaseNo obstante si soacutelo se trata de una caracteriacutestica puntual del frame y no vamos a hacer buacutesquedas de unaexclusiva subclase entonces seraacute maacutes eficiente antildeadir un slot debido a su mejor accesibilidad
352 iquestQueacute es un objeto
Podriacuteamos decir que un objeto es un hecho no ordenado con herencia
353 iquestPorqueacute usar objetos en contexto de la praacutectica de CLIPS de IA
Como bien sabemos una parte de la praacutectica de SBCrsquos consisten en crear la ontologiacutea Esta ontologiacutease exporta para poder interactuar con CLIPS en formato pins y pont El archivo pont contendraacute ladeclaracioacuten de todas las clases creadas previamente por Protege (defclass ) El archivo pins contendraacute
todas las instancias de las clases declaradas en el archivo pont Como puede intuir el lector se necesitaraacuteinteractuar con los objetos previamente creados por Protegravegegrave
354 Como se definen las clases
Para definir las clases usaremos el constructor defclass
(defclass ltnombregt [ltcomentariogt](is-a ltnombre-de-superclasegt)[(role concrete | abstract)]
[(pattern-match reactive | non-reactive)]ltslotgt definicioacuten de los atributos de la clase
ltdocumentacioacuten-handlergt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2359
20 Capiacutetulo 3 CLIPS
En caso de desear que la nueva clase herede las propiedades de otra ya existente el nombre de esta deberaacuteespecificarse despues de is-a El rol determinaraacute si la clase es concreta (se puede instanciar) o abstracta(destinada a ser superclase) El pattern-match debe declararse como reactivo si se desea que las instanciasde la clase puedan unificar con los elementos objeto de las reglas (siacutembolo lt-) Los slots correspondena los atributos de la clase y los handlers a las funciones de eacutesta Los handlers se pueden declarar en ladeclaracioacuten de la propia clase pero se deben definir externamente Dado que no aporta ninguna ventaja
declararlos es recomendable definirlos directamente Noacutetese que todo aquello que estaacute entre corchetes ([])constituye informacioacuten adicional que no es obligatorio especificar
1 (defclass Persona2 (is-a Ser_Vivo)3 (role concrete)4 (single-slot edad5 (type INTEGER)6 (range 1 99)7 (cardinality 0 1)8 (create-accessor read-write)9 )
10 (multislot amigos11 (type INSTANCE)12 (allowed-classes Persona)13 )14 )
El comportamiento y declaracioacuten de los slots es ideacutentico al de los slots de los hechos ordenados Losatributos de tipo INSTANCE (referencian otras instancias) estan en formato INSTANCE-NAME
355 Com consulto una instagravencia a partir drsquouna regla
Podem fer servir la part esquerre drsquouna regla per trobar instagravencies Lrsquouacutes eacutes molt semblant a trobar elpunter a un fet fent servir
(object [(is-a ltNOM_CLASSEgt)|(name ltNOM_INSTANCIA)|(ltNOM-SLOTgt ltVALORVARIABLE))])
Per exemple si volem que una regla srsquoinstanciiuml si tenim instanciat un plat de la classe Plat podriem ferservir
1 (defrule tenimplat2 plat lt- (object (is-a Plat))3 =gt4 (print t (send plat get-nom) crlf)
La regla imprimiragrave el nom del plat que trobi Eacutes important notar que srsquoactivaragrave per cada instagravencia de platque tinguem a la base de coneixement
Podem consultar els valors de la instancia fent servir condicions a la part esquerre de la regla Per exemplesi nomeacutes volgueacutessim els plats amb un preu meacutes gran que 30
1 (defrule platCar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Srsquoactivaragrave per tots els plats amb un preu major a 30
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2459
35 Las clasesinstancias 21
Srsquoha drsquoanar amb cura per aquest tipus de regla ja que si la base de coneixement eacutes molt amplia pot acabarderivant amb problemes de memograveria
Per exemple si en comptes de preguntar per una instagravencia de Plat pregunteacutessim per dues instancies dePlat
1 (defrule platsCars2 plat1 lt- (object (is-a Plat) (Preu p1))3 plat2 lt- (object (is-a Plat) (Preu p2))4 (test (gt p1 30))5 (test (gt p2 30))6 =gt7 (print t (send plat1 get-nom) i (send plat1 get-nom) soacuten cars8 crlf)9 )
Faria unificacioacute amb totes les combinacions possibles (amb repeticions) de dos plats de tota la base deconeixement Aixograve es podria anar ampliant fins fer-se intractable
Si tenim drsquoalguna manera el nom de la instancia podem fer
1 (defrule platPicant2 (cuina (plat p))3 (object (name p) (picant pi))4 =gt5 (print t picant pi crlf)6 )
Aixoacute es pot servir per crear condicions que facin servir noms drsquoinstancies que tenim almacenats a slotsdrsquoaltres instancies per exemple
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send v get-Preu) crlf)6 )
Aquesta regla imprimiria el preu del vi asociat al plat si es negre
356 Tengo problemas en condiciones de reglas con slots de instancias obtenidos con send
A veces dan problemas las reglas en las que las condiciones sobre los valores de los slots de una instanciase escriben usando mensajes get sobre los atributos de una instancia en lugar de utilizar patrones paraobtenerlos por ejemplo la regla
1 (defrule platcar2 plat lt- (object (is-a Plat) )3 (test (gt (send plat get-Preu) 30))4 =gt5 (print t (send plat get-nom) es car6 crlf)7 )
No funciona correctamente en CLIPS pero la regla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2559
22 Capiacutetulo 3 CLIPS
1 (defrule platcar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Siacute lo haceEn el caso de que el valor del slot sea booleano se puede escribir la regla como
1 (defrule platpicant2 plat lt- (object (is-a Plat) (Picant TRUE))3 =gt4 (print t (send plat get-nom) es picant crlf)
En el caso de que el slot sea a su vez una instancia se puede utilizar para obtener los valores de estainstancia en la condicion como se explica en la pregunta anterior
357 Tengo problemas con instancias obtenidas del slot de otra instancia en el patroacuten de unaregla
Este problema aparece cuando el patron de una regla instancia una variable a un nombre de instancia yesta no esta definida en el modulo de la regla por ejemplo si la regla siguiente pertenece a un modulo queno es el de la instancia
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4
=gt5 (print t preu (send v get-Preu) crlf)6 )
La regla se quejaraacute de que la instancia no existe al enviarle el send ya que solo se busca la instancia dentrodel moacutedulo de la regla y no en los importados Para arreglar esto se puede usar la funcioacuten (instance-address[ltMODULOgt|] ltINSTANCIAgt) que busca la direccion de la instancia en un modulo concreto o en todos losmoacutedulos que se importan () Deberiacuteamos entonces escribir la regla
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send (instance-address v) get-Preu) crlf)6 )
358 iquestCoacutemo realizar una buacutesqueda de instancias que cumplan unas restricciones
CLIPS nos ofrece varias funciones de buacutesqueda de instancias que cumplan unas determinadas restriccionesque a nosotros nos interese
La funcioacuten find-instance Esta funcioacuten devuelve la primera instancia que cumple todas las restric-ciones indicadas
La funcioacuten find-all-instances Esta funcioacuten devuelve todas las instancias que cumplen las restric-ciones indicadas
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2659
35 Las clasesinstancias 23
La sintaxis de ambas funciones es igual exceptuando el nombre de la funcioacuten(find-all-instances (clase_instancias) (restricciones))A continuacioacuten se muestran varios ejemplos
(bind rectangulos (find-all-instances ((inst Rectangulo)) (gtinstaltura 10))) Des-pueacutes de ejecutar esta funcioacuten en la variable rectangulos habraacute una lista con todas las instancias de la
clase Rectangulo cuya altura sea superior a 10(bind rectangulos (find-all-instances ((inst Rectangulo)) (and (gtinstaltura 10) (=instanchura 7)))) Este trozo de coacutedigo hace que en la variable rectangulos se guarde una listade las instancias de la clase Rectangulo que tienen una altura superior a 10 y una anchura igual a 7
Estas funciones que CLIPS nos ofrece tienen otra funcionalidad y es que podemos realizar buacutesquedas deconjuntos de instancias
(bind rectangulos (find-all-instances ((a Rectangulo) (b Rectangulo)) (= aalturabaltura))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas de instancias de laclase Rectangulo que tienen la misma altura
Por uacuteltimo es necesario comentar que se pueden realizar buacutesquedas de conjuntos de instancias que seande distintas clases
(bind figuras (find-all-instances ((rect Rectangulo) (circ Circulo)) (= rectalturacircradio))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas ltrectangulocirculogtque cumplan que la altura del rectaacutengulo sea igual al radio del ciacuterculo
Existen maacutes comandos para obtener instancias pero son menos utilizadas a nivel baacutesico como pueden serany-instancep do-for-instance do-for-all-instances y delayed-do-for-all-instances
359 iquestCoacutemo se interactuacutea con objetos
La interaccioacuten con objetos se efectuacutea mediante lo que se denomina mensaje
(defmessage-handlerltnombre-clasegtltnombre-mensajegt[lttipo-handlergt] [ltcomentariogt]ltparaacutemetrogt [ltparaacutemetro-comodiacutengt])ltaccioacutengt
)
Un gestor de mensajes consta de 7 partes
1 Nombre de clase a la que el gestor estaraacute asociado
2 Nombre del mensaje
3 Tipo de gestor (Nosotros habitualmente usaremos primary que viene por defecto)
4 Comentario (opcional)
5 Lista de paraacutemetros6 Paraacutemetro comodiacuten (para gestionar muacuteltiples paraacutemetros)
7 Secuencia de acciones o expresiones que seraacuten ejecutadas por el gestor
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2759
24 Capiacutetulo 3 CLIPS
Enfocado a la praacutectica de CLIPS la maacutes comuacuten es que queramos interactuar con objetos para
1 Imprimir los objetos Un ejemplo
1 (defmessage-handler avion imprimir-beneficio ()
2 Para implementar funciones calculadas asociadas al objeto Un ejemplo
1 (defmessage-handler avion calcular-beneficio ()2 ( selfplazas-ocupadas selfprecio-billete))3 )
Como se puede observar el paraacutemetro impliacutecito self contiene la instancia activa para este mensaje
3510 iquestComo se interactuacutea con las instancias de los objetos
Podremos interactuar entre las instancias de los objetos mediante la funcioacuten send
(send ltexpresioacuten-de-objetogtltnombre-de-mensajegtltexpresioacutengt)Donde se toman como argumentos el objeto destino del mensaje el mensaje mismo y otros paraacutemetros
que debieran ser pasados a los gestoresParticularmente en el aacutembito de la praacutectica usualmente necesitaremos utilizar el envioacute de mensajes de
tipo get put and delete Estos mensajes tiene la siguiente sintaxis
get-ltnombre-atributogt
put-ltnombre-atributogt
delete
Aquiacute tenemos un ejemplo de como utilizarlo recordando que ponemos entre corchetes la instancia la cualse enviacutea el mensaje
(defclass avion (is-a USER)(role concrete)(slot precio-billete (create-accessor read) (default 34))(slot plazas-ocupadas (create-accessor write) (default 0)))
Clase creada
gt(make-instance a of avion) Creacioacuten de una instancia de avion[a]
gt(send [a] get-precio-billete) Obtencioacuten de un slot34 Resultado obtenidogt(send [a] put-plazas-ocupadas 100) Modificacioacuten de un slotgt(send [a] delete) Eliminacioacuten de la instanciaTrue
3511 Uso de make-instance
Cuando queremos crear una instancia de una clase para ir rellenandola con los resultados o datos quevayamos obteniendo se haria lo siguiente
(bind variable_instancia (make-instance nombre_instancia of nombre_clase))
Una vez creada podemos jugar con dicha instancia en las diferentes reglas siempre que la llamemos enlos activadores
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2859
35 Las clasesinstancias 25
(defrule reglavar_instancia lt- (object (is-a nombre_clase))=gt
)
De esta manera dentro de la regla podemos hacer acciones con la instancia por ejemplo(send var_instancia put-articulo articulo_ejemplo)
3512 Como generar automaacuteticamente nombres de instancia
En ocasiones queremos crear instancias en reglas y queremos que su nombre sea distinto del de otrasque ya tenemos Para ello podemos utilizar las funciones gensym y gensym La primera genera un siacutembolodel estilo genN donde N es un nuacutemero La segunda hace lo mismo pero aseguraacutendose de que ese siacutembolono exista ya Se puede reiniciar el contador que usan estas dos funciones con el operador (setgen ltnumgt)donde ltnumgt es el nuacutemero por el que queremos que empiecen ahora los siacutembolos
Para usar esto para generar el nombre de una instancia podemos hacer
(make-instance (gensym) of ltclasegt)
Cada vez que se ejecute se generaraacute un nombre de instancia nuevoSi creamos instancias de diferentes clases y queremos que las instancias tengan nombres que podamos
identificar podemos concatenar siacutembolos a los siacutembolos generados por gensym por ejemplo
(make-instance (sym-cat pepe- (gensym)) of ltclasegt)
generaraacute una instancia con el nombre pepe-genN
3513 Com fer un getset drsquoun slot drsquouna classe
Per consultar el valor drsquoun slot drsquouna classe ho podem fer enviant-li un missatge de la seguumlent manera
(send ltVARIABLEgt get-ltNOM_ATRIBUTgt)
Per exemple si tenim una instagravencia de la classe Plat ( instancia ) i volem saber el valor del seu slotnom
(send instancia get-nom)
Per assignar un valor a un slot drsquouna drsquoinstagravencia hem drsquoenviar-li un missatge de la seguumlent manera
(send ltVARIABLEgt put-ltNOM_ATRIBUTgt ltVALORgt)On ltVALORgt pot ser un valor o un megravetode que retorni un valor
(send instancia put-nom nom)
3514 iquestCoacutemo acceder a una instancia cuyo nombre conocemos
Si conocemos el nombre de una instancia y necesitamos acceder a ella es decir necesitamos enviarle alguacutenmensaje mediante la funcioacuten send podemos hacerlo directamente escribiendo en lugar de la variable quealmacena la instancia el nombre de la instancia entre corchetes [ ] A continuacioacuten se muestra un ejemplo
(bind altura_rect1 (send [rect1] get-altura))
En este caso se guardaraacute en la variable altura_rect1 el valor de la altura de la instancia que tiene comonombre rect1
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2959
26 Capiacutetulo 3 CLIPS
3515 Obtenir el nom drsquouna classe
Si tenim una instagravencia drsquouna classe i volem saber el nom de la classe (uacutetil si tenim una bona taxonomiade classes) ho podem fer amb el megravetode (class ltINSTANCIAgt)
Si per exemple imaginem que tenim la classe Actor la qual teacute com subclasses la classe APrincipalASecundari i ACameo Imaginem que estem tractant amb instancies drsquoactors i volem saber si la instanciaque estem tractant es de la classe APrincipal
Ho hauriacuteem de fer de la seguumlent manera
(eq (class instancia) APrincipal)
Fixem-nos que APrincipal eacutes un siacutembol no un String (un truco eacutes fixar-se en que no teacute cometes) Si vol-gueacutessim comparar-ho amb un String (per exemple un String introduiumlt per lrsquousuari) ho podriacuteem transformara un String amb el megravetode str-cat
(eq (str-cat (class instancia)) Principal)
3516 Como convierto un INSTANCE-ADRESS en un INSTANCE-NAME
En alguacuten momento nos podemos encontrar con la situacioacuten de que disponemos de un puntero a unainstancia y necesitamos su nombre o lo contrario En ambos casos podemos usar la funcioacuten instance-nameSu funcionamiento es bidireccional podemos introducirle un instance-name y nos devolveraacute un instance-adress y viceversa
1 (defrule imprimir-nombre2 estlt-(object (is-a Estudiante) (edad 25))3 =gt4 (printout t (instance-name est) crlf)5
)
3517 Com iterar a traveacutes drsquoun multi-slot
El seguumlent tambeacute eacutes vagravelid com exemple de com iterar a traveacutes drsquouna llistaImaginem que tenim una instagravencia de la classe Plat a la varible (plat) la qual teacute un multi-slot drsquoinstagravencies
de la classe Ingredient Imaginem que volem imprimir per pantalla el nom drsquoaquests ingredients (slot nomde la classe Ingredient) Necessitarem iterar sobre la llista drsquoingredients
1 (bind i 1)2 (while (lt= i (length$ (send plat get-ingredients)))3 do4 (bind ingredient (nth$ i (send plat get-ingredients)))5 (printout t (send ingredient get-nom) crlf)6 (bind i (+ i 1))7 )
El megravetode (nth$ ltINDEXgtltLLISTAgt) et retorna lrsquoelement situat a INDEX de LLISTAEl megravetode (length$ ltLLISTAgt) retorna el nuacutemero drsquoelements de LLISTA
3518 Coacutemo modificarinsertarborrar valores en un multislot
Los valores de un multislot se pueden cambiar usando la funcioacuten slot-replace$ La sintaxis es la siguiente
(slot-replace$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt ltvalorgt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3059
35 Las clasesinstancias 27
Donde ltiniciogt y ltfingt son el rango de posiciones del multislot que se quiere modificar y ltvalorgtson los valores que queremos reemplazar Obviamente deberaacute haber tantos valores como posiciones hayamosindicado en el rango
Para insertar nuevos valores podemos usar la funcioacuten slot-insert$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltposgt ltvalorgt)
El valor se inserta delante de la posicioacuten indicada si la posicioacuten es mayor que la longitud del multislot secolocaraacute al final
Para borrar elementos de un multislot podemos usar la funcioacuten slot-delete$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt)
Se borraraacuten los elementos que estaacuten en el rango indicado
3519 Coacutemo recorrer un atributo multievaluado
Supongamos que la variable respuesta tiene una lista de instancias
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 aquiacute hacemos lo que queramos4 )5 )
Loop-for-count funciona como un for primero la variable que haraacute de contador luego el valor de origeny luego el valor final Para controlar el final usamos la funcioacuten que he explicado antes i tomaraacute valoresdesde 1 hasta n asiacute que usando la funcioacuten nth$ obtendremos cada uno de los elementos La variable auxiraacute teniendo cada uno de los valores
3520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz)
Es igual que antes pero con dos bucles
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 (bind aux2 (send aux get-slot_que_queremos))4 (loop-for-count (j 1 (length$ aux2)) do5 (bind aux_final (nth$ j aux2))6 aquiacute ya podemos trabajar con el elemento en concreto7 )8 )
Supongamos que respuesta tiene una lista de instancias con el primer bucle haremos lo mismo que antes ir
iterando por esas instancias Una vez que tenemos cada instancia con aux2 con el segundo bucle iteraremosdentro de sus instancias interiores
Por ejemplo si tenemos varios equipos de fuacutetbol y cada equipo tiene varios jugadores en el primer bucleestamos iterando entre los equipos y en el segundo entre los jugadores de cada equipo en particular
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3159
28 Capiacutetulo 3 CLIPS
3521 Com puc esborrar una instagravencia
Per esborrar una instagravencia (per exemple segons la informacioacute que proporcioni lrsquousuari podem deduir queuna segraverie drsquoinstagravencies eacutes impossible que es facin servir per a la solucioacute) ho podem fer enviant un missatgedelete a la instagravencia eacutes a dir (send ltINSTANCIAgtdelete)
(send inst delete)
Un megravetode que podria ser uacutetil de la cara a la pragravectica podria ser el seguumlent
1 (defrule elimina-instancia2 (declare (salience 10))3 elimina-fact lt- (elimina-inst inst)4 =gt5 (send inst delete)6 (retract elimina-fact)
Imaginem que per exemple que volem eliminar una llista drsquoinstagravencies Per eliminar-les podriacuteem recoacuterrerel llistat marcant les instagravencies que volem esborrar afegint el seguumlent fet
(assert (elimina-instancia inst))
Aixiacute com que elimina-instancia teacute un salience alt esborraria les instagravencies marcades quan tingueacutes ocasioacuteDrsquoaquesta manera ens estalviem el problema de recoacuterrer un llistat drsquoinstagravencies amb un iterador mentre
anem eliminant els elements de la llista cosa que pot donar problemes amb lrsquoiterador
3522 Com imprimir una instagravencia
Per imprimir una classe (uacutetil per exemple per mostrar el resultat final) el millor eacutes definir message-handlersPer exemple imaginem que tenim una classe Plat la qual teacute un slot nom de tipus String Si volgueacutessimimprimir per pantalla un missatge que digueacutes
El nom del plat eacutes ndashltnom del platgtndash
Hauriacuteem de definir un message-handler que simplement imprimiacutes per pantalla el valor de lrsquoslot de laforma
(defmesssage-handler ltCLASSNAMEgt ltMESSAGENAMEgt primary ()ltCODIgt
)
Per el cas de lrsquoexemple
1 (defmessage-handler Plat print primary ()2 (printout t -- selfnom --) )3 )
Per cridar-ho nomeacutes caldragrave enviar-li un missatge a la instagravencia amb el nom del message-handler (enaquest cas print)
(send instancia print)
Un message-handler pot cridar a altres message-handlers amb el que es poden encadenar diverses instagraven-cies Per exemple imaginem que tenim la classe Menuacute la qual teacute un atribut plats que eacutes un llista drsquoinstagravenciesde la classe Plat Dintre del message-handler menuacute podriacuteem iterar a traveacutes de la llista de plats enviant elmissatge print que hem definit anteriorment
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3259
36 Programacioacuten 29
3523 Com es navega entre instagravencies relacionades
Per exemple tinc una instagravencia iA que teacute un slot anomenat slotB que eacutes una instagravencia drsquoun frame B Vullsaber el nom de la instagravencia associada al slotB de iA Ho pots fer aixiacute
(bind B (send iA get-slotB))(bind res (send B get-nom))
Si estagraves dins drsquouna condicioacute ho pots simplificar de la forma seguumlent
(bind res (send iAslotB get-nom)
Els dos punts soacuten equivalents al punt de Java
36 Programacioacuten
361 Com introduir un comentari
Els comentaris a CLIPS va darrere de un com per exemple
Comentari
Tambeacute podem afegir comentaris a les nostres regles deffacts deftemplates etc Generalment van darrereel nom de la estructura per exemple
1 (defrule neteja regla per la qual si la cuina estagrave bruta srsquoafegiragrave una tasca de2 neteja
3 (estat-cuina bruta)4 =gt5 (assert (tasca netejar))6 )
362 Referenciar el valor null a CLIPS
Per referenciar el valor null a clips es fa amb el simbol nil Per exemple si volem saber si una instagravenciainst es null ho podriacuteem fer de la seguumlent manera
(eq inst nil)
363 Formas de recorrer una lista
Para recorrer una lista disponemos de diferentes opciones en este FAQ explicaremos como crear unaestructura tipo ldquoWHILErdquo y tipo ldquoFORrdquo
1 While Esta regla se ejecuta hasta que la expresioacuten a evaluar sea falsa Este tipo de estructura se rigepor seguir la sintaxis while - do y se construiriacutea de la siguiente forma
(while ltexpresioacutengt[do] ltaccioacutengt)
Doacutende dependiendo del valor de ltexpresioacutengt
Valor TRUE Se realizaraacute la accioacuten ltaccioacutengt i se volveraacute a evaluar ltexpresioacutengt
Valor FALSE No se ejecutaraacute la accioacuten ltaccioacutengt
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3359
30 Capiacutetulo 3 CLIPS
2 For Esta regla sirve para ejecutar un bucle N (final - inicio) veces Este tipo de estructura se rige porseguir la sintaxis loop-for-count y se construiriacutea de la siguiente forma
(loop-for-count (ltvargtltiniciogtltfinalgt) [do] ltaccioacutengt)
Doacutende
ltvargt Variable que se usara como iacutendice
ltiniciogt Valor inicial que tendraacute ltvargt
ltfinalgt Ultimo valor que tendraacute la variable ltvargt
ltaccioacutengt Accioacuten que es realizaraacute hasta que ltvargt tenga el valor de ltfingt
364 Formas de elegir una opcioacuten
En este apartado explicaremos como crear una estructura if y una estructura switch
If Este tipo de estructura se rige por seguir la sintaxis if - then - else y se construiriacutea de lasiguiente forma
(if ltexpresioacutengtthen ltaccioacutengt[else ltaccioacuten2gt])
Doacutende dependiendo del valor de ltexpresioacutengt
bull Valor TRUE Se realizaraacute la accioacuten ltaccioacutengtbull Valor FALSE Se realizaraacute la accioacuten ltaccioacuten2gt (en caso de haber)
Switch Este tipo de estructura se rige por seguir la sintaxis switch - opciones y se construiriacutea dela siguiente forma
(switch ltexpresioacuten-testgt(case OPCION1 then ACCION1)(case OPCION2 then ACCION2)
([default] ACCION-DEFAULT)
)
Doacutende dependiendo del valor de ltexpresioacuten-casegt se ejecutaraacute una ltaccioacutengt en particular Si nin-guna ltopcioacutengt es correcta se ejecutara la ltaccioacuten-defaultgt
365 Funciones con la clase String
Habitualmente trabajaremos con Strings o cadena de Strings CLIPS proporciona una serie de herramien-tas para trabajar con esta clase
1 Convertir string a MAYUacuteSCULAS A veces es conveniente tener todos los caracteres en mayuacutesculaspara no tener problemas de comparaciones o simplemente por convenio Para ello CLIPS dispone dela funcioacuten upcase la cual convierte a mayuacutesculas un siacutembolo o string
(upcase ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplos
(upcase Ccedillips es divertido) rarr CcedilLIPS ES DIVERTIDO
(upcase Clips_es_divertido) rarr CLIPS_ES_DIVERTIDO
2 Convertir string a MINUacuteSCULAS la funcioacuten es downcase
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3459
36 Programacioacuten 31
3 Concatenacioacuten de strings Tambieacuten es de gran utilidad poder juntar dos o maacutes paraacutemetros en un solostring Todo paraacutemetro a juntar deben ser de uno de los siguientes tipos symbol String integer floato instance-name
(str-cat parametro1 parametro2 parametroN )
Ejemplo
(str-cat IA nota 10) rarr IAnota10
4 Comparacioacuten de strings Funcioacuten que nos indica si dos strings son iguales
(str-compareltexpresioacuten-simboacutelica-o-de-cadenagtltexpresioacuten-simboacutelica-o-de-cadenagt
)
Esta funcioacuten devuelve
0 Si ambos strings son iguales1 Si el primer string es mayor que el segundo string-1 Si el primer string es menor que el segundo string
5 Longitud de un string Muchas veces es de gran utilidad saber que tamantildeo tiene un string
(str-length ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplo
(str-length Inteligencia Artificial) rarr 23
366 iquestCoacutemo obtener el contenido de una variable en un string
Para conseguir un string a partir de un integer float symbol instance-name debes utilizar el comandostr-cat Si a la funcioacuten le pasamos como paraacutemetros varios elementos los transformaraacute a string y losconcatenaraacute La sintaxis de esta funcioacuten es la siguiente (str-cat elementos) Esta funcioacuten la usaremossobre todo cuando queramos realizar comparaciones entre el contenido de una variable y un string ya quepreviamente necesitaremos usar la funcioacuten str-cat para pasar el contenido de la variable a string y realizarde este modo la comparacioacuten de forma correcta
367 iquestComo se crea una lista
Con create$ Todos los operadores sobre listas llevan el siacutembolo $ al final Igual que con las variables sedebe usar bind siempre que se desee modificar una lista
(bind lista (create$ a b c))
368 iquestComo borro un elemento de una lista
Con delete$Usa la siguiente sintaxis(delete$ ltlistagt ltindice-iniciogt ltindice-finalgt)Se borraraacuten todos los elementos del rango entre las posiciones inicio y final ambas incluidas Tambieacuten exis-
tedelete-member$ (delete-member$ ltlistagt ltelementogt) Borraraacute todas las apariciones del elemento enla lista
(delete$ (create$ a b c d e f) 3 5) minusrarr (a b f)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 659
Iacutendice general 3
383 Com definir un paragravemetre drsquouna funcioacute com una llista 38384 Com puc utilitzar una funcioacute a la part esquerra de les regles 38
39 Entrada salida 38391 iquestCoacutemo se imprime por pantalla 38392 iquestAl imprimir por pantalla como hago un salto de liacutenea 39393 Com imprimeixo una liacutenia en blanc 39
394 Com llegir de la entrada standard 39395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeix
com un enter 40396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacute
drsquoentrada quants) com ho faig per assignar-los a un multislot 40310 Funciones uacutetiles 40
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles 403102 Obtener un valor numeacuterico comprendido en un rango 413103 Realizar una pregunta general 413104 iquestCoacutemo se realiza una pregunta binaria 413105 Encuentra la instancia con valor miacutenimo para un slot 41
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valor const 423107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li 433108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla 43
311 Ejecucioacuten de un programa CLIPS 433111 iquestCoacutemo cargamos un programa 433112 iquestCoacutemo probar tu coacutedigo en CLIPS 443113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten 443114 iquestCoacutemo parar una ejecucioacuten 443115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste 44
4 Consejos praacutecticos 45
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve no seacute ni per oncomenccedilar Algun consell 45
42 iquestComo estructuro una practica de CLIPS 4543 Com crear un flux de preguntes 46
431 Com puc ordenar aquest flux de preguntes 46432 I si vull saltar-me una pregunta 47433 Com inicialitzar el flux del programa 48
44 Uso de la funcioacuten modify para ir guardando resultados preferidos 4845 Creacioacuten de la plantilla de recomendacioacuten 49
5 Errores frecuentes 51
51 Quan obro un fitxer en CLIPS em dona un error 5152 Codificacioacute de caragravecters a CLIPS 5153 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots en Protegravegegrave cuando
las importo en CLIPS 5154 Tengo problemas con la hereacutencia de slots en las clases que he definido 5155 Quegrave significa lrsquoerror OBJRTBLD5 5256 Antes compilaba correctamente y ahora da warnings 5257 No puedo editar mi fichero en clips 5258 Redefining 5259 Problemas al consultar las instancias relacionadas con otras 52510 Unable to finde class X cuando definimos instancias 52
511 Expected the beginning of a construct (cuando definimos instancias) 53512 Compila pero no compara bien dos elementos 53513 Expected the beginning of a constructor 53514 Missing function declaration for defruledeffunction 53
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 759
4 Iacutendice general
515 Check appropiate syntax for ifswitchloop-for-count 54516 Problemas con pareacutentesis 54
6 Referencias 5561 On puc trobar informacioacute sobre el llenguatge CLIPS 5562 Otras referencias 55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 859
1 Introduccioacuten
Este documento es el resultado de la recopilacioacuten de los documentos escritos durante el desarrollo de lapraacutectica de sistemas basados en el conocimiento el cuatrimestre de otontildeo del curso 2007-2008
El objetivo de estos documentos era recoger las dudas frecuentes que se encuentra un alumno durante eldesarrollo de la praacutectica de SBCs y consejos praacutecticos que puedan ayudar en el desarrollo
Este documento recoge principalmente dudas frecuentes sobre el entorno CLIPS y su lenguaje de progra-macioacuten
5
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 959
6 Capiacutetulo 1 Introduccioacuten
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1059
2 Protegravegegrave
Para saber como funciona Protegravegegrave usad la ayuda de la aplicacioacuten y el material correspondiente estascuestiones se refieren a como integrar lo que se desarrolla en Protegravegegrave con CLIPS
21 Coacutemo cambiar el nombre de las instancias en Protegravegegrave
En realidad no se trata de cambiar el nombre de las instancias sino de darle algo maacutes visual que unnuacutemero para poder hacer las relaciones Si os encontraacuteis en la pestantildea de crear instancias el uacuteltimo botoacutenes una flecha hacia abajo Darle y luego set display slots Ahiacute debeacuteis indicar con que slot quereacuteis referenciarla instancia
22 Com exporto una ontologia de Proteacutegeacute a CLIPS
A Proteacutegeacute ves a File rarr Export to Format rarr CLIPS Un cop fet aixograve es crearan dos nous fitxers ambles classes i instagravencies de lrsquoontologia (nompont i nompins respectivament)
Despreacutes obre aquests dos fitxers amb un editor de text i copia el seu contingut al fitxer CLIPS de laseguumlent manera
copy-paste de nompont
(definstances instanciescopy-paste de nompins)
23 iquestCoacutemo exporto una ontologiacutea de Proteacutegeacute a CLIPS (2a posibilidad)
Alternativamente a hacer corta y pega de los ficheros de protege en el fichero de CLIPS se puede crearun fichero que cargue todos los ficheros sin tener que juntarlos
Para ello hay que crear un fichero que incluya las oacuterdenes de carga de los diferentes ficheros Por ejemplopodemos llamar a este fichero cargaclp El contenido de este fichero seraacute
(load PATHnompont)(load-instances PATHnompins)(load PATHfichero-de-reglasclp)
Donde PATH es el directorio donde se encuentran vuestros ficherosEste fichero se ha de cargar desde el inteacuterprete mediante la orden batch ((batch cargaclp)) o con
la opcioacuten de menuacute load batch Usando la instruccioacuten load-instances evitamos tener que antildeadir al fichero de instancias la instruccioacuten
definstances
24 Per quegrave em doacutena error CLIPS al tenir una instancia que hereta de meacutesdrsquouna classe
7
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1159
8 Capiacutetulo 2 Protegravegegrave
Proteacutegeacute permet lrsquoheregravencia muacuteltiple en instagravencies perograve CLIPS no En CLIPS nomeacutes poden tenir heregravenciamuacuteltiple las classes perograve no les instagravencies Aixoacute es aixiacute perque el lenguatge de CLIPS es orientat a objectesno es realment un lenguatge drsquoontologiacutees
La manera meacutes senzilla de simular-ho si les clases no tenen ancestres comuns eacutes tenir classes que repre-sentin aquesta heregravencia muacuteltiple i fer que les instagravencies pengin drsquoelles que es com es faria a un llenguatge
orientat a objectesEn el cas de tenir ancestres comuns no es pot fer lrsquounica manera es duplicar la instancia amb nomsdiferents i penjar-les de les clases on es vol tenir-la
De totes maneres el CLIPS permet recuperar fagravecilment les instagravencies que tenen un valor especiacutefic en unslot pel qual el meacutes senzill eacutes tenir una uacutenica jerarquia i incloure altres possibles classificacions com a slotsencara que obviament perdrem la posibilitat de fer servir una jerarquia de valors per aquest
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1259
3 CLIPS
31 Instalacioacuten del CLIPS
311 iquestCoacutemo instalar CLIPS
La herramienta CLIPS es multiplataforma y esta disponible para los tres SO maacutes utilizados MicrosoftWindows Linux y Mac OS X
iquestCoacutemo instalar CLIPS en Windows
Primero de todo debemos bajarnos el programa de la paacutegina oficial de CLIPS accesible desde este link
(httpclipsrulessourceforgenet) Desde el aacuterea de descarga os podreis bajar el instalador parawindows
iquestCoacutemo instalar CLIPS en Linux
En muchas distribuciones de Linux CLIPS esta disponible como un paquete adicional el paquete sueleinstalar la versioacuten con interfaz graacutefico Si no encuentras el paquete especiacutefico para la distribucion que usassiempre puedes compilarlo a partir del paquete con los fuentes
Tambieacuten estaacute la posibilidad de utilisar el emulador de windows WINE Una vez instalado el emulador sepuede instalar CLIPS y este funcionaacute igual que sobre windows
iquestCoacutemo instalar CLIPS en Mac OS X
Primero de todo debemos bajarnos el programa de la paacutegina oficial de CLIPS accesible desde este link(httpclipsrulessourceforgenet ) Desde el aacuterea de descarga podeis bajar el intalador para MACOS X
312 Entorn finestres VS Consola de comandes
Encara que lrsquoentorn de finestres eacutes molt meacutes intuiumltiu CLIPS a la seva versioacute en liacutenea de comandes eacutes moltmeacutes ragravepid (segurament perquegrave no ha de mostrar en tot moment lrsquoagenda de fets les instancies les regles
etc)La diferencia de velocitat eacutes molt notable en cas de problemes de rendiment o de sensacioacute que lrsquoentorn
de finestres es queda penjat (o directament es tanca sense previ aviacutes) recomanem provar la versioacute en liacuteneade comandes
32 Los hechos
321 iquestQueacute es un hecho en CLIPS
Conceptualmente un hecho representa un dato abstracto del cual almacenamos valores Se puede vercomo una lista de campos donde el primer campo hace referencia al ldquodatordquo al cual le asignamos una listade valores que le suceden teniendo una relacioacuten entre siacute
Formalmente el primer campo es un siacutembolo y los campos restantes son valores
9
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1359
10 Capiacutetulo 3 CLIPS
(siacutembolo valor1 valor2 valorN)
322 iquestQueacute es un hecho ordenado (order Facts)
Un hecho ordenado tienen formato libre por lo tanto no existe restriccioacuten alguna en el orden de los campos
Los campos de un hecho ordenado pueden ser de cualquier tipo primitivo de datos excepto el primero quedebe ser un siacutembolo Como ejemplo tenemos
1 (hermanos Antonio Javier Carlos)2 (padre Pedro David)
323 iquestQueacute es un hecho no ordenado (deftemplates facts)
A traveacutes de los hechos no ordenados podemos abstraernos de la estructura de un hecho asignado unnombre a cada campo (slots)
1 (deftemplate nombre-template comentario2 (slot nombre-slot (tipo-del-slot))3 (multislot nombre-slot (tipo-del-slot))4 )
Por ejemplo
1 (deftemplate avioacuten2 (slot nombre_avion (type STRING))3 (slot compania (type STRING))
4 (slot numero_plazas (type INTEGER) (default 100))
324 iquestPuedo tener un vector como slot
Si debe declararse como multislot
325 iquestPuedo asignar propiedades a los slots
Siacute las maacutes importantes son
Type El tipo de dato primitivo que contiene (en mayuacutesculas)
Allowed-X Permite especificar un conjunto de valores permitidos Siendo X un tipo de datos primitivo(en minuacutesculas y plural) rarr si el slot toma un valor del tipo X debe pertenecer a los valores permi-tidos X puede ser values especificando entonces todos los valores posibles que puede tomar el slotindependientemente del tipo de dato
Range Especifica un rango para slots numeacutericos
Cardinality Nuacutemeros miacutenimo y maacuteximo de elementos que puede tener un multislot
Default Valor por defecto Si ponemos NONE como valor por defecto significaraacute que no se podraacute crear la
instancia a no ser que se especifique el valor de ese slot
1 (deftemplate estudiante2 (slot edad (type INTEGER) (range 0 99))
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1459
32 Los hechos 11
3 (multislot asignaturas (type STRING) (cardinality 1 5))4 (slot num-carreres (default 1))5 (multislot notas (allowed-strings MH NP))6 )
326 iquestQueacute debo utilizar hechos ordenados o no ordenados
Como se puede intuir si tenemos un conjunto de hechos los cuales conceptualmente pertenecen al mismoaacutembito seraacute una solucioacuten maacutes elegante agruparlos a traveacutes de un deftemplate En caso que tengamos quealguacuten hecho aislado seraacute mas sencillo declararlo como un hecho ordenado
327 Fets o Objectes
Veient la definicioacute de deftemplate podem confondrersquons a lrsquohora de decidir si fer servir fets o fer servirobjectes
Deixant de banda altres diferegravencies ja comentades (les classes suporten jerarquia de classes heregravenciaetc) els objectes es fan servir per representar el coneixement (mitjanccedilant un conjunt drsquoinstagravencies)
Aixiacute que generalment farem servir classes i objectes per representar coneixement mentre que farem servirels fets per portar control sobre lrsquoexecucioacute del problema
Per exemple podriacuteem definir un deftemplate per emmagatzemar un resultat o per poder controlar lrsquoestatde lrsquoexecucioacute
A la pragravectica de Mikeo (penjada a la web de lrsquoassignatura) teniacuteem un deftemplate habitacion-actual
1 (deftemplate habitacion-actual2 (slot habitacion)3 (slot area-restante)4
(slot presupuesto-restante)5 (slot precio-total)6 (slot prioridad-actual)7 )
Amb el qual controlagravevem la construccioacute drsquouna habitacioacute Assignagravevem una instagravencia de la classe habita-cioacute al slot habitacion de habitacion-actual i mitjanccedilant una segraverie de regles que feien unificacioacute ambhabitacion-actual actuagravevem sobre lrsquohabitacioacute drsquouna manera o drsquoun altre
328 Creacioacuten de hechos (assertdeffacts)
Si queremos crear un solo hecho utilizaremos el comando assert Por ejemplo (assert (casa roja))Si por el contrario queremos crear una estructura ordenada de hechos utilizaremos deffacts
(deffacts mishechos (casa roja) (pelota azul))
329 Modificar un fet
Per modificar un fet (per exemple molt uacutetil si estem treballant amb deftemplates) ho podem fer mitjanccedilant(modify ltINSTANCIAgtltFETSgt)
Per exemple si tingueacutessim el deftemplate persona
1 (deftemplate persona2 (slot nom)3 (slot edad)4 (slot dni)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1559
12 Capiacutetulo 3 CLIPS
I hagueacutessim afegit el fet
(assert (persona (nom Pepe)(edad 25)(dni 46974431)))
I el fet
(assert (aniversari 46974431))
Podriacuteem tenir la seguumlent regla
1 (defrule aniv2 aniversari lt- (aniversari dni)3 persona lt- (persona (edat edat)(dni dni))4 =gt5 (retract aniversari)6 (modify persona (edat (+ 1 edat)))7 )
La qual srsquoactivaragrave si hi ha un fet aniversari drsquouna persona Fent servir el dni indicat al fet aniversaribusquem el fet persona que teacute el mateix dni Deixem el valor edat a la variable edat per poder treballaramb ella meacutes endavant
Hem agafat tambeacute la direccioacute del fet aniversari per tal de poder esborrar-lo de la base de fets Aixograve srsquohafet per dues raons
Primer per mantenir meacutes neta la base de fets Segon i meacutes important Com que hem canviat el fet laregla tornaragrave a fer unificacioacute amb el fet (perquegrave ara eacutes diferent) amb la regla aniversari amb el que entrariadintre drsquoun bucle sense fi on srsquoaniria incrementant lrsquoedat de la persona
Un cop hem esborrat el fet aniversari incrementem en 1 el valor del slot edat de la persona fent servirla variable edat que hem declarat a la part esquerre de la regla
El comportament de modify es fer un retract del fet a la base de fets i despreacutes fer un assert amb els nous
valors Si volem canviar mes drsquoun slot del fet es convenient canviar-los tots a la vegada La raoacute es que cadavegada que fem un modify lrsquoapuntador al fet es modifica i lrsquoapuntador que tenim a la variable que hem fetservir ja no es vagravelid
Si no temim mes remei que fer la modificacioacute del fet pas a pas srsquoha de saber que la crida a modify retornalrsquoapuntador al nou fet Si el guardem a altra variable (o a la mateixa) podrem continuar modificant el fetamb la nova referegravencia
3210 Com elimino un fet de la base de fets
Per eliminar un fet de la base de fets ho podem fer amb la paraula clau (retract ltFETgt) on ltFETgt eacutes
un punter al fetPer obtenir aquest fet ho podem fer fent servir ltVARgtlt- ltFETgt a la part esquerre de la reglaPer exemple
1 (defrule accionsvent2 vent lt- (vent tipus)3 =gt4 (switch tipus5 (case poc then (assert (accio persiana0)))6 (case normal then (assert (accio persiana50)))7 (case molt then (assert (accio persiana100)))8 )9 (retract vent)
10 )
Afegiragrave fets per realitzar les accions pertinents i esborraragrave el fet de la base de fets
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1659
33 Variables 13
33 Variables
331 Variables a CLIPS
No cal declarar una variable (ni el seu tipus) nomeacutes cal afegir un interrogant al comenccedilament drsquoun simbol
per indicar que eacutes una variableCLIPS srsquoencarrega del control de tipus depenent del que assignem a la variablePer exemple testvar correspondria a la variable testvar Si per exemple assigneacutessim lrsquoenter 3 a
testvar CLIPS tractaria la variable com una variable entera
332 Com assignar un valor a una variable
Per assignar un valor a una variable es fa servir el megravetode (bind) amb la forma
(bind ltVARIABLEgtltVALORgt)
On ltVALORgt pot ser un valor o un megravetode que retorni un valor Per exemple si volem assignar un 4 a lavariable var
(bind var 4)
O per exemple podriacuteem assignar a la variable var la suma de 2 meacutes 2
(bind var (+ 2 2))
333 iquestCoacutemo declarar variables globales
Para crear una variable global hay que meterla dentro de la construccioacuten defglobal La declaracioacuten de la
variable seguiraacute el modelo nombreVariable = expresioacutenPor ejemplo
(defglobal presupuesto = 0)
Pueden aparecer en la parte izquierda de las reglas si no son utilizadas para asignar un valor y su cambiono activa reglas pero no pueden ser paraacutemetros de funciones ni meacutetodos
334 iquestCoacutemo trabajar con variables sumando restando por ejemplo contadores
La mejor forma es con variables globales se definen asiacute (defglobal x = 0) puede ser el valor quequeramos tanto nuacutemero string Y si queremos sumarle 10 por ejemplo
(bind x (+ x 10))
Las variables locales como por ejemplo x soacutelo tienen valor mientras dura su ejecucioacuten y eso suele ser enesa misma liacutenea o en un bucle Si le damos valor a x y luego preguntamos por ella nos diraacute que no existe
335 Quina diferegravencia hi ha entre les variables del tipus nom_variable i les del tipus $nom_variable
Les primeres contenen un sol valor i les segones en poder contenir meacutes drsquoun (o cap)
336 Quegrave significa lrsquointerrogant () quan va sol
Eacutes una variable anogravenima Pots utilitzar sense posar-hi cap nom si no trsquointeressa el valor en concret Perexemple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1759
14 Capiacutetulo 3 CLIPS
(Primer filtre_preu )
Aquesta condicioacute significa ldquosi el fet (Primer filtre_preu) teacute algun valorrdquo O sigui que si tingueacutessimel fet (Primer filtre_preu ok) es compliria la condicioacute (i si en comptes de ldquookrdquo fos ldquopatatardquo tambeacute escompliria) En canvi si el fet fos uacutenicament (Primer filtre_preu) no es compliria la condicioacute
337 Quegrave significa el dogravelar ($) quan va sol
Eacutes com lrsquointerrogant perograve admet meacutes drsquoun valor Per exemple
(Primer filtre_preu $ ok)
donaragrave cert pels fets de lrsquoestil (Primer filtre_preu patata ok) (Primer filtre_preu hola ok)(Primer filtre_preu patata hola ok) (Primer filtre_preu ok) Eacutes a dir no importa els valors quehi hagi entre filtre_preu i ok si al final hi ha un ok
338 iquestComo puedo ver los hechos presentes en un momento determinado
Abriendo la Facts Window en Window de la barra de menuacute
34 Las reglas
341 iquestCoacutemo construir una regla
Para construir una regla utilizaremos la construccioacuten defrule
Sintaxis
(defrule ltnombre-reglagt [ltcomentariogt][ltdeclaracioacutengt]ltelemento-condicioacutengt Parte izquierda (LHS)
=gtltaccioacutengt) Parte dcha (RHS) de la regla
Una regla consta de un conjunto de condiciones (antecedente) tambieacuten denominados elementos condicio-nales (EC) o parte izquierda (LHS) y de un conjunto de acciones (consecuente) tambieacuten denominado partederecha de la regla (RHS) La regla se activaraacute siempre que se satisfagan todos los EC mediante hechos oinstancias que los cumplan
Si se introduce en la base de reglas una nueva regla con el mismo nombre que el de una existente la nuevaregla reemplazaraacute a la antigua
Si una regla no tiene parte izquierda es decir no tiene elementos condicionales entonces el hecho(initial-fact) actuaraacute como el elemento condicional para ese tipo de reglas y la regla se activaraacute cadavez que se ejecute un comando reset
342 iquestCoacutemo gestionar la parte izquierda (LHS) de una regla
Declarar hechosSi no se especifica ninguna condicioacuten la regla se activaraacute siempre Una condicioacuten puede ser un simple hecho
(Ej vegetariano) o un hecho ordenado con unos valores concretos (Ej (persona (nombre Juan))) Si loque queremos es obtener el valor de un hecho insertaremos una variable en su lugar (Ej (persona (nombre
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1859
34 Las reglas 15
n)) ) Entonces entraraacute en la regla para cada valor posible que pueda asignar a la variable n a partir delos hechos
Si queremos indicar cualquier valor utilizaremos el siacutembolo y para cualquier lista el siacutembolo $ (Ej(evento ) (estilo $) ) Tambieacuten existe la opcioacuten de guardar en una variable una referencia al objetoEllo se consigue poniendo var lt- a su izquierda (Ej p lt- (persona (nombre Juan))) Se puede usarpor ejemplo para pasaacuterselo de paraacutemetro a una funcioacuten llamada en la RHS
Establecer condiciones
Ademaacutes podemos especificar restricciones adicionales sobre los valores que puede tomar un campo de unhecho Existen tres tipos principales de restricciones Conectadas (por orden de precedencia o prioridad)
not (~) Evita que cierto campo cumpla determinada restriccioacuten
and (amp) Combina dos restricciones conjuntivamente
or (|) Combina dos restricciones disjuntivamente
De predicado () Obliga a que cierto campo cumpla determinada condicioacuten (especificada por el predicado)
Por valor devuelto por una funcioacuten = Permite llamar a una funcioacuten y utilizar el valor devuelto pararestringir el valor que pueda tomar un campo de un hecho
Se puede comprobar si se cumple una determinada condicioacuten mediante el constructor test Dentro detest se pueden hacer llamadas a cualquier funcioacuten o predicado ya sea primitiva de CLIPS o definidapor nosotros
Combinar elementos
Los diferentes elementos de la parte izquierda van impliacutecitamente unidos mediante una AND que indicaconjuncioacuten No obstante podemos hacerlo expliacutecitamente mediante (and (cond1) (cond2)) aunque suelen
utilizarse para anidar ANDs dentro de ORsOR Sirve para hacer una disyuncioacuten (or (cond1) (cond2)) Es equivalente a escribir varias reglas en lasque cada una de ellas tenga uno de los componentes del OR en su parte izquierda y la misma parte derecha
NOT Sirve para detectar si no existe un determinado hecho (Ej (not (estilo sibarita)))exists Cuando a un conjunto de elementos se le antecede exists se comprueba que hay al menos un
hecho en la base de hechos que cumpla la condicioacuten (Ej (exists(bebida precio (ltprecio 5))) )forall Permite comprobar si todos los hechos que satisfacen un determinado patroacuten cumplen una serie
de condiciones (Ej (forall(plato (estilo moderno)))
343 iquestCoacutemo obtener la direccioacuten de hechos o instancias situados en LHS
En algunas ocasiones vamos a necesitar realizar alguacuten tipo de accioacuten en la parte derecha de las reglassobre hechos o instancias que cumplan unas determinadas condiciones Pero para ello necesitaremos primerotener acceso a estos elementos para despueacutes poder operar sobre ellos Esto lo conseguiremos guardando ladireccioacuten del elemento en una variable hacieacutendolo del siguiente modo
variable_direccion lt- (elemento)
Pongamos un ejemplo para ver realmente el funcionamiento y uso de esta posibilidad que CLIPS nosofrece
1 (defrule imprime-area2 instancia lt- (object (is-a Rectangulo))3 =gt4 (printout t Area del rectangulo (instance-name instancia)5 (send instancia calcula-area) crlf)6 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1959
16 Capiacutetulo 3 CLIPS
Cuando se ejecuta esta regla se imprimiraacuten las aacutereas de todas las instancias de la clase Rectangulo Enla parte izquierda de la regla lo que hacemos es guardar en la variable instancia la direccioacuten de la instanciade Rectangulo que estamos tratando en ese momento La regla se ejecutaraacute para todas las instanciasalmacenadas en la memoria de trabajo que cumplan la condicioacuten (is-a Rectangulo) es decir para todaslas instancias de la clase Rectangulo En la parte derecha de la regla donde se ejecutan las acciones podemosver que se imprimiraacute para cada instancia lo siguiente Area del rectangulo [nombre_instancia] aacuterea
del rectaacutengulo La funcioacuten instance-name nos devuelve el nombre de la instancia que le pasamos porparaacutemetro Ademaacutes hemos llamado al gestor de mensajes calcula-area para que nos devuelva el area delrectaacutengulo
344 iquestCoacutemo hacer sentencias or en la izquierda de las reglas
Con (or ) Si por ejemplo tenemos dos hechos (a) y (b) y queremos ejecutar la derecha de la reglacuando se cumpla uno de los dos tendremos que hacer (or (a) (b)) Atencioacuten porque la parte derecha seejecutaraacute tantas veces como veces se cumpla cada uno de los hechos si para nosotros existe tanto (a) como(b) la parte derecha se ejecutaraacute dos veces Para que soacutelo se usa una vez podemos hacer combinaciones de
or y and (funciona igual) o usar un patroacuten por ejemplo (persona Juan|Pedro) soacutelo se ejecutariacutea una vez
345 Com afegir una condicioacute a la part esquerre drsquouna regla
A vegades eacutes necessari que una regla srsquoinstanciiuml si es produeix una condicioacute especial (i no un fet) Per feraixoacute farem servir la comanda (test ltCONDICIOgt)
Per exemple imaginem que la nostre base de fets compte amb un fet (preu valor) amb un preudeterminat Imaginem que volem una regla que srsquoinstanciiuml quan aquest valor eacutes meacutes gran que 30
Per fer-ho fent servir tot el que hem explicat
1 (defrule preucar2 (preu preu)3 (test (gt preu 30))4 =gt5 (printout t El preu es mes gran que 30)6 )
Eacutes a dir si el preu eacutes meacutes gran que 30 srsquoimprimiragrave un missatge per pantallaAquestes condicions poden contenir ANDs i ORs de varies condicionsPer exemple
1 (defrule preulimit2 (preu preu)3 factminim lt- (preuminim minim)4 factmax lt- (preumaxim maxim)5 (test (and (gt preu minim) (lt preu maxim) ))6 =gt7 (retract factminim)8 (retract factmax)9 (printout t El preu estagrave dintre del rang)
On comprovarem si el preu estagrave dintre drsquoun rang determinat i en aquest cas esborra els fets que contenen
el magravexim preu i el miacutenim preu i mostra un missatge per pantalla
346 Puede una misma regla ejecutarse maacutes de una vez
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2059
34 Las reglas 17
Es muy importante entender que cada regla se ejecutaraacute una vez por cada combinacioacuten de valores en suLHS
1 (defrule regla2 (color col)3 (peso pes)4 =gt5
Si tengo tres colores y dos pesos asertados la regla se ejecutaraacute 6 veces una con cada combinacioacuten decolor y peso
347 Com puc definir lrsquoordre de les regles
La idea drsquoun sistema basant en regles eacutes no definir un ordre lineal drsquoaquestes (costa deixar de pensar de
forma iterativa)En el cas de necessitar que una regla srsquoexecuti despreacutes drsquouna altre pots fer servir Fets la regla anteriorcrea un fet que la segona regla tindragrave a la part esquerra
1 (defrule pregunta12 =gt3 (assert (pregunta1Feta))4 5 )6
7 (defrule pregunta2
8 (pregunta1Feta)9 =gt
10 11 )
I finalment pots usar la propietat salience Aquesta propietat indica la prioritat drsquoexecucioacute de les regles( les regles amb salience majors srsquoexecutaran abans ) Pot prendre valors positius i negatius entre -10000 y+10000 Per defecte les regles tenen salience 0
1 (defrule pregunta12 (declare (salience 2))3 =gt4 5 )6
7 (defrule pregunta28 (declare (salience 1))9 =gt
10 11 )
El valor indicado en la propiedad salience puede ser el nuacutemero directamente o una expresioacuten por ejemplovariable10 podemos usar variable para elegir que regla se ejecutaraacute
Las prioridades deben ser usadas solo para determinar el orden en el que se disparan algunas reglas sobreotras no para fijar el flujo de control ya que la principal ventaja de un sistema basado en reglas es larepresentacioacuten declarativa del conocimiento y de esta forma abusando de las prioridades conduce a unsistema procedimental
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2159
18 Capiacutetulo 3 CLIPS
348 Com forccedilar que una regla sigui la primera
Per que aquesta regla sigui la primera ha de tenir el salience meacutes gran de totes
1 (defrule presentacio2 (declare (salience 20))3 =gt4 (printout t ------ Benvingut ----- crlf)5 )
349 Vull guardar certs valors que es fan servir durant lrsquoexecucioacute de diferents regles Com hopuc fer
Tens principalment dues alternatives Si el valor eacutes un tipus bagravesic pots fer servir una variable global ambla sintaxi seguumlent
(defglobal nom_variable = valor)
Aquesta sentegravencia no va a dins de cap funcioacute ni regla es posa sola a la part que creguis convenient delcodi Vegem un exemple
(defglobal preu_minim_primer = 1000)
Per fer-la servir es fa exactament de la mateixa manera que amb una variable normal perograve has de posarels dos asteriscs Per exemple
(bind preu_minim_primer curr-preu)
Per altra banda si el valor o valors que vols guardar han de ser instagravencies una bona estrategravegia pot serutilitzar un deftemplate Eacutes uacutetil sobretot per anar guardant solucions temporals o llistes drsquoelements quepoden formar part de la solucioacute
Per utilitzar-ho has de seguir els passos seguumlents
1 Definir el deftemplate
(deftemplate nom_del_deftemplate(multislot nom_multislot)
(slot nom_slot)
)
Amb un exemple es veuragrave meacutes clar
(deftemplate llista-plats(multislot primers)(multislot segons)(multislot postres)
)
2 Inicialitzar el deftemplate
(defrule[condicions vagraveries] La condicioacute base eacutes que llista-plats no srsquoha inicialitzat encara
(not (llista-plats))=gt
llista conteacute els valors de llista-plats (que de moment estan buits)(bind llista (assert (llista-plats)))
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2259
35 Las clasesinstancias 19
3 Assignar-li valors
(bind segons_plats (find-all-instances ((plat Plat)) TRUE)(modify llista (segons segons_plats))
4 Recuperar els valors
(defrule[condicions vagraveries]llista lt- (llista-plats (segons $segons_plats))
=gt
Ara la variable $segons_plats conteacute tots els elements de segons
35 Las clasesinstancias
351 Tengo que representar la jerarquiacutea de un frame iquestEs preferible antildeadir las subclases a laontologiacutea o bien diferenciarlas mediante un slot en la superclase
Las dos formas son vaacutelidas pero es recomendable representarlas en clases separadas cuando se vayan abuscar instancias de ese tipo ya que asiacute no tendremos que hacer un recorrido por todas las de la superclaseNo obstante si soacutelo se trata de una caracteriacutestica puntual del frame y no vamos a hacer buacutesquedas de unaexclusiva subclase entonces seraacute maacutes eficiente antildeadir un slot debido a su mejor accesibilidad
352 iquestQueacute es un objeto
Podriacuteamos decir que un objeto es un hecho no ordenado con herencia
353 iquestPorqueacute usar objetos en contexto de la praacutectica de CLIPS de IA
Como bien sabemos una parte de la praacutectica de SBCrsquos consisten en crear la ontologiacutea Esta ontologiacutease exporta para poder interactuar con CLIPS en formato pins y pont El archivo pont contendraacute ladeclaracioacuten de todas las clases creadas previamente por Protege (defclass ) El archivo pins contendraacute
todas las instancias de las clases declaradas en el archivo pont Como puede intuir el lector se necesitaraacuteinteractuar con los objetos previamente creados por Protegravegegrave
354 Como se definen las clases
Para definir las clases usaremos el constructor defclass
(defclass ltnombregt [ltcomentariogt](is-a ltnombre-de-superclasegt)[(role concrete | abstract)]
[(pattern-match reactive | non-reactive)]ltslotgt definicioacuten de los atributos de la clase
ltdocumentacioacuten-handlergt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2359
20 Capiacutetulo 3 CLIPS
En caso de desear que la nueva clase herede las propiedades de otra ya existente el nombre de esta deberaacuteespecificarse despues de is-a El rol determinaraacute si la clase es concreta (se puede instanciar) o abstracta(destinada a ser superclase) El pattern-match debe declararse como reactivo si se desea que las instanciasde la clase puedan unificar con los elementos objeto de las reglas (siacutembolo lt-) Los slots correspondena los atributos de la clase y los handlers a las funciones de eacutesta Los handlers se pueden declarar en ladeclaracioacuten de la propia clase pero se deben definir externamente Dado que no aporta ninguna ventaja
declararlos es recomendable definirlos directamente Noacutetese que todo aquello que estaacute entre corchetes ([])constituye informacioacuten adicional que no es obligatorio especificar
1 (defclass Persona2 (is-a Ser_Vivo)3 (role concrete)4 (single-slot edad5 (type INTEGER)6 (range 1 99)7 (cardinality 0 1)8 (create-accessor read-write)9 )
10 (multislot amigos11 (type INSTANCE)12 (allowed-classes Persona)13 )14 )
El comportamiento y declaracioacuten de los slots es ideacutentico al de los slots de los hechos ordenados Losatributos de tipo INSTANCE (referencian otras instancias) estan en formato INSTANCE-NAME
355 Com consulto una instagravencia a partir drsquouna regla
Podem fer servir la part esquerre drsquouna regla per trobar instagravencies Lrsquouacutes eacutes molt semblant a trobar elpunter a un fet fent servir
(object [(is-a ltNOM_CLASSEgt)|(name ltNOM_INSTANCIA)|(ltNOM-SLOTgt ltVALORVARIABLE))])
Per exemple si volem que una regla srsquoinstanciiuml si tenim instanciat un plat de la classe Plat podriem ferservir
1 (defrule tenimplat2 plat lt- (object (is-a Plat))3 =gt4 (print t (send plat get-nom) crlf)
La regla imprimiragrave el nom del plat que trobi Eacutes important notar que srsquoactivaragrave per cada instagravencia de platque tinguem a la base de coneixement
Podem consultar els valors de la instancia fent servir condicions a la part esquerre de la regla Per exemplesi nomeacutes volgueacutessim els plats amb un preu meacutes gran que 30
1 (defrule platCar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Srsquoactivaragrave per tots els plats amb un preu major a 30
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2459
35 Las clasesinstancias 21
Srsquoha drsquoanar amb cura per aquest tipus de regla ja que si la base de coneixement eacutes molt amplia pot acabarderivant amb problemes de memograveria
Per exemple si en comptes de preguntar per una instagravencia de Plat pregunteacutessim per dues instancies dePlat
1 (defrule platsCars2 plat1 lt- (object (is-a Plat) (Preu p1))3 plat2 lt- (object (is-a Plat) (Preu p2))4 (test (gt p1 30))5 (test (gt p2 30))6 =gt7 (print t (send plat1 get-nom) i (send plat1 get-nom) soacuten cars8 crlf)9 )
Faria unificacioacute amb totes les combinacions possibles (amb repeticions) de dos plats de tota la base deconeixement Aixograve es podria anar ampliant fins fer-se intractable
Si tenim drsquoalguna manera el nom de la instancia podem fer
1 (defrule platPicant2 (cuina (plat p))3 (object (name p) (picant pi))4 =gt5 (print t picant pi crlf)6 )
Aixoacute es pot servir per crear condicions que facin servir noms drsquoinstancies que tenim almacenats a slotsdrsquoaltres instancies per exemple
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send v get-Preu) crlf)6 )
Aquesta regla imprimiria el preu del vi asociat al plat si es negre
356 Tengo problemas en condiciones de reglas con slots de instancias obtenidos con send
A veces dan problemas las reglas en las que las condiciones sobre los valores de los slots de una instanciase escriben usando mensajes get sobre los atributos de una instancia en lugar de utilizar patrones paraobtenerlos por ejemplo la regla
1 (defrule platcar2 plat lt- (object (is-a Plat) )3 (test (gt (send plat get-Preu) 30))4 =gt5 (print t (send plat get-nom) es car6 crlf)7 )
No funciona correctamente en CLIPS pero la regla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2559
22 Capiacutetulo 3 CLIPS
1 (defrule platcar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Siacute lo haceEn el caso de que el valor del slot sea booleano se puede escribir la regla como
1 (defrule platpicant2 plat lt- (object (is-a Plat) (Picant TRUE))3 =gt4 (print t (send plat get-nom) es picant crlf)
En el caso de que el slot sea a su vez una instancia se puede utilizar para obtener los valores de estainstancia en la condicion como se explica en la pregunta anterior
357 Tengo problemas con instancias obtenidas del slot de otra instancia en el patroacuten de unaregla
Este problema aparece cuando el patron de una regla instancia una variable a un nombre de instancia yesta no esta definida en el modulo de la regla por ejemplo si la regla siguiente pertenece a un modulo queno es el de la instancia
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4
=gt5 (print t preu (send v get-Preu) crlf)6 )
La regla se quejaraacute de que la instancia no existe al enviarle el send ya que solo se busca la instancia dentrodel moacutedulo de la regla y no en los importados Para arreglar esto se puede usar la funcioacuten (instance-address[ltMODULOgt|] ltINSTANCIAgt) que busca la direccion de la instancia en un modulo concreto o en todos losmoacutedulos que se importan () Deberiacuteamos entonces escribir la regla
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send (instance-address v) get-Preu) crlf)6 )
358 iquestCoacutemo realizar una buacutesqueda de instancias que cumplan unas restricciones
CLIPS nos ofrece varias funciones de buacutesqueda de instancias que cumplan unas determinadas restriccionesque a nosotros nos interese
La funcioacuten find-instance Esta funcioacuten devuelve la primera instancia que cumple todas las restric-ciones indicadas
La funcioacuten find-all-instances Esta funcioacuten devuelve todas las instancias que cumplen las restric-ciones indicadas
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2659
35 Las clasesinstancias 23
La sintaxis de ambas funciones es igual exceptuando el nombre de la funcioacuten(find-all-instances (clase_instancias) (restricciones))A continuacioacuten se muestran varios ejemplos
(bind rectangulos (find-all-instances ((inst Rectangulo)) (gtinstaltura 10))) Des-pueacutes de ejecutar esta funcioacuten en la variable rectangulos habraacute una lista con todas las instancias de la
clase Rectangulo cuya altura sea superior a 10(bind rectangulos (find-all-instances ((inst Rectangulo)) (and (gtinstaltura 10) (=instanchura 7)))) Este trozo de coacutedigo hace que en la variable rectangulos se guarde una listade las instancias de la clase Rectangulo que tienen una altura superior a 10 y una anchura igual a 7
Estas funciones que CLIPS nos ofrece tienen otra funcionalidad y es que podemos realizar buacutesquedas deconjuntos de instancias
(bind rectangulos (find-all-instances ((a Rectangulo) (b Rectangulo)) (= aalturabaltura))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas de instancias de laclase Rectangulo que tienen la misma altura
Por uacuteltimo es necesario comentar que se pueden realizar buacutesquedas de conjuntos de instancias que seande distintas clases
(bind figuras (find-all-instances ((rect Rectangulo) (circ Circulo)) (= rectalturacircradio))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas ltrectangulocirculogtque cumplan que la altura del rectaacutengulo sea igual al radio del ciacuterculo
Existen maacutes comandos para obtener instancias pero son menos utilizadas a nivel baacutesico como pueden serany-instancep do-for-instance do-for-all-instances y delayed-do-for-all-instances
359 iquestCoacutemo se interactuacutea con objetos
La interaccioacuten con objetos se efectuacutea mediante lo que se denomina mensaje
(defmessage-handlerltnombre-clasegtltnombre-mensajegt[lttipo-handlergt] [ltcomentariogt]ltparaacutemetrogt [ltparaacutemetro-comodiacutengt])ltaccioacutengt
)
Un gestor de mensajes consta de 7 partes
1 Nombre de clase a la que el gestor estaraacute asociado
2 Nombre del mensaje
3 Tipo de gestor (Nosotros habitualmente usaremos primary que viene por defecto)
4 Comentario (opcional)
5 Lista de paraacutemetros6 Paraacutemetro comodiacuten (para gestionar muacuteltiples paraacutemetros)
7 Secuencia de acciones o expresiones que seraacuten ejecutadas por el gestor
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2759
24 Capiacutetulo 3 CLIPS
Enfocado a la praacutectica de CLIPS la maacutes comuacuten es que queramos interactuar con objetos para
1 Imprimir los objetos Un ejemplo
1 (defmessage-handler avion imprimir-beneficio ()
2 Para implementar funciones calculadas asociadas al objeto Un ejemplo
1 (defmessage-handler avion calcular-beneficio ()2 ( selfplazas-ocupadas selfprecio-billete))3 )
Como se puede observar el paraacutemetro impliacutecito self contiene la instancia activa para este mensaje
3510 iquestComo se interactuacutea con las instancias de los objetos
Podremos interactuar entre las instancias de los objetos mediante la funcioacuten send
(send ltexpresioacuten-de-objetogtltnombre-de-mensajegtltexpresioacutengt)Donde se toman como argumentos el objeto destino del mensaje el mensaje mismo y otros paraacutemetros
que debieran ser pasados a los gestoresParticularmente en el aacutembito de la praacutectica usualmente necesitaremos utilizar el envioacute de mensajes de
tipo get put and delete Estos mensajes tiene la siguiente sintaxis
get-ltnombre-atributogt
put-ltnombre-atributogt
delete
Aquiacute tenemos un ejemplo de como utilizarlo recordando que ponemos entre corchetes la instancia la cualse enviacutea el mensaje
(defclass avion (is-a USER)(role concrete)(slot precio-billete (create-accessor read) (default 34))(slot plazas-ocupadas (create-accessor write) (default 0)))
Clase creada
gt(make-instance a of avion) Creacioacuten de una instancia de avion[a]
gt(send [a] get-precio-billete) Obtencioacuten de un slot34 Resultado obtenidogt(send [a] put-plazas-ocupadas 100) Modificacioacuten de un slotgt(send [a] delete) Eliminacioacuten de la instanciaTrue
3511 Uso de make-instance
Cuando queremos crear una instancia de una clase para ir rellenandola con los resultados o datos quevayamos obteniendo se haria lo siguiente
(bind variable_instancia (make-instance nombre_instancia of nombre_clase))
Una vez creada podemos jugar con dicha instancia en las diferentes reglas siempre que la llamemos enlos activadores
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2859
35 Las clasesinstancias 25
(defrule reglavar_instancia lt- (object (is-a nombre_clase))=gt
)
De esta manera dentro de la regla podemos hacer acciones con la instancia por ejemplo(send var_instancia put-articulo articulo_ejemplo)
3512 Como generar automaacuteticamente nombres de instancia
En ocasiones queremos crear instancias en reglas y queremos que su nombre sea distinto del de otrasque ya tenemos Para ello podemos utilizar las funciones gensym y gensym La primera genera un siacutembolodel estilo genN donde N es un nuacutemero La segunda hace lo mismo pero aseguraacutendose de que ese siacutembolono exista ya Se puede reiniciar el contador que usan estas dos funciones con el operador (setgen ltnumgt)donde ltnumgt es el nuacutemero por el que queremos que empiecen ahora los siacutembolos
Para usar esto para generar el nombre de una instancia podemos hacer
(make-instance (gensym) of ltclasegt)
Cada vez que se ejecute se generaraacute un nombre de instancia nuevoSi creamos instancias de diferentes clases y queremos que las instancias tengan nombres que podamos
identificar podemos concatenar siacutembolos a los siacutembolos generados por gensym por ejemplo
(make-instance (sym-cat pepe- (gensym)) of ltclasegt)
generaraacute una instancia con el nombre pepe-genN
3513 Com fer un getset drsquoun slot drsquouna classe
Per consultar el valor drsquoun slot drsquouna classe ho podem fer enviant-li un missatge de la seguumlent manera
(send ltVARIABLEgt get-ltNOM_ATRIBUTgt)
Per exemple si tenim una instagravencia de la classe Plat ( instancia ) i volem saber el valor del seu slotnom
(send instancia get-nom)
Per assignar un valor a un slot drsquouna drsquoinstagravencia hem drsquoenviar-li un missatge de la seguumlent manera
(send ltVARIABLEgt put-ltNOM_ATRIBUTgt ltVALORgt)On ltVALORgt pot ser un valor o un megravetode que retorni un valor
(send instancia put-nom nom)
3514 iquestCoacutemo acceder a una instancia cuyo nombre conocemos
Si conocemos el nombre de una instancia y necesitamos acceder a ella es decir necesitamos enviarle alguacutenmensaje mediante la funcioacuten send podemos hacerlo directamente escribiendo en lugar de la variable quealmacena la instancia el nombre de la instancia entre corchetes [ ] A continuacioacuten se muestra un ejemplo
(bind altura_rect1 (send [rect1] get-altura))
En este caso se guardaraacute en la variable altura_rect1 el valor de la altura de la instancia que tiene comonombre rect1
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2959
26 Capiacutetulo 3 CLIPS
3515 Obtenir el nom drsquouna classe
Si tenim una instagravencia drsquouna classe i volem saber el nom de la classe (uacutetil si tenim una bona taxonomiade classes) ho podem fer amb el megravetode (class ltINSTANCIAgt)
Si per exemple imaginem que tenim la classe Actor la qual teacute com subclasses la classe APrincipalASecundari i ACameo Imaginem que estem tractant amb instancies drsquoactors i volem saber si la instanciaque estem tractant es de la classe APrincipal
Ho hauriacuteem de fer de la seguumlent manera
(eq (class instancia) APrincipal)
Fixem-nos que APrincipal eacutes un siacutembol no un String (un truco eacutes fixar-se en que no teacute cometes) Si vol-gueacutessim comparar-ho amb un String (per exemple un String introduiumlt per lrsquousuari) ho podriacuteem transformara un String amb el megravetode str-cat
(eq (str-cat (class instancia)) Principal)
3516 Como convierto un INSTANCE-ADRESS en un INSTANCE-NAME
En alguacuten momento nos podemos encontrar con la situacioacuten de que disponemos de un puntero a unainstancia y necesitamos su nombre o lo contrario En ambos casos podemos usar la funcioacuten instance-nameSu funcionamiento es bidireccional podemos introducirle un instance-name y nos devolveraacute un instance-adress y viceversa
1 (defrule imprimir-nombre2 estlt-(object (is-a Estudiante) (edad 25))3 =gt4 (printout t (instance-name est) crlf)5
)
3517 Com iterar a traveacutes drsquoun multi-slot
El seguumlent tambeacute eacutes vagravelid com exemple de com iterar a traveacutes drsquouna llistaImaginem que tenim una instagravencia de la classe Plat a la varible (plat) la qual teacute un multi-slot drsquoinstagravencies
de la classe Ingredient Imaginem que volem imprimir per pantalla el nom drsquoaquests ingredients (slot nomde la classe Ingredient) Necessitarem iterar sobre la llista drsquoingredients
1 (bind i 1)2 (while (lt= i (length$ (send plat get-ingredients)))3 do4 (bind ingredient (nth$ i (send plat get-ingredients)))5 (printout t (send ingredient get-nom) crlf)6 (bind i (+ i 1))7 )
El megravetode (nth$ ltINDEXgtltLLISTAgt) et retorna lrsquoelement situat a INDEX de LLISTAEl megravetode (length$ ltLLISTAgt) retorna el nuacutemero drsquoelements de LLISTA
3518 Coacutemo modificarinsertarborrar valores en un multislot
Los valores de un multislot se pueden cambiar usando la funcioacuten slot-replace$ La sintaxis es la siguiente
(slot-replace$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt ltvalorgt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3059
35 Las clasesinstancias 27
Donde ltiniciogt y ltfingt son el rango de posiciones del multislot que se quiere modificar y ltvalorgtson los valores que queremos reemplazar Obviamente deberaacute haber tantos valores como posiciones hayamosindicado en el rango
Para insertar nuevos valores podemos usar la funcioacuten slot-insert$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltposgt ltvalorgt)
El valor se inserta delante de la posicioacuten indicada si la posicioacuten es mayor que la longitud del multislot secolocaraacute al final
Para borrar elementos de un multislot podemos usar la funcioacuten slot-delete$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt)
Se borraraacuten los elementos que estaacuten en el rango indicado
3519 Coacutemo recorrer un atributo multievaluado
Supongamos que la variable respuesta tiene una lista de instancias
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 aquiacute hacemos lo que queramos4 )5 )
Loop-for-count funciona como un for primero la variable que haraacute de contador luego el valor de origeny luego el valor final Para controlar el final usamos la funcioacuten que he explicado antes i tomaraacute valoresdesde 1 hasta n asiacute que usando la funcioacuten nth$ obtendremos cada uno de los elementos La variable auxiraacute teniendo cada uno de los valores
3520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz)
Es igual que antes pero con dos bucles
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 (bind aux2 (send aux get-slot_que_queremos))4 (loop-for-count (j 1 (length$ aux2)) do5 (bind aux_final (nth$ j aux2))6 aquiacute ya podemos trabajar con el elemento en concreto7 )8 )
Supongamos que respuesta tiene una lista de instancias con el primer bucle haremos lo mismo que antes ir
iterando por esas instancias Una vez que tenemos cada instancia con aux2 con el segundo bucle iteraremosdentro de sus instancias interiores
Por ejemplo si tenemos varios equipos de fuacutetbol y cada equipo tiene varios jugadores en el primer bucleestamos iterando entre los equipos y en el segundo entre los jugadores de cada equipo en particular
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3159
28 Capiacutetulo 3 CLIPS
3521 Com puc esborrar una instagravencia
Per esborrar una instagravencia (per exemple segons la informacioacute que proporcioni lrsquousuari podem deduir queuna segraverie drsquoinstagravencies eacutes impossible que es facin servir per a la solucioacute) ho podem fer enviant un missatgedelete a la instagravencia eacutes a dir (send ltINSTANCIAgtdelete)
(send inst delete)
Un megravetode que podria ser uacutetil de la cara a la pragravectica podria ser el seguumlent
1 (defrule elimina-instancia2 (declare (salience 10))3 elimina-fact lt- (elimina-inst inst)4 =gt5 (send inst delete)6 (retract elimina-fact)
Imaginem que per exemple que volem eliminar una llista drsquoinstagravencies Per eliminar-les podriacuteem recoacuterrerel llistat marcant les instagravencies que volem esborrar afegint el seguumlent fet
(assert (elimina-instancia inst))
Aixiacute com que elimina-instancia teacute un salience alt esborraria les instagravencies marcades quan tingueacutes ocasioacuteDrsquoaquesta manera ens estalviem el problema de recoacuterrer un llistat drsquoinstagravencies amb un iterador mentre
anem eliminant els elements de la llista cosa que pot donar problemes amb lrsquoiterador
3522 Com imprimir una instagravencia
Per imprimir una classe (uacutetil per exemple per mostrar el resultat final) el millor eacutes definir message-handlersPer exemple imaginem que tenim una classe Plat la qual teacute un slot nom de tipus String Si volgueacutessimimprimir per pantalla un missatge que digueacutes
El nom del plat eacutes ndashltnom del platgtndash
Hauriacuteem de definir un message-handler que simplement imprimiacutes per pantalla el valor de lrsquoslot de laforma
(defmesssage-handler ltCLASSNAMEgt ltMESSAGENAMEgt primary ()ltCODIgt
)
Per el cas de lrsquoexemple
1 (defmessage-handler Plat print primary ()2 (printout t -- selfnom --) )3 )
Per cridar-ho nomeacutes caldragrave enviar-li un missatge a la instagravencia amb el nom del message-handler (enaquest cas print)
(send instancia print)
Un message-handler pot cridar a altres message-handlers amb el que es poden encadenar diverses instagraven-cies Per exemple imaginem que tenim la classe Menuacute la qual teacute un atribut plats que eacutes un llista drsquoinstagravenciesde la classe Plat Dintre del message-handler menuacute podriacuteem iterar a traveacutes de la llista de plats enviant elmissatge print que hem definit anteriorment
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3259
36 Programacioacuten 29
3523 Com es navega entre instagravencies relacionades
Per exemple tinc una instagravencia iA que teacute un slot anomenat slotB que eacutes una instagravencia drsquoun frame B Vullsaber el nom de la instagravencia associada al slotB de iA Ho pots fer aixiacute
(bind B (send iA get-slotB))(bind res (send B get-nom))
Si estagraves dins drsquouna condicioacute ho pots simplificar de la forma seguumlent
(bind res (send iAslotB get-nom)
Els dos punts soacuten equivalents al punt de Java
36 Programacioacuten
361 Com introduir un comentari
Els comentaris a CLIPS va darrere de un com per exemple
Comentari
Tambeacute podem afegir comentaris a les nostres regles deffacts deftemplates etc Generalment van darrereel nom de la estructura per exemple
1 (defrule neteja regla per la qual si la cuina estagrave bruta srsquoafegiragrave una tasca de2 neteja
3 (estat-cuina bruta)4 =gt5 (assert (tasca netejar))6 )
362 Referenciar el valor null a CLIPS
Per referenciar el valor null a clips es fa amb el simbol nil Per exemple si volem saber si una instagravenciainst es null ho podriacuteem fer de la seguumlent manera
(eq inst nil)
363 Formas de recorrer una lista
Para recorrer una lista disponemos de diferentes opciones en este FAQ explicaremos como crear unaestructura tipo ldquoWHILErdquo y tipo ldquoFORrdquo
1 While Esta regla se ejecuta hasta que la expresioacuten a evaluar sea falsa Este tipo de estructura se rigepor seguir la sintaxis while - do y se construiriacutea de la siguiente forma
(while ltexpresioacutengt[do] ltaccioacutengt)
Doacutende dependiendo del valor de ltexpresioacutengt
Valor TRUE Se realizaraacute la accioacuten ltaccioacutengt i se volveraacute a evaluar ltexpresioacutengt
Valor FALSE No se ejecutaraacute la accioacuten ltaccioacutengt
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3359
30 Capiacutetulo 3 CLIPS
2 For Esta regla sirve para ejecutar un bucle N (final - inicio) veces Este tipo de estructura se rige porseguir la sintaxis loop-for-count y se construiriacutea de la siguiente forma
(loop-for-count (ltvargtltiniciogtltfinalgt) [do] ltaccioacutengt)
Doacutende
ltvargt Variable que se usara como iacutendice
ltiniciogt Valor inicial que tendraacute ltvargt
ltfinalgt Ultimo valor que tendraacute la variable ltvargt
ltaccioacutengt Accioacuten que es realizaraacute hasta que ltvargt tenga el valor de ltfingt
364 Formas de elegir una opcioacuten
En este apartado explicaremos como crear una estructura if y una estructura switch
If Este tipo de estructura se rige por seguir la sintaxis if - then - else y se construiriacutea de lasiguiente forma
(if ltexpresioacutengtthen ltaccioacutengt[else ltaccioacuten2gt])
Doacutende dependiendo del valor de ltexpresioacutengt
bull Valor TRUE Se realizaraacute la accioacuten ltaccioacutengtbull Valor FALSE Se realizaraacute la accioacuten ltaccioacuten2gt (en caso de haber)
Switch Este tipo de estructura se rige por seguir la sintaxis switch - opciones y se construiriacutea dela siguiente forma
(switch ltexpresioacuten-testgt(case OPCION1 then ACCION1)(case OPCION2 then ACCION2)
([default] ACCION-DEFAULT)
)
Doacutende dependiendo del valor de ltexpresioacuten-casegt se ejecutaraacute una ltaccioacutengt en particular Si nin-guna ltopcioacutengt es correcta se ejecutara la ltaccioacuten-defaultgt
365 Funciones con la clase String
Habitualmente trabajaremos con Strings o cadena de Strings CLIPS proporciona una serie de herramien-tas para trabajar con esta clase
1 Convertir string a MAYUacuteSCULAS A veces es conveniente tener todos los caracteres en mayuacutesculaspara no tener problemas de comparaciones o simplemente por convenio Para ello CLIPS dispone dela funcioacuten upcase la cual convierte a mayuacutesculas un siacutembolo o string
(upcase ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplos
(upcase Ccedillips es divertido) rarr CcedilLIPS ES DIVERTIDO
(upcase Clips_es_divertido) rarr CLIPS_ES_DIVERTIDO
2 Convertir string a MINUacuteSCULAS la funcioacuten es downcase
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3459
36 Programacioacuten 31
3 Concatenacioacuten de strings Tambieacuten es de gran utilidad poder juntar dos o maacutes paraacutemetros en un solostring Todo paraacutemetro a juntar deben ser de uno de los siguientes tipos symbol String integer floato instance-name
(str-cat parametro1 parametro2 parametroN )
Ejemplo
(str-cat IA nota 10) rarr IAnota10
4 Comparacioacuten de strings Funcioacuten que nos indica si dos strings son iguales
(str-compareltexpresioacuten-simboacutelica-o-de-cadenagtltexpresioacuten-simboacutelica-o-de-cadenagt
)
Esta funcioacuten devuelve
0 Si ambos strings son iguales1 Si el primer string es mayor que el segundo string-1 Si el primer string es menor que el segundo string
5 Longitud de un string Muchas veces es de gran utilidad saber que tamantildeo tiene un string
(str-length ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplo
(str-length Inteligencia Artificial) rarr 23
366 iquestCoacutemo obtener el contenido de una variable en un string
Para conseguir un string a partir de un integer float symbol instance-name debes utilizar el comandostr-cat Si a la funcioacuten le pasamos como paraacutemetros varios elementos los transformaraacute a string y losconcatenaraacute La sintaxis de esta funcioacuten es la siguiente (str-cat elementos) Esta funcioacuten la usaremossobre todo cuando queramos realizar comparaciones entre el contenido de una variable y un string ya quepreviamente necesitaremos usar la funcioacuten str-cat para pasar el contenido de la variable a string y realizarde este modo la comparacioacuten de forma correcta
367 iquestComo se crea una lista
Con create$ Todos los operadores sobre listas llevan el siacutembolo $ al final Igual que con las variables sedebe usar bind siempre que se desee modificar una lista
(bind lista (create$ a b c))
368 iquestComo borro un elemento de una lista
Con delete$Usa la siguiente sintaxis(delete$ ltlistagt ltindice-iniciogt ltindice-finalgt)Se borraraacuten todos los elementos del rango entre las posiciones inicio y final ambas incluidas Tambieacuten exis-
tedelete-member$ (delete-member$ ltlistagt ltelementogt) Borraraacute todas las apariciones del elemento enla lista
(delete$ (create$ a b c d e f) 3 5) minusrarr (a b f)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 759
4 Iacutendice general
515 Check appropiate syntax for ifswitchloop-for-count 54516 Problemas con pareacutentesis 54
6 Referencias 5561 On puc trobar informacioacute sobre el llenguatge CLIPS 5562 Otras referencias 55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 859
1 Introduccioacuten
Este documento es el resultado de la recopilacioacuten de los documentos escritos durante el desarrollo de lapraacutectica de sistemas basados en el conocimiento el cuatrimestre de otontildeo del curso 2007-2008
El objetivo de estos documentos era recoger las dudas frecuentes que se encuentra un alumno durante eldesarrollo de la praacutectica de SBCs y consejos praacutecticos que puedan ayudar en el desarrollo
Este documento recoge principalmente dudas frecuentes sobre el entorno CLIPS y su lenguaje de progra-macioacuten
5
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 959
6 Capiacutetulo 1 Introduccioacuten
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1059
2 Protegravegegrave
Para saber como funciona Protegravegegrave usad la ayuda de la aplicacioacuten y el material correspondiente estascuestiones se refieren a como integrar lo que se desarrolla en Protegravegegrave con CLIPS
21 Coacutemo cambiar el nombre de las instancias en Protegravegegrave
En realidad no se trata de cambiar el nombre de las instancias sino de darle algo maacutes visual que unnuacutemero para poder hacer las relaciones Si os encontraacuteis en la pestantildea de crear instancias el uacuteltimo botoacutenes una flecha hacia abajo Darle y luego set display slots Ahiacute debeacuteis indicar con que slot quereacuteis referenciarla instancia
22 Com exporto una ontologia de Proteacutegeacute a CLIPS
A Proteacutegeacute ves a File rarr Export to Format rarr CLIPS Un cop fet aixograve es crearan dos nous fitxers ambles classes i instagravencies de lrsquoontologia (nompont i nompins respectivament)
Despreacutes obre aquests dos fitxers amb un editor de text i copia el seu contingut al fitxer CLIPS de laseguumlent manera
copy-paste de nompont
(definstances instanciescopy-paste de nompins)
23 iquestCoacutemo exporto una ontologiacutea de Proteacutegeacute a CLIPS (2a posibilidad)
Alternativamente a hacer corta y pega de los ficheros de protege en el fichero de CLIPS se puede crearun fichero que cargue todos los ficheros sin tener que juntarlos
Para ello hay que crear un fichero que incluya las oacuterdenes de carga de los diferentes ficheros Por ejemplopodemos llamar a este fichero cargaclp El contenido de este fichero seraacute
(load PATHnompont)(load-instances PATHnompins)(load PATHfichero-de-reglasclp)
Donde PATH es el directorio donde se encuentran vuestros ficherosEste fichero se ha de cargar desde el inteacuterprete mediante la orden batch ((batch cargaclp)) o con
la opcioacuten de menuacute load batch Usando la instruccioacuten load-instances evitamos tener que antildeadir al fichero de instancias la instruccioacuten
definstances
24 Per quegrave em doacutena error CLIPS al tenir una instancia que hereta de meacutesdrsquouna classe
7
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1159
8 Capiacutetulo 2 Protegravegegrave
Proteacutegeacute permet lrsquoheregravencia muacuteltiple en instagravencies perograve CLIPS no En CLIPS nomeacutes poden tenir heregravenciamuacuteltiple las classes perograve no les instagravencies Aixoacute es aixiacute perque el lenguatge de CLIPS es orientat a objectesno es realment un lenguatge drsquoontologiacutees
La manera meacutes senzilla de simular-ho si les clases no tenen ancestres comuns eacutes tenir classes que repre-sentin aquesta heregravencia muacuteltiple i fer que les instagravencies pengin drsquoelles que es com es faria a un llenguatge
orientat a objectesEn el cas de tenir ancestres comuns no es pot fer lrsquounica manera es duplicar la instancia amb nomsdiferents i penjar-les de les clases on es vol tenir-la
De totes maneres el CLIPS permet recuperar fagravecilment les instagravencies que tenen un valor especiacutefic en unslot pel qual el meacutes senzill eacutes tenir una uacutenica jerarquia i incloure altres possibles classificacions com a slotsencara que obviament perdrem la posibilitat de fer servir una jerarquia de valors per aquest
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1259
3 CLIPS
31 Instalacioacuten del CLIPS
311 iquestCoacutemo instalar CLIPS
La herramienta CLIPS es multiplataforma y esta disponible para los tres SO maacutes utilizados MicrosoftWindows Linux y Mac OS X
iquestCoacutemo instalar CLIPS en Windows
Primero de todo debemos bajarnos el programa de la paacutegina oficial de CLIPS accesible desde este link
(httpclipsrulessourceforgenet) Desde el aacuterea de descarga os podreis bajar el instalador parawindows
iquestCoacutemo instalar CLIPS en Linux
En muchas distribuciones de Linux CLIPS esta disponible como un paquete adicional el paquete sueleinstalar la versioacuten con interfaz graacutefico Si no encuentras el paquete especiacutefico para la distribucion que usassiempre puedes compilarlo a partir del paquete con los fuentes
Tambieacuten estaacute la posibilidad de utilisar el emulador de windows WINE Una vez instalado el emulador sepuede instalar CLIPS y este funcionaacute igual que sobre windows
iquestCoacutemo instalar CLIPS en Mac OS X
Primero de todo debemos bajarnos el programa de la paacutegina oficial de CLIPS accesible desde este link(httpclipsrulessourceforgenet ) Desde el aacuterea de descarga podeis bajar el intalador para MACOS X
312 Entorn finestres VS Consola de comandes
Encara que lrsquoentorn de finestres eacutes molt meacutes intuiumltiu CLIPS a la seva versioacute en liacutenea de comandes eacutes moltmeacutes ragravepid (segurament perquegrave no ha de mostrar en tot moment lrsquoagenda de fets les instancies les regles
etc)La diferencia de velocitat eacutes molt notable en cas de problemes de rendiment o de sensacioacute que lrsquoentorn
de finestres es queda penjat (o directament es tanca sense previ aviacutes) recomanem provar la versioacute en liacuteneade comandes
32 Los hechos
321 iquestQueacute es un hecho en CLIPS
Conceptualmente un hecho representa un dato abstracto del cual almacenamos valores Se puede vercomo una lista de campos donde el primer campo hace referencia al ldquodatordquo al cual le asignamos una listade valores que le suceden teniendo una relacioacuten entre siacute
Formalmente el primer campo es un siacutembolo y los campos restantes son valores
9
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1359
10 Capiacutetulo 3 CLIPS
(siacutembolo valor1 valor2 valorN)
322 iquestQueacute es un hecho ordenado (order Facts)
Un hecho ordenado tienen formato libre por lo tanto no existe restriccioacuten alguna en el orden de los campos
Los campos de un hecho ordenado pueden ser de cualquier tipo primitivo de datos excepto el primero quedebe ser un siacutembolo Como ejemplo tenemos
1 (hermanos Antonio Javier Carlos)2 (padre Pedro David)
323 iquestQueacute es un hecho no ordenado (deftemplates facts)
A traveacutes de los hechos no ordenados podemos abstraernos de la estructura de un hecho asignado unnombre a cada campo (slots)
1 (deftemplate nombre-template comentario2 (slot nombre-slot (tipo-del-slot))3 (multislot nombre-slot (tipo-del-slot))4 )
Por ejemplo
1 (deftemplate avioacuten2 (slot nombre_avion (type STRING))3 (slot compania (type STRING))
4 (slot numero_plazas (type INTEGER) (default 100))
324 iquestPuedo tener un vector como slot
Si debe declararse como multislot
325 iquestPuedo asignar propiedades a los slots
Siacute las maacutes importantes son
Type El tipo de dato primitivo que contiene (en mayuacutesculas)
Allowed-X Permite especificar un conjunto de valores permitidos Siendo X un tipo de datos primitivo(en minuacutesculas y plural) rarr si el slot toma un valor del tipo X debe pertenecer a los valores permi-tidos X puede ser values especificando entonces todos los valores posibles que puede tomar el slotindependientemente del tipo de dato
Range Especifica un rango para slots numeacutericos
Cardinality Nuacutemeros miacutenimo y maacuteximo de elementos que puede tener un multislot
Default Valor por defecto Si ponemos NONE como valor por defecto significaraacute que no se podraacute crear la
instancia a no ser que se especifique el valor de ese slot
1 (deftemplate estudiante2 (slot edad (type INTEGER) (range 0 99))
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1459
32 Los hechos 11
3 (multislot asignaturas (type STRING) (cardinality 1 5))4 (slot num-carreres (default 1))5 (multislot notas (allowed-strings MH NP))6 )
326 iquestQueacute debo utilizar hechos ordenados o no ordenados
Como se puede intuir si tenemos un conjunto de hechos los cuales conceptualmente pertenecen al mismoaacutembito seraacute una solucioacuten maacutes elegante agruparlos a traveacutes de un deftemplate En caso que tengamos quealguacuten hecho aislado seraacute mas sencillo declararlo como un hecho ordenado
327 Fets o Objectes
Veient la definicioacute de deftemplate podem confondrersquons a lrsquohora de decidir si fer servir fets o fer servirobjectes
Deixant de banda altres diferegravencies ja comentades (les classes suporten jerarquia de classes heregravenciaetc) els objectes es fan servir per representar el coneixement (mitjanccedilant un conjunt drsquoinstagravencies)
Aixiacute que generalment farem servir classes i objectes per representar coneixement mentre que farem servirels fets per portar control sobre lrsquoexecucioacute del problema
Per exemple podriacuteem definir un deftemplate per emmagatzemar un resultat o per poder controlar lrsquoestatde lrsquoexecucioacute
A la pragravectica de Mikeo (penjada a la web de lrsquoassignatura) teniacuteem un deftemplate habitacion-actual
1 (deftemplate habitacion-actual2 (slot habitacion)3 (slot area-restante)4
(slot presupuesto-restante)5 (slot precio-total)6 (slot prioridad-actual)7 )
Amb el qual controlagravevem la construccioacute drsquouna habitacioacute Assignagravevem una instagravencia de la classe habita-cioacute al slot habitacion de habitacion-actual i mitjanccedilant una segraverie de regles que feien unificacioacute ambhabitacion-actual actuagravevem sobre lrsquohabitacioacute drsquouna manera o drsquoun altre
328 Creacioacuten de hechos (assertdeffacts)
Si queremos crear un solo hecho utilizaremos el comando assert Por ejemplo (assert (casa roja))Si por el contrario queremos crear una estructura ordenada de hechos utilizaremos deffacts
(deffacts mishechos (casa roja) (pelota azul))
329 Modificar un fet
Per modificar un fet (per exemple molt uacutetil si estem treballant amb deftemplates) ho podem fer mitjanccedilant(modify ltINSTANCIAgtltFETSgt)
Per exemple si tingueacutessim el deftemplate persona
1 (deftemplate persona2 (slot nom)3 (slot edad)4 (slot dni)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1559
12 Capiacutetulo 3 CLIPS
I hagueacutessim afegit el fet
(assert (persona (nom Pepe)(edad 25)(dni 46974431)))
I el fet
(assert (aniversari 46974431))
Podriacuteem tenir la seguumlent regla
1 (defrule aniv2 aniversari lt- (aniversari dni)3 persona lt- (persona (edat edat)(dni dni))4 =gt5 (retract aniversari)6 (modify persona (edat (+ 1 edat)))7 )
La qual srsquoactivaragrave si hi ha un fet aniversari drsquouna persona Fent servir el dni indicat al fet aniversaribusquem el fet persona que teacute el mateix dni Deixem el valor edat a la variable edat per poder treballaramb ella meacutes endavant
Hem agafat tambeacute la direccioacute del fet aniversari per tal de poder esborrar-lo de la base de fets Aixograve srsquohafet per dues raons
Primer per mantenir meacutes neta la base de fets Segon i meacutes important Com que hem canviat el fet laregla tornaragrave a fer unificacioacute amb el fet (perquegrave ara eacutes diferent) amb la regla aniversari amb el que entrariadintre drsquoun bucle sense fi on srsquoaniria incrementant lrsquoedat de la persona
Un cop hem esborrat el fet aniversari incrementem en 1 el valor del slot edat de la persona fent servirla variable edat que hem declarat a la part esquerre de la regla
El comportament de modify es fer un retract del fet a la base de fets i despreacutes fer un assert amb els nous
valors Si volem canviar mes drsquoun slot del fet es convenient canviar-los tots a la vegada La raoacute es que cadavegada que fem un modify lrsquoapuntador al fet es modifica i lrsquoapuntador que tenim a la variable que hem fetservir ja no es vagravelid
Si no temim mes remei que fer la modificacioacute del fet pas a pas srsquoha de saber que la crida a modify retornalrsquoapuntador al nou fet Si el guardem a altra variable (o a la mateixa) podrem continuar modificant el fetamb la nova referegravencia
3210 Com elimino un fet de la base de fets
Per eliminar un fet de la base de fets ho podem fer amb la paraula clau (retract ltFETgt) on ltFETgt eacutes
un punter al fetPer obtenir aquest fet ho podem fer fent servir ltVARgtlt- ltFETgt a la part esquerre de la reglaPer exemple
1 (defrule accionsvent2 vent lt- (vent tipus)3 =gt4 (switch tipus5 (case poc then (assert (accio persiana0)))6 (case normal then (assert (accio persiana50)))7 (case molt then (assert (accio persiana100)))8 )9 (retract vent)
10 )
Afegiragrave fets per realitzar les accions pertinents i esborraragrave el fet de la base de fets
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1659
33 Variables 13
33 Variables
331 Variables a CLIPS
No cal declarar una variable (ni el seu tipus) nomeacutes cal afegir un interrogant al comenccedilament drsquoun simbol
per indicar que eacutes una variableCLIPS srsquoencarrega del control de tipus depenent del que assignem a la variablePer exemple testvar correspondria a la variable testvar Si per exemple assigneacutessim lrsquoenter 3 a
testvar CLIPS tractaria la variable com una variable entera
332 Com assignar un valor a una variable
Per assignar un valor a una variable es fa servir el megravetode (bind) amb la forma
(bind ltVARIABLEgtltVALORgt)
On ltVALORgt pot ser un valor o un megravetode que retorni un valor Per exemple si volem assignar un 4 a lavariable var
(bind var 4)
O per exemple podriacuteem assignar a la variable var la suma de 2 meacutes 2
(bind var (+ 2 2))
333 iquestCoacutemo declarar variables globales
Para crear una variable global hay que meterla dentro de la construccioacuten defglobal La declaracioacuten de la
variable seguiraacute el modelo nombreVariable = expresioacutenPor ejemplo
(defglobal presupuesto = 0)
Pueden aparecer en la parte izquierda de las reglas si no son utilizadas para asignar un valor y su cambiono activa reglas pero no pueden ser paraacutemetros de funciones ni meacutetodos
334 iquestCoacutemo trabajar con variables sumando restando por ejemplo contadores
La mejor forma es con variables globales se definen asiacute (defglobal x = 0) puede ser el valor quequeramos tanto nuacutemero string Y si queremos sumarle 10 por ejemplo
(bind x (+ x 10))
Las variables locales como por ejemplo x soacutelo tienen valor mientras dura su ejecucioacuten y eso suele ser enesa misma liacutenea o en un bucle Si le damos valor a x y luego preguntamos por ella nos diraacute que no existe
335 Quina diferegravencia hi ha entre les variables del tipus nom_variable i les del tipus $nom_variable
Les primeres contenen un sol valor i les segones en poder contenir meacutes drsquoun (o cap)
336 Quegrave significa lrsquointerrogant () quan va sol
Eacutes una variable anogravenima Pots utilitzar sense posar-hi cap nom si no trsquointeressa el valor en concret Perexemple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1759
14 Capiacutetulo 3 CLIPS
(Primer filtre_preu )
Aquesta condicioacute significa ldquosi el fet (Primer filtre_preu) teacute algun valorrdquo O sigui que si tingueacutessimel fet (Primer filtre_preu ok) es compliria la condicioacute (i si en comptes de ldquookrdquo fos ldquopatatardquo tambeacute escompliria) En canvi si el fet fos uacutenicament (Primer filtre_preu) no es compliria la condicioacute
337 Quegrave significa el dogravelar ($) quan va sol
Eacutes com lrsquointerrogant perograve admet meacutes drsquoun valor Per exemple
(Primer filtre_preu $ ok)
donaragrave cert pels fets de lrsquoestil (Primer filtre_preu patata ok) (Primer filtre_preu hola ok)(Primer filtre_preu patata hola ok) (Primer filtre_preu ok) Eacutes a dir no importa els valors quehi hagi entre filtre_preu i ok si al final hi ha un ok
338 iquestComo puedo ver los hechos presentes en un momento determinado
Abriendo la Facts Window en Window de la barra de menuacute
34 Las reglas
341 iquestCoacutemo construir una regla
Para construir una regla utilizaremos la construccioacuten defrule
Sintaxis
(defrule ltnombre-reglagt [ltcomentariogt][ltdeclaracioacutengt]ltelemento-condicioacutengt Parte izquierda (LHS)
=gtltaccioacutengt) Parte dcha (RHS) de la regla
Una regla consta de un conjunto de condiciones (antecedente) tambieacuten denominados elementos condicio-nales (EC) o parte izquierda (LHS) y de un conjunto de acciones (consecuente) tambieacuten denominado partederecha de la regla (RHS) La regla se activaraacute siempre que se satisfagan todos los EC mediante hechos oinstancias que los cumplan
Si se introduce en la base de reglas una nueva regla con el mismo nombre que el de una existente la nuevaregla reemplazaraacute a la antigua
Si una regla no tiene parte izquierda es decir no tiene elementos condicionales entonces el hecho(initial-fact) actuaraacute como el elemento condicional para ese tipo de reglas y la regla se activaraacute cadavez que se ejecute un comando reset
342 iquestCoacutemo gestionar la parte izquierda (LHS) de una regla
Declarar hechosSi no se especifica ninguna condicioacuten la regla se activaraacute siempre Una condicioacuten puede ser un simple hecho
(Ej vegetariano) o un hecho ordenado con unos valores concretos (Ej (persona (nombre Juan))) Si loque queremos es obtener el valor de un hecho insertaremos una variable en su lugar (Ej (persona (nombre
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1859
34 Las reglas 15
n)) ) Entonces entraraacute en la regla para cada valor posible que pueda asignar a la variable n a partir delos hechos
Si queremos indicar cualquier valor utilizaremos el siacutembolo y para cualquier lista el siacutembolo $ (Ej(evento ) (estilo $) ) Tambieacuten existe la opcioacuten de guardar en una variable una referencia al objetoEllo se consigue poniendo var lt- a su izquierda (Ej p lt- (persona (nombre Juan))) Se puede usarpor ejemplo para pasaacuterselo de paraacutemetro a una funcioacuten llamada en la RHS
Establecer condiciones
Ademaacutes podemos especificar restricciones adicionales sobre los valores que puede tomar un campo de unhecho Existen tres tipos principales de restricciones Conectadas (por orden de precedencia o prioridad)
not (~) Evita que cierto campo cumpla determinada restriccioacuten
and (amp) Combina dos restricciones conjuntivamente
or (|) Combina dos restricciones disjuntivamente
De predicado () Obliga a que cierto campo cumpla determinada condicioacuten (especificada por el predicado)
Por valor devuelto por una funcioacuten = Permite llamar a una funcioacuten y utilizar el valor devuelto pararestringir el valor que pueda tomar un campo de un hecho
Se puede comprobar si se cumple una determinada condicioacuten mediante el constructor test Dentro detest se pueden hacer llamadas a cualquier funcioacuten o predicado ya sea primitiva de CLIPS o definidapor nosotros
Combinar elementos
Los diferentes elementos de la parte izquierda van impliacutecitamente unidos mediante una AND que indicaconjuncioacuten No obstante podemos hacerlo expliacutecitamente mediante (and (cond1) (cond2)) aunque suelen
utilizarse para anidar ANDs dentro de ORsOR Sirve para hacer una disyuncioacuten (or (cond1) (cond2)) Es equivalente a escribir varias reglas en lasque cada una de ellas tenga uno de los componentes del OR en su parte izquierda y la misma parte derecha
NOT Sirve para detectar si no existe un determinado hecho (Ej (not (estilo sibarita)))exists Cuando a un conjunto de elementos se le antecede exists se comprueba que hay al menos un
hecho en la base de hechos que cumpla la condicioacuten (Ej (exists(bebida precio (ltprecio 5))) )forall Permite comprobar si todos los hechos que satisfacen un determinado patroacuten cumplen una serie
de condiciones (Ej (forall(plato (estilo moderno)))
343 iquestCoacutemo obtener la direccioacuten de hechos o instancias situados en LHS
En algunas ocasiones vamos a necesitar realizar alguacuten tipo de accioacuten en la parte derecha de las reglassobre hechos o instancias que cumplan unas determinadas condiciones Pero para ello necesitaremos primerotener acceso a estos elementos para despueacutes poder operar sobre ellos Esto lo conseguiremos guardando ladireccioacuten del elemento en una variable hacieacutendolo del siguiente modo
variable_direccion lt- (elemento)
Pongamos un ejemplo para ver realmente el funcionamiento y uso de esta posibilidad que CLIPS nosofrece
1 (defrule imprime-area2 instancia lt- (object (is-a Rectangulo))3 =gt4 (printout t Area del rectangulo (instance-name instancia)5 (send instancia calcula-area) crlf)6 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1959
16 Capiacutetulo 3 CLIPS
Cuando se ejecuta esta regla se imprimiraacuten las aacutereas de todas las instancias de la clase Rectangulo Enla parte izquierda de la regla lo que hacemos es guardar en la variable instancia la direccioacuten de la instanciade Rectangulo que estamos tratando en ese momento La regla se ejecutaraacute para todas las instanciasalmacenadas en la memoria de trabajo que cumplan la condicioacuten (is-a Rectangulo) es decir para todaslas instancias de la clase Rectangulo En la parte derecha de la regla donde se ejecutan las acciones podemosver que se imprimiraacute para cada instancia lo siguiente Area del rectangulo [nombre_instancia] aacuterea
del rectaacutengulo La funcioacuten instance-name nos devuelve el nombre de la instancia que le pasamos porparaacutemetro Ademaacutes hemos llamado al gestor de mensajes calcula-area para que nos devuelva el area delrectaacutengulo
344 iquestCoacutemo hacer sentencias or en la izquierda de las reglas
Con (or ) Si por ejemplo tenemos dos hechos (a) y (b) y queremos ejecutar la derecha de la reglacuando se cumpla uno de los dos tendremos que hacer (or (a) (b)) Atencioacuten porque la parte derecha seejecutaraacute tantas veces como veces se cumpla cada uno de los hechos si para nosotros existe tanto (a) como(b) la parte derecha se ejecutaraacute dos veces Para que soacutelo se usa una vez podemos hacer combinaciones de
or y and (funciona igual) o usar un patroacuten por ejemplo (persona Juan|Pedro) soacutelo se ejecutariacutea una vez
345 Com afegir una condicioacute a la part esquerre drsquouna regla
A vegades eacutes necessari que una regla srsquoinstanciiuml si es produeix una condicioacute especial (i no un fet) Per feraixoacute farem servir la comanda (test ltCONDICIOgt)
Per exemple imaginem que la nostre base de fets compte amb un fet (preu valor) amb un preudeterminat Imaginem que volem una regla que srsquoinstanciiuml quan aquest valor eacutes meacutes gran que 30
Per fer-ho fent servir tot el que hem explicat
1 (defrule preucar2 (preu preu)3 (test (gt preu 30))4 =gt5 (printout t El preu es mes gran que 30)6 )
Eacutes a dir si el preu eacutes meacutes gran que 30 srsquoimprimiragrave un missatge per pantallaAquestes condicions poden contenir ANDs i ORs de varies condicionsPer exemple
1 (defrule preulimit2 (preu preu)3 factminim lt- (preuminim minim)4 factmax lt- (preumaxim maxim)5 (test (and (gt preu minim) (lt preu maxim) ))6 =gt7 (retract factminim)8 (retract factmax)9 (printout t El preu estagrave dintre del rang)
On comprovarem si el preu estagrave dintre drsquoun rang determinat i en aquest cas esborra els fets que contenen
el magravexim preu i el miacutenim preu i mostra un missatge per pantalla
346 Puede una misma regla ejecutarse maacutes de una vez
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2059
34 Las reglas 17
Es muy importante entender que cada regla se ejecutaraacute una vez por cada combinacioacuten de valores en suLHS
1 (defrule regla2 (color col)3 (peso pes)4 =gt5
Si tengo tres colores y dos pesos asertados la regla se ejecutaraacute 6 veces una con cada combinacioacuten decolor y peso
347 Com puc definir lrsquoordre de les regles
La idea drsquoun sistema basant en regles eacutes no definir un ordre lineal drsquoaquestes (costa deixar de pensar de
forma iterativa)En el cas de necessitar que una regla srsquoexecuti despreacutes drsquouna altre pots fer servir Fets la regla anteriorcrea un fet que la segona regla tindragrave a la part esquerra
1 (defrule pregunta12 =gt3 (assert (pregunta1Feta))4 5 )6
7 (defrule pregunta2
8 (pregunta1Feta)9 =gt
10 11 )
I finalment pots usar la propietat salience Aquesta propietat indica la prioritat drsquoexecucioacute de les regles( les regles amb salience majors srsquoexecutaran abans ) Pot prendre valors positius i negatius entre -10000 y+10000 Per defecte les regles tenen salience 0
1 (defrule pregunta12 (declare (salience 2))3 =gt4 5 )6
7 (defrule pregunta28 (declare (salience 1))9 =gt
10 11 )
El valor indicado en la propiedad salience puede ser el nuacutemero directamente o una expresioacuten por ejemplovariable10 podemos usar variable para elegir que regla se ejecutaraacute
Las prioridades deben ser usadas solo para determinar el orden en el que se disparan algunas reglas sobreotras no para fijar el flujo de control ya que la principal ventaja de un sistema basado en reglas es larepresentacioacuten declarativa del conocimiento y de esta forma abusando de las prioridades conduce a unsistema procedimental
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2159
18 Capiacutetulo 3 CLIPS
348 Com forccedilar que una regla sigui la primera
Per que aquesta regla sigui la primera ha de tenir el salience meacutes gran de totes
1 (defrule presentacio2 (declare (salience 20))3 =gt4 (printout t ------ Benvingut ----- crlf)5 )
349 Vull guardar certs valors que es fan servir durant lrsquoexecucioacute de diferents regles Com hopuc fer
Tens principalment dues alternatives Si el valor eacutes un tipus bagravesic pots fer servir una variable global ambla sintaxi seguumlent
(defglobal nom_variable = valor)
Aquesta sentegravencia no va a dins de cap funcioacute ni regla es posa sola a la part que creguis convenient delcodi Vegem un exemple
(defglobal preu_minim_primer = 1000)
Per fer-la servir es fa exactament de la mateixa manera que amb una variable normal perograve has de posarels dos asteriscs Per exemple
(bind preu_minim_primer curr-preu)
Per altra banda si el valor o valors que vols guardar han de ser instagravencies una bona estrategravegia pot serutilitzar un deftemplate Eacutes uacutetil sobretot per anar guardant solucions temporals o llistes drsquoelements quepoden formar part de la solucioacute
Per utilitzar-ho has de seguir els passos seguumlents
1 Definir el deftemplate
(deftemplate nom_del_deftemplate(multislot nom_multislot)
(slot nom_slot)
)
Amb un exemple es veuragrave meacutes clar
(deftemplate llista-plats(multislot primers)(multislot segons)(multislot postres)
)
2 Inicialitzar el deftemplate
(defrule[condicions vagraveries] La condicioacute base eacutes que llista-plats no srsquoha inicialitzat encara
(not (llista-plats))=gt
llista conteacute els valors de llista-plats (que de moment estan buits)(bind llista (assert (llista-plats)))
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2259
35 Las clasesinstancias 19
3 Assignar-li valors
(bind segons_plats (find-all-instances ((plat Plat)) TRUE)(modify llista (segons segons_plats))
4 Recuperar els valors
(defrule[condicions vagraveries]llista lt- (llista-plats (segons $segons_plats))
=gt
Ara la variable $segons_plats conteacute tots els elements de segons
35 Las clasesinstancias
351 Tengo que representar la jerarquiacutea de un frame iquestEs preferible antildeadir las subclases a laontologiacutea o bien diferenciarlas mediante un slot en la superclase
Las dos formas son vaacutelidas pero es recomendable representarlas en clases separadas cuando se vayan abuscar instancias de ese tipo ya que asiacute no tendremos que hacer un recorrido por todas las de la superclaseNo obstante si soacutelo se trata de una caracteriacutestica puntual del frame y no vamos a hacer buacutesquedas de unaexclusiva subclase entonces seraacute maacutes eficiente antildeadir un slot debido a su mejor accesibilidad
352 iquestQueacute es un objeto
Podriacuteamos decir que un objeto es un hecho no ordenado con herencia
353 iquestPorqueacute usar objetos en contexto de la praacutectica de CLIPS de IA
Como bien sabemos una parte de la praacutectica de SBCrsquos consisten en crear la ontologiacutea Esta ontologiacutease exporta para poder interactuar con CLIPS en formato pins y pont El archivo pont contendraacute ladeclaracioacuten de todas las clases creadas previamente por Protege (defclass ) El archivo pins contendraacute
todas las instancias de las clases declaradas en el archivo pont Como puede intuir el lector se necesitaraacuteinteractuar con los objetos previamente creados por Protegravegegrave
354 Como se definen las clases
Para definir las clases usaremos el constructor defclass
(defclass ltnombregt [ltcomentariogt](is-a ltnombre-de-superclasegt)[(role concrete | abstract)]
[(pattern-match reactive | non-reactive)]ltslotgt definicioacuten de los atributos de la clase
ltdocumentacioacuten-handlergt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2359
20 Capiacutetulo 3 CLIPS
En caso de desear que la nueva clase herede las propiedades de otra ya existente el nombre de esta deberaacuteespecificarse despues de is-a El rol determinaraacute si la clase es concreta (se puede instanciar) o abstracta(destinada a ser superclase) El pattern-match debe declararse como reactivo si se desea que las instanciasde la clase puedan unificar con los elementos objeto de las reglas (siacutembolo lt-) Los slots correspondena los atributos de la clase y los handlers a las funciones de eacutesta Los handlers se pueden declarar en ladeclaracioacuten de la propia clase pero se deben definir externamente Dado que no aporta ninguna ventaja
declararlos es recomendable definirlos directamente Noacutetese que todo aquello que estaacute entre corchetes ([])constituye informacioacuten adicional que no es obligatorio especificar
1 (defclass Persona2 (is-a Ser_Vivo)3 (role concrete)4 (single-slot edad5 (type INTEGER)6 (range 1 99)7 (cardinality 0 1)8 (create-accessor read-write)9 )
10 (multislot amigos11 (type INSTANCE)12 (allowed-classes Persona)13 )14 )
El comportamiento y declaracioacuten de los slots es ideacutentico al de los slots de los hechos ordenados Losatributos de tipo INSTANCE (referencian otras instancias) estan en formato INSTANCE-NAME
355 Com consulto una instagravencia a partir drsquouna regla
Podem fer servir la part esquerre drsquouna regla per trobar instagravencies Lrsquouacutes eacutes molt semblant a trobar elpunter a un fet fent servir
(object [(is-a ltNOM_CLASSEgt)|(name ltNOM_INSTANCIA)|(ltNOM-SLOTgt ltVALORVARIABLE))])
Per exemple si volem que una regla srsquoinstanciiuml si tenim instanciat un plat de la classe Plat podriem ferservir
1 (defrule tenimplat2 plat lt- (object (is-a Plat))3 =gt4 (print t (send plat get-nom) crlf)
La regla imprimiragrave el nom del plat que trobi Eacutes important notar que srsquoactivaragrave per cada instagravencia de platque tinguem a la base de coneixement
Podem consultar els valors de la instancia fent servir condicions a la part esquerre de la regla Per exemplesi nomeacutes volgueacutessim els plats amb un preu meacutes gran que 30
1 (defrule platCar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Srsquoactivaragrave per tots els plats amb un preu major a 30
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2459
35 Las clasesinstancias 21
Srsquoha drsquoanar amb cura per aquest tipus de regla ja que si la base de coneixement eacutes molt amplia pot acabarderivant amb problemes de memograveria
Per exemple si en comptes de preguntar per una instagravencia de Plat pregunteacutessim per dues instancies dePlat
1 (defrule platsCars2 plat1 lt- (object (is-a Plat) (Preu p1))3 plat2 lt- (object (is-a Plat) (Preu p2))4 (test (gt p1 30))5 (test (gt p2 30))6 =gt7 (print t (send plat1 get-nom) i (send plat1 get-nom) soacuten cars8 crlf)9 )
Faria unificacioacute amb totes les combinacions possibles (amb repeticions) de dos plats de tota la base deconeixement Aixograve es podria anar ampliant fins fer-se intractable
Si tenim drsquoalguna manera el nom de la instancia podem fer
1 (defrule platPicant2 (cuina (plat p))3 (object (name p) (picant pi))4 =gt5 (print t picant pi crlf)6 )
Aixoacute es pot servir per crear condicions que facin servir noms drsquoinstancies que tenim almacenats a slotsdrsquoaltres instancies per exemple
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send v get-Preu) crlf)6 )
Aquesta regla imprimiria el preu del vi asociat al plat si es negre
356 Tengo problemas en condiciones de reglas con slots de instancias obtenidos con send
A veces dan problemas las reglas en las que las condiciones sobre los valores de los slots de una instanciase escriben usando mensajes get sobre los atributos de una instancia en lugar de utilizar patrones paraobtenerlos por ejemplo la regla
1 (defrule platcar2 plat lt- (object (is-a Plat) )3 (test (gt (send plat get-Preu) 30))4 =gt5 (print t (send plat get-nom) es car6 crlf)7 )
No funciona correctamente en CLIPS pero la regla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2559
22 Capiacutetulo 3 CLIPS
1 (defrule platcar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Siacute lo haceEn el caso de que el valor del slot sea booleano se puede escribir la regla como
1 (defrule platpicant2 plat lt- (object (is-a Plat) (Picant TRUE))3 =gt4 (print t (send plat get-nom) es picant crlf)
En el caso de que el slot sea a su vez una instancia se puede utilizar para obtener los valores de estainstancia en la condicion como se explica en la pregunta anterior
357 Tengo problemas con instancias obtenidas del slot de otra instancia en el patroacuten de unaregla
Este problema aparece cuando el patron de una regla instancia una variable a un nombre de instancia yesta no esta definida en el modulo de la regla por ejemplo si la regla siguiente pertenece a un modulo queno es el de la instancia
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4
=gt5 (print t preu (send v get-Preu) crlf)6 )
La regla se quejaraacute de que la instancia no existe al enviarle el send ya que solo se busca la instancia dentrodel moacutedulo de la regla y no en los importados Para arreglar esto se puede usar la funcioacuten (instance-address[ltMODULOgt|] ltINSTANCIAgt) que busca la direccion de la instancia en un modulo concreto o en todos losmoacutedulos que se importan () Deberiacuteamos entonces escribir la regla
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send (instance-address v) get-Preu) crlf)6 )
358 iquestCoacutemo realizar una buacutesqueda de instancias que cumplan unas restricciones
CLIPS nos ofrece varias funciones de buacutesqueda de instancias que cumplan unas determinadas restriccionesque a nosotros nos interese
La funcioacuten find-instance Esta funcioacuten devuelve la primera instancia que cumple todas las restric-ciones indicadas
La funcioacuten find-all-instances Esta funcioacuten devuelve todas las instancias que cumplen las restric-ciones indicadas
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2659
35 Las clasesinstancias 23
La sintaxis de ambas funciones es igual exceptuando el nombre de la funcioacuten(find-all-instances (clase_instancias) (restricciones))A continuacioacuten se muestran varios ejemplos
(bind rectangulos (find-all-instances ((inst Rectangulo)) (gtinstaltura 10))) Des-pueacutes de ejecutar esta funcioacuten en la variable rectangulos habraacute una lista con todas las instancias de la
clase Rectangulo cuya altura sea superior a 10(bind rectangulos (find-all-instances ((inst Rectangulo)) (and (gtinstaltura 10) (=instanchura 7)))) Este trozo de coacutedigo hace que en la variable rectangulos se guarde una listade las instancias de la clase Rectangulo que tienen una altura superior a 10 y una anchura igual a 7
Estas funciones que CLIPS nos ofrece tienen otra funcionalidad y es que podemos realizar buacutesquedas deconjuntos de instancias
(bind rectangulos (find-all-instances ((a Rectangulo) (b Rectangulo)) (= aalturabaltura))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas de instancias de laclase Rectangulo que tienen la misma altura
Por uacuteltimo es necesario comentar que se pueden realizar buacutesquedas de conjuntos de instancias que seande distintas clases
(bind figuras (find-all-instances ((rect Rectangulo) (circ Circulo)) (= rectalturacircradio))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas ltrectangulocirculogtque cumplan que la altura del rectaacutengulo sea igual al radio del ciacuterculo
Existen maacutes comandos para obtener instancias pero son menos utilizadas a nivel baacutesico como pueden serany-instancep do-for-instance do-for-all-instances y delayed-do-for-all-instances
359 iquestCoacutemo se interactuacutea con objetos
La interaccioacuten con objetos se efectuacutea mediante lo que se denomina mensaje
(defmessage-handlerltnombre-clasegtltnombre-mensajegt[lttipo-handlergt] [ltcomentariogt]ltparaacutemetrogt [ltparaacutemetro-comodiacutengt])ltaccioacutengt
)
Un gestor de mensajes consta de 7 partes
1 Nombre de clase a la que el gestor estaraacute asociado
2 Nombre del mensaje
3 Tipo de gestor (Nosotros habitualmente usaremos primary que viene por defecto)
4 Comentario (opcional)
5 Lista de paraacutemetros6 Paraacutemetro comodiacuten (para gestionar muacuteltiples paraacutemetros)
7 Secuencia de acciones o expresiones que seraacuten ejecutadas por el gestor
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2759
24 Capiacutetulo 3 CLIPS
Enfocado a la praacutectica de CLIPS la maacutes comuacuten es que queramos interactuar con objetos para
1 Imprimir los objetos Un ejemplo
1 (defmessage-handler avion imprimir-beneficio ()
2 Para implementar funciones calculadas asociadas al objeto Un ejemplo
1 (defmessage-handler avion calcular-beneficio ()2 ( selfplazas-ocupadas selfprecio-billete))3 )
Como se puede observar el paraacutemetro impliacutecito self contiene la instancia activa para este mensaje
3510 iquestComo se interactuacutea con las instancias de los objetos
Podremos interactuar entre las instancias de los objetos mediante la funcioacuten send
(send ltexpresioacuten-de-objetogtltnombre-de-mensajegtltexpresioacutengt)Donde se toman como argumentos el objeto destino del mensaje el mensaje mismo y otros paraacutemetros
que debieran ser pasados a los gestoresParticularmente en el aacutembito de la praacutectica usualmente necesitaremos utilizar el envioacute de mensajes de
tipo get put and delete Estos mensajes tiene la siguiente sintaxis
get-ltnombre-atributogt
put-ltnombre-atributogt
delete
Aquiacute tenemos un ejemplo de como utilizarlo recordando que ponemos entre corchetes la instancia la cualse enviacutea el mensaje
(defclass avion (is-a USER)(role concrete)(slot precio-billete (create-accessor read) (default 34))(slot plazas-ocupadas (create-accessor write) (default 0)))
Clase creada
gt(make-instance a of avion) Creacioacuten de una instancia de avion[a]
gt(send [a] get-precio-billete) Obtencioacuten de un slot34 Resultado obtenidogt(send [a] put-plazas-ocupadas 100) Modificacioacuten de un slotgt(send [a] delete) Eliminacioacuten de la instanciaTrue
3511 Uso de make-instance
Cuando queremos crear una instancia de una clase para ir rellenandola con los resultados o datos quevayamos obteniendo se haria lo siguiente
(bind variable_instancia (make-instance nombre_instancia of nombre_clase))
Una vez creada podemos jugar con dicha instancia en las diferentes reglas siempre que la llamemos enlos activadores
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2859
35 Las clasesinstancias 25
(defrule reglavar_instancia lt- (object (is-a nombre_clase))=gt
)
De esta manera dentro de la regla podemos hacer acciones con la instancia por ejemplo(send var_instancia put-articulo articulo_ejemplo)
3512 Como generar automaacuteticamente nombres de instancia
En ocasiones queremos crear instancias en reglas y queremos que su nombre sea distinto del de otrasque ya tenemos Para ello podemos utilizar las funciones gensym y gensym La primera genera un siacutembolodel estilo genN donde N es un nuacutemero La segunda hace lo mismo pero aseguraacutendose de que ese siacutembolono exista ya Se puede reiniciar el contador que usan estas dos funciones con el operador (setgen ltnumgt)donde ltnumgt es el nuacutemero por el que queremos que empiecen ahora los siacutembolos
Para usar esto para generar el nombre de una instancia podemos hacer
(make-instance (gensym) of ltclasegt)
Cada vez que se ejecute se generaraacute un nombre de instancia nuevoSi creamos instancias de diferentes clases y queremos que las instancias tengan nombres que podamos
identificar podemos concatenar siacutembolos a los siacutembolos generados por gensym por ejemplo
(make-instance (sym-cat pepe- (gensym)) of ltclasegt)
generaraacute una instancia con el nombre pepe-genN
3513 Com fer un getset drsquoun slot drsquouna classe
Per consultar el valor drsquoun slot drsquouna classe ho podem fer enviant-li un missatge de la seguumlent manera
(send ltVARIABLEgt get-ltNOM_ATRIBUTgt)
Per exemple si tenim una instagravencia de la classe Plat ( instancia ) i volem saber el valor del seu slotnom
(send instancia get-nom)
Per assignar un valor a un slot drsquouna drsquoinstagravencia hem drsquoenviar-li un missatge de la seguumlent manera
(send ltVARIABLEgt put-ltNOM_ATRIBUTgt ltVALORgt)On ltVALORgt pot ser un valor o un megravetode que retorni un valor
(send instancia put-nom nom)
3514 iquestCoacutemo acceder a una instancia cuyo nombre conocemos
Si conocemos el nombre de una instancia y necesitamos acceder a ella es decir necesitamos enviarle alguacutenmensaje mediante la funcioacuten send podemos hacerlo directamente escribiendo en lugar de la variable quealmacena la instancia el nombre de la instancia entre corchetes [ ] A continuacioacuten se muestra un ejemplo
(bind altura_rect1 (send [rect1] get-altura))
En este caso se guardaraacute en la variable altura_rect1 el valor de la altura de la instancia que tiene comonombre rect1
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2959
26 Capiacutetulo 3 CLIPS
3515 Obtenir el nom drsquouna classe
Si tenim una instagravencia drsquouna classe i volem saber el nom de la classe (uacutetil si tenim una bona taxonomiade classes) ho podem fer amb el megravetode (class ltINSTANCIAgt)
Si per exemple imaginem que tenim la classe Actor la qual teacute com subclasses la classe APrincipalASecundari i ACameo Imaginem que estem tractant amb instancies drsquoactors i volem saber si la instanciaque estem tractant es de la classe APrincipal
Ho hauriacuteem de fer de la seguumlent manera
(eq (class instancia) APrincipal)
Fixem-nos que APrincipal eacutes un siacutembol no un String (un truco eacutes fixar-se en que no teacute cometes) Si vol-gueacutessim comparar-ho amb un String (per exemple un String introduiumlt per lrsquousuari) ho podriacuteem transformara un String amb el megravetode str-cat
(eq (str-cat (class instancia)) Principal)
3516 Como convierto un INSTANCE-ADRESS en un INSTANCE-NAME
En alguacuten momento nos podemos encontrar con la situacioacuten de que disponemos de un puntero a unainstancia y necesitamos su nombre o lo contrario En ambos casos podemos usar la funcioacuten instance-nameSu funcionamiento es bidireccional podemos introducirle un instance-name y nos devolveraacute un instance-adress y viceversa
1 (defrule imprimir-nombre2 estlt-(object (is-a Estudiante) (edad 25))3 =gt4 (printout t (instance-name est) crlf)5
)
3517 Com iterar a traveacutes drsquoun multi-slot
El seguumlent tambeacute eacutes vagravelid com exemple de com iterar a traveacutes drsquouna llistaImaginem que tenim una instagravencia de la classe Plat a la varible (plat) la qual teacute un multi-slot drsquoinstagravencies
de la classe Ingredient Imaginem que volem imprimir per pantalla el nom drsquoaquests ingredients (slot nomde la classe Ingredient) Necessitarem iterar sobre la llista drsquoingredients
1 (bind i 1)2 (while (lt= i (length$ (send plat get-ingredients)))3 do4 (bind ingredient (nth$ i (send plat get-ingredients)))5 (printout t (send ingredient get-nom) crlf)6 (bind i (+ i 1))7 )
El megravetode (nth$ ltINDEXgtltLLISTAgt) et retorna lrsquoelement situat a INDEX de LLISTAEl megravetode (length$ ltLLISTAgt) retorna el nuacutemero drsquoelements de LLISTA
3518 Coacutemo modificarinsertarborrar valores en un multislot
Los valores de un multislot se pueden cambiar usando la funcioacuten slot-replace$ La sintaxis es la siguiente
(slot-replace$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt ltvalorgt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3059
35 Las clasesinstancias 27
Donde ltiniciogt y ltfingt son el rango de posiciones del multislot que se quiere modificar y ltvalorgtson los valores que queremos reemplazar Obviamente deberaacute haber tantos valores como posiciones hayamosindicado en el rango
Para insertar nuevos valores podemos usar la funcioacuten slot-insert$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltposgt ltvalorgt)
El valor se inserta delante de la posicioacuten indicada si la posicioacuten es mayor que la longitud del multislot secolocaraacute al final
Para borrar elementos de un multislot podemos usar la funcioacuten slot-delete$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt)
Se borraraacuten los elementos que estaacuten en el rango indicado
3519 Coacutemo recorrer un atributo multievaluado
Supongamos que la variable respuesta tiene una lista de instancias
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 aquiacute hacemos lo que queramos4 )5 )
Loop-for-count funciona como un for primero la variable que haraacute de contador luego el valor de origeny luego el valor final Para controlar el final usamos la funcioacuten que he explicado antes i tomaraacute valoresdesde 1 hasta n asiacute que usando la funcioacuten nth$ obtendremos cada uno de los elementos La variable auxiraacute teniendo cada uno de los valores
3520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz)
Es igual que antes pero con dos bucles
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 (bind aux2 (send aux get-slot_que_queremos))4 (loop-for-count (j 1 (length$ aux2)) do5 (bind aux_final (nth$ j aux2))6 aquiacute ya podemos trabajar con el elemento en concreto7 )8 )
Supongamos que respuesta tiene una lista de instancias con el primer bucle haremos lo mismo que antes ir
iterando por esas instancias Una vez que tenemos cada instancia con aux2 con el segundo bucle iteraremosdentro de sus instancias interiores
Por ejemplo si tenemos varios equipos de fuacutetbol y cada equipo tiene varios jugadores en el primer bucleestamos iterando entre los equipos y en el segundo entre los jugadores de cada equipo en particular
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3159
28 Capiacutetulo 3 CLIPS
3521 Com puc esborrar una instagravencia
Per esborrar una instagravencia (per exemple segons la informacioacute que proporcioni lrsquousuari podem deduir queuna segraverie drsquoinstagravencies eacutes impossible que es facin servir per a la solucioacute) ho podem fer enviant un missatgedelete a la instagravencia eacutes a dir (send ltINSTANCIAgtdelete)
(send inst delete)
Un megravetode que podria ser uacutetil de la cara a la pragravectica podria ser el seguumlent
1 (defrule elimina-instancia2 (declare (salience 10))3 elimina-fact lt- (elimina-inst inst)4 =gt5 (send inst delete)6 (retract elimina-fact)
Imaginem que per exemple que volem eliminar una llista drsquoinstagravencies Per eliminar-les podriacuteem recoacuterrerel llistat marcant les instagravencies que volem esborrar afegint el seguumlent fet
(assert (elimina-instancia inst))
Aixiacute com que elimina-instancia teacute un salience alt esborraria les instagravencies marcades quan tingueacutes ocasioacuteDrsquoaquesta manera ens estalviem el problema de recoacuterrer un llistat drsquoinstagravencies amb un iterador mentre
anem eliminant els elements de la llista cosa que pot donar problemes amb lrsquoiterador
3522 Com imprimir una instagravencia
Per imprimir una classe (uacutetil per exemple per mostrar el resultat final) el millor eacutes definir message-handlersPer exemple imaginem que tenim una classe Plat la qual teacute un slot nom de tipus String Si volgueacutessimimprimir per pantalla un missatge que digueacutes
El nom del plat eacutes ndashltnom del platgtndash
Hauriacuteem de definir un message-handler que simplement imprimiacutes per pantalla el valor de lrsquoslot de laforma
(defmesssage-handler ltCLASSNAMEgt ltMESSAGENAMEgt primary ()ltCODIgt
)
Per el cas de lrsquoexemple
1 (defmessage-handler Plat print primary ()2 (printout t -- selfnom --) )3 )
Per cridar-ho nomeacutes caldragrave enviar-li un missatge a la instagravencia amb el nom del message-handler (enaquest cas print)
(send instancia print)
Un message-handler pot cridar a altres message-handlers amb el que es poden encadenar diverses instagraven-cies Per exemple imaginem que tenim la classe Menuacute la qual teacute un atribut plats que eacutes un llista drsquoinstagravenciesde la classe Plat Dintre del message-handler menuacute podriacuteem iterar a traveacutes de la llista de plats enviant elmissatge print que hem definit anteriorment
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3259
36 Programacioacuten 29
3523 Com es navega entre instagravencies relacionades
Per exemple tinc una instagravencia iA que teacute un slot anomenat slotB que eacutes una instagravencia drsquoun frame B Vullsaber el nom de la instagravencia associada al slotB de iA Ho pots fer aixiacute
(bind B (send iA get-slotB))(bind res (send B get-nom))
Si estagraves dins drsquouna condicioacute ho pots simplificar de la forma seguumlent
(bind res (send iAslotB get-nom)
Els dos punts soacuten equivalents al punt de Java
36 Programacioacuten
361 Com introduir un comentari
Els comentaris a CLIPS va darrere de un com per exemple
Comentari
Tambeacute podem afegir comentaris a les nostres regles deffacts deftemplates etc Generalment van darrereel nom de la estructura per exemple
1 (defrule neteja regla per la qual si la cuina estagrave bruta srsquoafegiragrave una tasca de2 neteja
3 (estat-cuina bruta)4 =gt5 (assert (tasca netejar))6 )
362 Referenciar el valor null a CLIPS
Per referenciar el valor null a clips es fa amb el simbol nil Per exemple si volem saber si una instagravenciainst es null ho podriacuteem fer de la seguumlent manera
(eq inst nil)
363 Formas de recorrer una lista
Para recorrer una lista disponemos de diferentes opciones en este FAQ explicaremos como crear unaestructura tipo ldquoWHILErdquo y tipo ldquoFORrdquo
1 While Esta regla se ejecuta hasta que la expresioacuten a evaluar sea falsa Este tipo de estructura se rigepor seguir la sintaxis while - do y se construiriacutea de la siguiente forma
(while ltexpresioacutengt[do] ltaccioacutengt)
Doacutende dependiendo del valor de ltexpresioacutengt
Valor TRUE Se realizaraacute la accioacuten ltaccioacutengt i se volveraacute a evaluar ltexpresioacutengt
Valor FALSE No se ejecutaraacute la accioacuten ltaccioacutengt
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3359
30 Capiacutetulo 3 CLIPS
2 For Esta regla sirve para ejecutar un bucle N (final - inicio) veces Este tipo de estructura se rige porseguir la sintaxis loop-for-count y se construiriacutea de la siguiente forma
(loop-for-count (ltvargtltiniciogtltfinalgt) [do] ltaccioacutengt)
Doacutende
ltvargt Variable que se usara como iacutendice
ltiniciogt Valor inicial que tendraacute ltvargt
ltfinalgt Ultimo valor que tendraacute la variable ltvargt
ltaccioacutengt Accioacuten que es realizaraacute hasta que ltvargt tenga el valor de ltfingt
364 Formas de elegir una opcioacuten
En este apartado explicaremos como crear una estructura if y una estructura switch
If Este tipo de estructura se rige por seguir la sintaxis if - then - else y se construiriacutea de lasiguiente forma
(if ltexpresioacutengtthen ltaccioacutengt[else ltaccioacuten2gt])
Doacutende dependiendo del valor de ltexpresioacutengt
bull Valor TRUE Se realizaraacute la accioacuten ltaccioacutengtbull Valor FALSE Se realizaraacute la accioacuten ltaccioacuten2gt (en caso de haber)
Switch Este tipo de estructura se rige por seguir la sintaxis switch - opciones y se construiriacutea dela siguiente forma
(switch ltexpresioacuten-testgt(case OPCION1 then ACCION1)(case OPCION2 then ACCION2)
([default] ACCION-DEFAULT)
)
Doacutende dependiendo del valor de ltexpresioacuten-casegt se ejecutaraacute una ltaccioacutengt en particular Si nin-guna ltopcioacutengt es correcta se ejecutara la ltaccioacuten-defaultgt
365 Funciones con la clase String
Habitualmente trabajaremos con Strings o cadena de Strings CLIPS proporciona una serie de herramien-tas para trabajar con esta clase
1 Convertir string a MAYUacuteSCULAS A veces es conveniente tener todos los caracteres en mayuacutesculaspara no tener problemas de comparaciones o simplemente por convenio Para ello CLIPS dispone dela funcioacuten upcase la cual convierte a mayuacutesculas un siacutembolo o string
(upcase ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplos
(upcase Ccedillips es divertido) rarr CcedilLIPS ES DIVERTIDO
(upcase Clips_es_divertido) rarr CLIPS_ES_DIVERTIDO
2 Convertir string a MINUacuteSCULAS la funcioacuten es downcase
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3459
36 Programacioacuten 31
3 Concatenacioacuten de strings Tambieacuten es de gran utilidad poder juntar dos o maacutes paraacutemetros en un solostring Todo paraacutemetro a juntar deben ser de uno de los siguientes tipos symbol String integer floato instance-name
(str-cat parametro1 parametro2 parametroN )
Ejemplo
(str-cat IA nota 10) rarr IAnota10
4 Comparacioacuten de strings Funcioacuten que nos indica si dos strings son iguales
(str-compareltexpresioacuten-simboacutelica-o-de-cadenagtltexpresioacuten-simboacutelica-o-de-cadenagt
)
Esta funcioacuten devuelve
0 Si ambos strings son iguales1 Si el primer string es mayor que el segundo string-1 Si el primer string es menor que el segundo string
5 Longitud de un string Muchas veces es de gran utilidad saber que tamantildeo tiene un string
(str-length ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplo
(str-length Inteligencia Artificial) rarr 23
366 iquestCoacutemo obtener el contenido de una variable en un string
Para conseguir un string a partir de un integer float symbol instance-name debes utilizar el comandostr-cat Si a la funcioacuten le pasamos como paraacutemetros varios elementos los transformaraacute a string y losconcatenaraacute La sintaxis de esta funcioacuten es la siguiente (str-cat elementos) Esta funcioacuten la usaremossobre todo cuando queramos realizar comparaciones entre el contenido de una variable y un string ya quepreviamente necesitaremos usar la funcioacuten str-cat para pasar el contenido de la variable a string y realizarde este modo la comparacioacuten de forma correcta
367 iquestComo se crea una lista
Con create$ Todos los operadores sobre listas llevan el siacutembolo $ al final Igual que con las variables sedebe usar bind siempre que se desee modificar una lista
(bind lista (create$ a b c))
368 iquestComo borro un elemento de una lista
Con delete$Usa la siguiente sintaxis(delete$ ltlistagt ltindice-iniciogt ltindice-finalgt)Se borraraacuten todos los elementos del rango entre las posiciones inicio y final ambas incluidas Tambieacuten exis-
tedelete-member$ (delete-member$ ltlistagt ltelementogt) Borraraacute todas las apariciones del elemento enla lista
(delete$ (create$ a b c d e f) 3 5) minusrarr (a b f)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 859
1 Introduccioacuten
Este documento es el resultado de la recopilacioacuten de los documentos escritos durante el desarrollo de lapraacutectica de sistemas basados en el conocimiento el cuatrimestre de otontildeo del curso 2007-2008
El objetivo de estos documentos era recoger las dudas frecuentes que se encuentra un alumno durante eldesarrollo de la praacutectica de SBCs y consejos praacutecticos que puedan ayudar en el desarrollo
Este documento recoge principalmente dudas frecuentes sobre el entorno CLIPS y su lenguaje de progra-macioacuten
5
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 959
6 Capiacutetulo 1 Introduccioacuten
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1059
2 Protegravegegrave
Para saber como funciona Protegravegegrave usad la ayuda de la aplicacioacuten y el material correspondiente estascuestiones se refieren a como integrar lo que se desarrolla en Protegravegegrave con CLIPS
21 Coacutemo cambiar el nombre de las instancias en Protegravegegrave
En realidad no se trata de cambiar el nombre de las instancias sino de darle algo maacutes visual que unnuacutemero para poder hacer las relaciones Si os encontraacuteis en la pestantildea de crear instancias el uacuteltimo botoacutenes una flecha hacia abajo Darle y luego set display slots Ahiacute debeacuteis indicar con que slot quereacuteis referenciarla instancia
22 Com exporto una ontologia de Proteacutegeacute a CLIPS
A Proteacutegeacute ves a File rarr Export to Format rarr CLIPS Un cop fet aixograve es crearan dos nous fitxers ambles classes i instagravencies de lrsquoontologia (nompont i nompins respectivament)
Despreacutes obre aquests dos fitxers amb un editor de text i copia el seu contingut al fitxer CLIPS de laseguumlent manera
copy-paste de nompont
(definstances instanciescopy-paste de nompins)
23 iquestCoacutemo exporto una ontologiacutea de Proteacutegeacute a CLIPS (2a posibilidad)
Alternativamente a hacer corta y pega de los ficheros de protege en el fichero de CLIPS se puede crearun fichero que cargue todos los ficheros sin tener que juntarlos
Para ello hay que crear un fichero que incluya las oacuterdenes de carga de los diferentes ficheros Por ejemplopodemos llamar a este fichero cargaclp El contenido de este fichero seraacute
(load PATHnompont)(load-instances PATHnompins)(load PATHfichero-de-reglasclp)
Donde PATH es el directorio donde se encuentran vuestros ficherosEste fichero se ha de cargar desde el inteacuterprete mediante la orden batch ((batch cargaclp)) o con
la opcioacuten de menuacute load batch Usando la instruccioacuten load-instances evitamos tener que antildeadir al fichero de instancias la instruccioacuten
definstances
24 Per quegrave em doacutena error CLIPS al tenir una instancia que hereta de meacutesdrsquouna classe
7
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1159
8 Capiacutetulo 2 Protegravegegrave
Proteacutegeacute permet lrsquoheregravencia muacuteltiple en instagravencies perograve CLIPS no En CLIPS nomeacutes poden tenir heregravenciamuacuteltiple las classes perograve no les instagravencies Aixoacute es aixiacute perque el lenguatge de CLIPS es orientat a objectesno es realment un lenguatge drsquoontologiacutees
La manera meacutes senzilla de simular-ho si les clases no tenen ancestres comuns eacutes tenir classes que repre-sentin aquesta heregravencia muacuteltiple i fer que les instagravencies pengin drsquoelles que es com es faria a un llenguatge
orientat a objectesEn el cas de tenir ancestres comuns no es pot fer lrsquounica manera es duplicar la instancia amb nomsdiferents i penjar-les de les clases on es vol tenir-la
De totes maneres el CLIPS permet recuperar fagravecilment les instagravencies que tenen un valor especiacutefic en unslot pel qual el meacutes senzill eacutes tenir una uacutenica jerarquia i incloure altres possibles classificacions com a slotsencara que obviament perdrem la posibilitat de fer servir una jerarquia de valors per aquest
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1259
3 CLIPS
31 Instalacioacuten del CLIPS
311 iquestCoacutemo instalar CLIPS
La herramienta CLIPS es multiplataforma y esta disponible para los tres SO maacutes utilizados MicrosoftWindows Linux y Mac OS X
iquestCoacutemo instalar CLIPS en Windows
Primero de todo debemos bajarnos el programa de la paacutegina oficial de CLIPS accesible desde este link
(httpclipsrulessourceforgenet) Desde el aacuterea de descarga os podreis bajar el instalador parawindows
iquestCoacutemo instalar CLIPS en Linux
En muchas distribuciones de Linux CLIPS esta disponible como un paquete adicional el paquete sueleinstalar la versioacuten con interfaz graacutefico Si no encuentras el paquete especiacutefico para la distribucion que usassiempre puedes compilarlo a partir del paquete con los fuentes
Tambieacuten estaacute la posibilidad de utilisar el emulador de windows WINE Una vez instalado el emulador sepuede instalar CLIPS y este funcionaacute igual que sobre windows
iquestCoacutemo instalar CLIPS en Mac OS X
Primero de todo debemos bajarnos el programa de la paacutegina oficial de CLIPS accesible desde este link(httpclipsrulessourceforgenet ) Desde el aacuterea de descarga podeis bajar el intalador para MACOS X
312 Entorn finestres VS Consola de comandes
Encara que lrsquoentorn de finestres eacutes molt meacutes intuiumltiu CLIPS a la seva versioacute en liacutenea de comandes eacutes moltmeacutes ragravepid (segurament perquegrave no ha de mostrar en tot moment lrsquoagenda de fets les instancies les regles
etc)La diferencia de velocitat eacutes molt notable en cas de problemes de rendiment o de sensacioacute que lrsquoentorn
de finestres es queda penjat (o directament es tanca sense previ aviacutes) recomanem provar la versioacute en liacuteneade comandes
32 Los hechos
321 iquestQueacute es un hecho en CLIPS
Conceptualmente un hecho representa un dato abstracto del cual almacenamos valores Se puede vercomo una lista de campos donde el primer campo hace referencia al ldquodatordquo al cual le asignamos una listade valores que le suceden teniendo una relacioacuten entre siacute
Formalmente el primer campo es un siacutembolo y los campos restantes son valores
9
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1359
10 Capiacutetulo 3 CLIPS
(siacutembolo valor1 valor2 valorN)
322 iquestQueacute es un hecho ordenado (order Facts)
Un hecho ordenado tienen formato libre por lo tanto no existe restriccioacuten alguna en el orden de los campos
Los campos de un hecho ordenado pueden ser de cualquier tipo primitivo de datos excepto el primero quedebe ser un siacutembolo Como ejemplo tenemos
1 (hermanos Antonio Javier Carlos)2 (padre Pedro David)
323 iquestQueacute es un hecho no ordenado (deftemplates facts)
A traveacutes de los hechos no ordenados podemos abstraernos de la estructura de un hecho asignado unnombre a cada campo (slots)
1 (deftemplate nombre-template comentario2 (slot nombre-slot (tipo-del-slot))3 (multislot nombre-slot (tipo-del-slot))4 )
Por ejemplo
1 (deftemplate avioacuten2 (slot nombre_avion (type STRING))3 (slot compania (type STRING))
4 (slot numero_plazas (type INTEGER) (default 100))
324 iquestPuedo tener un vector como slot
Si debe declararse como multislot
325 iquestPuedo asignar propiedades a los slots
Siacute las maacutes importantes son
Type El tipo de dato primitivo que contiene (en mayuacutesculas)
Allowed-X Permite especificar un conjunto de valores permitidos Siendo X un tipo de datos primitivo(en minuacutesculas y plural) rarr si el slot toma un valor del tipo X debe pertenecer a los valores permi-tidos X puede ser values especificando entonces todos los valores posibles que puede tomar el slotindependientemente del tipo de dato
Range Especifica un rango para slots numeacutericos
Cardinality Nuacutemeros miacutenimo y maacuteximo de elementos que puede tener un multislot
Default Valor por defecto Si ponemos NONE como valor por defecto significaraacute que no se podraacute crear la
instancia a no ser que se especifique el valor de ese slot
1 (deftemplate estudiante2 (slot edad (type INTEGER) (range 0 99))
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1459
32 Los hechos 11
3 (multislot asignaturas (type STRING) (cardinality 1 5))4 (slot num-carreres (default 1))5 (multislot notas (allowed-strings MH NP))6 )
326 iquestQueacute debo utilizar hechos ordenados o no ordenados
Como se puede intuir si tenemos un conjunto de hechos los cuales conceptualmente pertenecen al mismoaacutembito seraacute una solucioacuten maacutes elegante agruparlos a traveacutes de un deftemplate En caso que tengamos quealguacuten hecho aislado seraacute mas sencillo declararlo como un hecho ordenado
327 Fets o Objectes
Veient la definicioacute de deftemplate podem confondrersquons a lrsquohora de decidir si fer servir fets o fer servirobjectes
Deixant de banda altres diferegravencies ja comentades (les classes suporten jerarquia de classes heregravenciaetc) els objectes es fan servir per representar el coneixement (mitjanccedilant un conjunt drsquoinstagravencies)
Aixiacute que generalment farem servir classes i objectes per representar coneixement mentre que farem servirels fets per portar control sobre lrsquoexecucioacute del problema
Per exemple podriacuteem definir un deftemplate per emmagatzemar un resultat o per poder controlar lrsquoestatde lrsquoexecucioacute
A la pragravectica de Mikeo (penjada a la web de lrsquoassignatura) teniacuteem un deftemplate habitacion-actual
1 (deftemplate habitacion-actual2 (slot habitacion)3 (slot area-restante)4
(slot presupuesto-restante)5 (slot precio-total)6 (slot prioridad-actual)7 )
Amb el qual controlagravevem la construccioacute drsquouna habitacioacute Assignagravevem una instagravencia de la classe habita-cioacute al slot habitacion de habitacion-actual i mitjanccedilant una segraverie de regles que feien unificacioacute ambhabitacion-actual actuagravevem sobre lrsquohabitacioacute drsquouna manera o drsquoun altre
328 Creacioacuten de hechos (assertdeffacts)
Si queremos crear un solo hecho utilizaremos el comando assert Por ejemplo (assert (casa roja))Si por el contrario queremos crear una estructura ordenada de hechos utilizaremos deffacts
(deffacts mishechos (casa roja) (pelota azul))
329 Modificar un fet
Per modificar un fet (per exemple molt uacutetil si estem treballant amb deftemplates) ho podem fer mitjanccedilant(modify ltINSTANCIAgtltFETSgt)
Per exemple si tingueacutessim el deftemplate persona
1 (deftemplate persona2 (slot nom)3 (slot edad)4 (slot dni)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1559
12 Capiacutetulo 3 CLIPS
I hagueacutessim afegit el fet
(assert (persona (nom Pepe)(edad 25)(dni 46974431)))
I el fet
(assert (aniversari 46974431))
Podriacuteem tenir la seguumlent regla
1 (defrule aniv2 aniversari lt- (aniversari dni)3 persona lt- (persona (edat edat)(dni dni))4 =gt5 (retract aniversari)6 (modify persona (edat (+ 1 edat)))7 )
La qual srsquoactivaragrave si hi ha un fet aniversari drsquouna persona Fent servir el dni indicat al fet aniversaribusquem el fet persona que teacute el mateix dni Deixem el valor edat a la variable edat per poder treballaramb ella meacutes endavant
Hem agafat tambeacute la direccioacute del fet aniversari per tal de poder esborrar-lo de la base de fets Aixograve srsquohafet per dues raons
Primer per mantenir meacutes neta la base de fets Segon i meacutes important Com que hem canviat el fet laregla tornaragrave a fer unificacioacute amb el fet (perquegrave ara eacutes diferent) amb la regla aniversari amb el que entrariadintre drsquoun bucle sense fi on srsquoaniria incrementant lrsquoedat de la persona
Un cop hem esborrat el fet aniversari incrementem en 1 el valor del slot edat de la persona fent servirla variable edat que hem declarat a la part esquerre de la regla
El comportament de modify es fer un retract del fet a la base de fets i despreacutes fer un assert amb els nous
valors Si volem canviar mes drsquoun slot del fet es convenient canviar-los tots a la vegada La raoacute es que cadavegada que fem un modify lrsquoapuntador al fet es modifica i lrsquoapuntador que tenim a la variable que hem fetservir ja no es vagravelid
Si no temim mes remei que fer la modificacioacute del fet pas a pas srsquoha de saber que la crida a modify retornalrsquoapuntador al nou fet Si el guardem a altra variable (o a la mateixa) podrem continuar modificant el fetamb la nova referegravencia
3210 Com elimino un fet de la base de fets
Per eliminar un fet de la base de fets ho podem fer amb la paraula clau (retract ltFETgt) on ltFETgt eacutes
un punter al fetPer obtenir aquest fet ho podem fer fent servir ltVARgtlt- ltFETgt a la part esquerre de la reglaPer exemple
1 (defrule accionsvent2 vent lt- (vent tipus)3 =gt4 (switch tipus5 (case poc then (assert (accio persiana0)))6 (case normal then (assert (accio persiana50)))7 (case molt then (assert (accio persiana100)))8 )9 (retract vent)
10 )
Afegiragrave fets per realitzar les accions pertinents i esborraragrave el fet de la base de fets
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1659
33 Variables 13
33 Variables
331 Variables a CLIPS
No cal declarar una variable (ni el seu tipus) nomeacutes cal afegir un interrogant al comenccedilament drsquoun simbol
per indicar que eacutes una variableCLIPS srsquoencarrega del control de tipus depenent del que assignem a la variablePer exemple testvar correspondria a la variable testvar Si per exemple assigneacutessim lrsquoenter 3 a
testvar CLIPS tractaria la variable com una variable entera
332 Com assignar un valor a una variable
Per assignar un valor a una variable es fa servir el megravetode (bind) amb la forma
(bind ltVARIABLEgtltVALORgt)
On ltVALORgt pot ser un valor o un megravetode que retorni un valor Per exemple si volem assignar un 4 a lavariable var
(bind var 4)
O per exemple podriacuteem assignar a la variable var la suma de 2 meacutes 2
(bind var (+ 2 2))
333 iquestCoacutemo declarar variables globales
Para crear una variable global hay que meterla dentro de la construccioacuten defglobal La declaracioacuten de la
variable seguiraacute el modelo nombreVariable = expresioacutenPor ejemplo
(defglobal presupuesto = 0)
Pueden aparecer en la parte izquierda de las reglas si no son utilizadas para asignar un valor y su cambiono activa reglas pero no pueden ser paraacutemetros de funciones ni meacutetodos
334 iquestCoacutemo trabajar con variables sumando restando por ejemplo contadores
La mejor forma es con variables globales se definen asiacute (defglobal x = 0) puede ser el valor quequeramos tanto nuacutemero string Y si queremos sumarle 10 por ejemplo
(bind x (+ x 10))
Las variables locales como por ejemplo x soacutelo tienen valor mientras dura su ejecucioacuten y eso suele ser enesa misma liacutenea o en un bucle Si le damos valor a x y luego preguntamos por ella nos diraacute que no existe
335 Quina diferegravencia hi ha entre les variables del tipus nom_variable i les del tipus $nom_variable
Les primeres contenen un sol valor i les segones en poder contenir meacutes drsquoun (o cap)
336 Quegrave significa lrsquointerrogant () quan va sol
Eacutes una variable anogravenima Pots utilitzar sense posar-hi cap nom si no trsquointeressa el valor en concret Perexemple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1759
14 Capiacutetulo 3 CLIPS
(Primer filtre_preu )
Aquesta condicioacute significa ldquosi el fet (Primer filtre_preu) teacute algun valorrdquo O sigui que si tingueacutessimel fet (Primer filtre_preu ok) es compliria la condicioacute (i si en comptes de ldquookrdquo fos ldquopatatardquo tambeacute escompliria) En canvi si el fet fos uacutenicament (Primer filtre_preu) no es compliria la condicioacute
337 Quegrave significa el dogravelar ($) quan va sol
Eacutes com lrsquointerrogant perograve admet meacutes drsquoun valor Per exemple
(Primer filtre_preu $ ok)
donaragrave cert pels fets de lrsquoestil (Primer filtre_preu patata ok) (Primer filtre_preu hola ok)(Primer filtre_preu patata hola ok) (Primer filtre_preu ok) Eacutes a dir no importa els valors quehi hagi entre filtre_preu i ok si al final hi ha un ok
338 iquestComo puedo ver los hechos presentes en un momento determinado
Abriendo la Facts Window en Window de la barra de menuacute
34 Las reglas
341 iquestCoacutemo construir una regla
Para construir una regla utilizaremos la construccioacuten defrule
Sintaxis
(defrule ltnombre-reglagt [ltcomentariogt][ltdeclaracioacutengt]ltelemento-condicioacutengt Parte izquierda (LHS)
=gtltaccioacutengt) Parte dcha (RHS) de la regla
Una regla consta de un conjunto de condiciones (antecedente) tambieacuten denominados elementos condicio-nales (EC) o parte izquierda (LHS) y de un conjunto de acciones (consecuente) tambieacuten denominado partederecha de la regla (RHS) La regla se activaraacute siempre que se satisfagan todos los EC mediante hechos oinstancias que los cumplan
Si se introduce en la base de reglas una nueva regla con el mismo nombre que el de una existente la nuevaregla reemplazaraacute a la antigua
Si una regla no tiene parte izquierda es decir no tiene elementos condicionales entonces el hecho(initial-fact) actuaraacute como el elemento condicional para ese tipo de reglas y la regla se activaraacute cadavez que se ejecute un comando reset
342 iquestCoacutemo gestionar la parte izquierda (LHS) de una regla
Declarar hechosSi no se especifica ninguna condicioacuten la regla se activaraacute siempre Una condicioacuten puede ser un simple hecho
(Ej vegetariano) o un hecho ordenado con unos valores concretos (Ej (persona (nombre Juan))) Si loque queremos es obtener el valor de un hecho insertaremos una variable en su lugar (Ej (persona (nombre
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1859
34 Las reglas 15
n)) ) Entonces entraraacute en la regla para cada valor posible que pueda asignar a la variable n a partir delos hechos
Si queremos indicar cualquier valor utilizaremos el siacutembolo y para cualquier lista el siacutembolo $ (Ej(evento ) (estilo $) ) Tambieacuten existe la opcioacuten de guardar en una variable una referencia al objetoEllo se consigue poniendo var lt- a su izquierda (Ej p lt- (persona (nombre Juan))) Se puede usarpor ejemplo para pasaacuterselo de paraacutemetro a una funcioacuten llamada en la RHS
Establecer condiciones
Ademaacutes podemos especificar restricciones adicionales sobre los valores que puede tomar un campo de unhecho Existen tres tipos principales de restricciones Conectadas (por orden de precedencia o prioridad)
not (~) Evita que cierto campo cumpla determinada restriccioacuten
and (amp) Combina dos restricciones conjuntivamente
or (|) Combina dos restricciones disjuntivamente
De predicado () Obliga a que cierto campo cumpla determinada condicioacuten (especificada por el predicado)
Por valor devuelto por una funcioacuten = Permite llamar a una funcioacuten y utilizar el valor devuelto pararestringir el valor que pueda tomar un campo de un hecho
Se puede comprobar si se cumple una determinada condicioacuten mediante el constructor test Dentro detest se pueden hacer llamadas a cualquier funcioacuten o predicado ya sea primitiva de CLIPS o definidapor nosotros
Combinar elementos
Los diferentes elementos de la parte izquierda van impliacutecitamente unidos mediante una AND que indicaconjuncioacuten No obstante podemos hacerlo expliacutecitamente mediante (and (cond1) (cond2)) aunque suelen
utilizarse para anidar ANDs dentro de ORsOR Sirve para hacer una disyuncioacuten (or (cond1) (cond2)) Es equivalente a escribir varias reglas en lasque cada una de ellas tenga uno de los componentes del OR en su parte izquierda y la misma parte derecha
NOT Sirve para detectar si no existe un determinado hecho (Ej (not (estilo sibarita)))exists Cuando a un conjunto de elementos se le antecede exists se comprueba que hay al menos un
hecho en la base de hechos que cumpla la condicioacuten (Ej (exists(bebida precio (ltprecio 5))) )forall Permite comprobar si todos los hechos que satisfacen un determinado patroacuten cumplen una serie
de condiciones (Ej (forall(plato (estilo moderno)))
343 iquestCoacutemo obtener la direccioacuten de hechos o instancias situados en LHS
En algunas ocasiones vamos a necesitar realizar alguacuten tipo de accioacuten en la parte derecha de las reglassobre hechos o instancias que cumplan unas determinadas condiciones Pero para ello necesitaremos primerotener acceso a estos elementos para despueacutes poder operar sobre ellos Esto lo conseguiremos guardando ladireccioacuten del elemento en una variable hacieacutendolo del siguiente modo
variable_direccion lt- (elemento)
Pongamos un ejemplo para ver realmente el funcionamiento y uso de esta posibilidad que CLIPS nosofrece
1 (defrule imprime-area2 instancia lt- (object (is-a Rectangulo))3 =gt4 (printout t Area del rectangulo (instance-name instancia)5 (send instancia calcula-area) crlf)6 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1959
16 Capiacutetulo 3 CLIPS
Cuando se ejecuta esta regla se imprimiraacuten las aacutereas de todas las instancias de la clase Rectangulo Enla parte izquierda de la regla lo que hacemos es guardar en la variable instancia la direccioacuten de la instanciade Rectangulo que estamos tratando en ese momento La regla se ejecutaraacute para todas las instanciasalmacenadas en la memoria de trabajo que cumplan la condicioacuten (is-a Rectangulo) es decir para todaslas instancias de la clase Rectangulo En la parte derecha de la regla donde se ejecutan las acciones podemosver que se imprimiraacute para cada instancia lo siguiente Area del rectangulo [nombre_instancia] aacuterea
del rectaacutengulo La funcioacuten instance-name nos devuelve el nombre de la instancia que le pasamos porparaacutemetro Ademaacutes hemos llamado al gestor de mensajes calcula-area para que nos devuelva el area delrectaacutengulo
344 iquestCoacutemo hacer sentencias or en la izquierda de las reglas
Con (or ) Si por ejemplo tenemos dos hechos (a) y (b) y queremos ejecutar la derecha de la reglacuando se cumpla uno de los dos tendremos que hacer (or (a) (b)) Atencioacuten porque la parte derecha seejecutaraacute tantas veces como veces se cumpla cada uno de los hechos si para nosotros existe tanto (a) como(b) la parte derecha se ejecutaraacute dos veces Para que soacutelo se usa una vez podemos hacer combinaciones de
or y and (funciona igual) o usar un patroacuten por ejemplo (persona Juan|Pedro) soacutelo se ejecutariacutea una vez
345 Com afegir una condicioacute a la part esquerre drsquouna regla
A vegades eacutes necessari que una regla srsquoinstanciiuml si es produeix una condicioacute especial (i no un fet) Per feraixoacute farem servir la comanda (test ltCONDICIOgt)
Per exemple imaginem que la nostre base de fets compte amb un fet (preu valor) amb un preudeterminat Imaginem que volem una regla que srsquoinstanciiuml quan aquest valor eacutes meacutes gran que 30
Per fer-ho fent servir tot el que hem explicat
1 (defrule preucar2 (preu preu)3 (test (gt preu 30))4 =gt5 (printout t El preu es mes gran que 30)6 )
Eacutes a dir si el preu eacutes meacutes gran que 30 srsquoimprimiragrave un missatge per pantallaAquestes condicions poden contenir ANDs i ORs de varies condicionsPer exemple
1 (defrule preulimit2 (preu preu)3 factminim lt- (preuminim minim)4 factmax lt- (preumaxim maxim)5 (test (and (gt preu minim) (lt preu maxim) ))6 =gt7 (retract factminim)8 (retract factmax)9 (printout t El preu estagrave dintre del rang)
On comprovarem si el preu estagrave dintre drsquoun rang determinat i en aquest cas esborra els fets que contenen
el magravexim preu i el miacutenim preu i mostra un missatge per pantalla
346 Puede una misma regla ejecutarse maacutes de una vez
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2059
34 Las reglas 17
Es muy importante entender que cada regla se ejecutaraacute una vez por cada combinacioacuten de valores en suLHS
1 (defrule regla2 (color col)3 (peso pes)4 =gt5
Si tengo tres colores y dos pesos asertados la regla se ejecutaraacute 6 veces una con cada combinacioacuten decolor y peso
347 Com puc definir lrsquoordre de les regles
La idea drsquoun sistema basant en regles eacutes no definir un ordre lineal drsquoaquestes (costa deixar de pensar de
forma iterativa)En el cas de necessitar que una regla srsquoexecuti despreacutes drsquouna altre pots fer servir Fets la regla anteriorcrea un fet que la segona regla tindragrave a la part esquerra
1 (defrule pregunta12 =gt3 (assert (pregunta1Feta))4 5 )6
7 (defrule pregunta2
8 (pregunta1Feta)9 =gt
10 11 )
I finalment pots usar la propietat salience Aquesta propietat indica la prioritat drsquoexecucioacute de les regles( les regles amb salience majors srsquoexecutaran abans ) Pot prendre valors positius i negatius entre -10000 y+10000 Per defecte les regles tenen salience 0
1 (defrule pregunta12 (declare (salience 2))3 =gt4 5 )6
7 (defrule pregunta28 (declare (salience 1))9 =gt
10 11 )
El valor indicado en la propiedad salience puede ser el nuacutemero directamente o una expresioacuten por ejemplovariable10 podemos usar variable para elegir que regla se ejecutaraacute
Las prioridades deben ser usadas solo para determinar el orden en el que se disparan algunas reglas sobreotras no para fijar el flujo de control ya que la principal ventaja de un sistema basado en reglas es larepresentacioacuten declarativa del conocimiento y de esta forma abusando de las prioridades conduce a unsistema procedimental
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2159
18 Capiacutetulo 3 CLIPS
348 Com forccedilar que una regla sigui la primera
Per que aquesta regla sigui la primera ha de tenir el salience meacutes gran de totes
1 (defrule presentacio2 (declare (salience 20))3 =gt4 (printout t ------ Benvingut ----- crlf)5 )
349 Vull guardar certs valors que es fan servir durant lrsquoexecucioacute de diferents regles Com hopuc fer
Tens principalment dues alternatives Si el valor eacutes un tipus bagravesic pots fer servir una variable global ambla sintaxi seguumlent
(defglobal nom_variable = valor)
Aquesta sentegravencia no va a dins de cap funcioacute ni regla es posa sola a la part que creguis convenient delcodi Vegem un exemple
(defglobal preu_minim_primer = 1000)
Per fer-la servir es fa exactament de la mateixa manera que amb una variable normal perograve has de posarels dos asteriscs Per exemple
(bind preu_minim_primer curr-preu)
Per altra banda si el valor o valors que vols guardar han de ser instagravencies una bona estrategravegia pot serutilitzar un deftemplate Eacutes uacutetil sobretot per anar guardant solucions temporals o llistes drsquoelements quepoden formar part de la solucioacute
Per utilitzar-ho has de seguir els passos seguumlents
1 Definir el deftemplate
(deftemplate nom_del_deftemplate(multislot nom_multislot)
(slot nom_slot)
)
Amb un exemple es veuragrave meacutes clar
(deftemplate llista-plats(multislot primers)(multislot segons)(multislot postres)
)
2 Inicialitzar el deftemplate
(defrule[condicions vagraveries] La condicioacute base eacutes que llista-plats no srsquoha inicialitzat encara
(not (llista-plats))=gt
llista conteacute els valors de llista-plats (que de moment estan buits)(bind llista (assert (llista-plats)))
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2259
35 Las clasesinstancias 19
3 Assignar-li valors
(bind segons_plats (find-all-instances ((plat Plat)) TRUE)(modify llista (segons segons_plats))
4 Recuperar els valors
(defrule[condicions vagraveries]llista lt- (llista-plats (segons $segons_plats))
=gt
Ara la variable $segons_plats conteacute tots els elements de segons
35 Las clasesinstancias
351 Tengo que representar la jerarquiacutea de un frame iquestEs preferible antildeadir las subclases a laontologiacutea o bien diferenciarlas mediante un slot en la superclase
Las dos formas son vaacutelidas pero es recomendable representarlas en clases separadas cuando se vayan abuscar instancias de ese tipo ya que asiacute no tendremos que hacer un recorrido por todas las de la superclaseNo obstante si soacutelo se trata de una caracteriacutestica puntual del frame y no vamos a hacer buacutesquedas de unaexclusiva subclase entonces seraacute maacutes eficiente antildeadir un slot debido a su mejor accesibilidad
352 iquestQueacute es un objeto
Podriacuteamos decir que un objeto es un hecho no ordenado con herencia
353 iquestPorqueacute usar objetos en contexto de la praacutectica de CLIPS de IA
Como bien sabemos una parte de la praacutectica de SBCrsquos consisten en crear la ontologiacutea Esta ontologiacutease exporta para poder interactuar con CLIPS en formato pins y pont El archivo pont contendraacute ladeclaracioacuten de todas las clases creadas previamente por Protege (defclass ) El archivo pins contendraacute
todas las instancias de las clases declaradas en el archivo pont Como puede intuir el lector se necesitaraacuteinteractuar con los objetos previamente creados por Protegravegegrave
354 Como se definen las clases
Para definir las clases usaremos el constructor defclass
(defclass ltnombregt [ltcomentariogt](is-a ltnombre-de-superclasegt)[(role concrete | abstract)]
[(pattern-match reactive | non-reactive)]ltslotgt definicioacuten de los atributos de la clase
ltdocumentacioacuten-handlergt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2359
20 Capiacutetulo 3 CLIPS
En caso de desear que la nueva clase herede las propiedades de otra ya existente el nombre de esta deberaacuteespecificarse despues de is-a El rol determinaraacute si la clase es concreta (se puede instanciar) o abstracta(destinada a ser superclase) El pattern-match debe declararse como reactivo si se desea que las instanciasde la clase puedan unificar con los elementos objeto de las reglas (siacutembolo lt-) Los slots correspondena los atributos de la clase y los handlers a las funciones de eacutesta Los handlers se pueden declarar en ladeclaracioacuten de la propia clase pero se deben definir externamente Dado que no aporta ninguna ventaja
declararlos es recomendable definirlos directamente Noacutetese que todo aquello que estaacute entre corchetes ([])constituye informacioacuten adicional que no es obligatorio especificar
1 (defclass Persona2 (is-a Ser_Vivo)3 (role concrete)4 (single-slot edad5 (type INTEGER)6 (range 1 99)7 (cardinality 0 1)8 (create-accessor read-write)9 )
10 (multislot amigos11 (type INSTANCE)12 (allowed-classes Persona)13 )14 )
El comportamiento y declaracioacuten de los slots es ideacutentico al de los slots de los hechos ordenados Losatributos de tipo INSTANCE (referencian otras instancias) estan en formato INSTANCE-NAME
355 Com consulto una instagravencia a partir drsquouna regla
Podem fer servir la part esquerre drsquouna regla per trobar instagravencies Lrsquouacutes eacutes molt semblant a trobar elpunter a un fet fent servir
(object [(is-a ltNOM_CLASSEgt)|(name ltNOM_INSTANCIA)|(ltNOM-SLOTgt ltVALORVARIABLE))])
Per exemple si volem que una regla srsquoinstanciiuml si tenim instanciat un plat de la classe Plat podriem ferservir
1 (defrule tenimplat2 plat lt- (object (is-a Plat))3 =gt4 (print t (send plat get-nom) crlf)
La regla imprimiragrave el nom del plat que trobi Eacutes important notar que srsquoactivaragrave per cada instagravencia de platque tinguem a la base de coneixement
Podem consultar els valors de la instancia fent servir condicions a la part esquerre de la regla Per exemplesi nomeacutes volgueacutessim els plats amb un preu meacutes gran que 30
1 (defrule platCar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Srsquoactivaragrave per tots els plats amb un preu major a 30
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2459
35 Las clasesinstancias 21
Srsquoha drsquoanar amb cura per aquest tipus de regla ja que si la base de coneixement eacutes molt amplia pot acabarderivant amb problemes de memograveria
Per exemple si en comptes de preguntar per una instagravencia de Plat pregunteacutessim per dues instancies dePlat
1 (defrule platsCars2 plat1 lt- (object (is-a Plat) (Preu p1))3 plat2 lt- (object (is-a Plat) (Preu p2))4 (test (gt p1 30))5 (test (gt p2 30))6 =gt7 (print t (send plat1 get-nom) i (send plat1 get-nom) soacuten cars8 crlf)9 )
Faria unificacioacute amb totes les combinacions possibles (amb repeticions) de dos plats de tota la base deconeixement Aixograve es podria anar ampliant fins fer-se intractable
Si tenim drsquoalguna manera el nom de la instancia podem fer
1 (defrule platPicant2 (cuina (plat p))3 (object (name p) (picant pi))4 =gt5 (print t picant pi crlf)6 )
Aixoacute es pot servir per crear condicions que facin servir noms drsquoinstancies que tenim almacenats a slotsdrsquoaltres instancies per exemple
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send v get-Preu) crlf)6 )
Aquesta regla imprimiria el preu del vi asociat al plat si es negre
356 Tengo problemas en condiciones de reglas con slots de instancias obtenidos con send
A veces dan problemas las reglas en las que las condiciones sobre los valores de los slots de una instanciase escriben usando mensajes get sobre los atributos de una instancia en lugar de utilizar patrones paraobtenerlos por ejemplo la regla
1 (defrule platcar2 plat lt- (object (is-a Plat) )3 (test (gt (send plat get-Preu) 30))4 =gt5 (print t (send plat get-nom) es car6 crlf)7 )
No funciona correctamente en CLIPS pero la regla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2559
22 Capiacutetulo 3 CLIPS
1 (defrule platcar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Siacute lo haceEn el caso de que el valor del slot sea booleano se puede escribir la regla como
1 (defrule platpicant2 plat lt- (object (is-a Plat) (Picant TRUE))3 =gt4 (print t (send plat get-nom) es picant crlf)
En el caso de que el slot sea a su vez una instancia se puede utilizar para obtener los valores de estainstancia en la condicion como se explica en la pregunta anterior
357 Tengo problemas con instancias obtenidas del slot de otra instancia en el patroacuten de unaregla
Este problema aparece cuando el patron de una regla instancia una variable a un nombre de instancia yesta no esta definida en el modulo de la regla por ejemplo si la regla siguiente pertenece a un modulo queno es el de la instancia
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4
=gt5 (print t preu (send v get-Preu) crlf)6 )
La regla se quejaraacute de que la instancia no existe al enviarle el send ya que solo se busca la instancia dentrodel moacutedulo de la regla y no en los importados Para arreglar esto se puede usar la funcioacuten (instance-address[ltMODULOgt|] ltINSTANCIAgt) que busca la direccion de la instancia en un modulo concreto o en todos losmoacutedulos que se importan () Deberiacuteamos entonces escribir la regla
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send (instance-address v) get-Preu) crlf)6 )
358 iquestCoacutemo realizar una buacutesqueda de instancias que cumplan unas restricciones
CLIPS nos ofrece varias funciones de buacutesqueda de instancias que cumplan unas determinadas restriccionesque a nosotros nos interese
La funcioacuten find-instance Esta funcioacuten devuelve la primera instancia que cumple todas las restric-ciones indicadas
La funcioacuten find-all-instances Esta funcioacuten devuelve todas las instancias que cumplen las restric-ciones indicadas
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2659
35 Las clasesinstancias 23
La sintaxis de ambas funciones es igual exceptuando el nombre de la funcioacuten(find-all-instances (clase_instancias) (restricciones))A continuacioacuten se muestran varios ejemplos
(bind rectangulos (find-all-instances ((inst Rectangulo)) (gtinstaltura 10))) Des-pueacutes de ejecutar esta funcioacuten en la variable rectangulos habraacute una lista con todas las instancias de la
clase Rectangulo cuya altura sea superior a 10(bind rectangulos (find-all-instances ((inst Rectangulo)) (and (gtinstaltura 10) (=instanchura 7)))) Este trozo de coacutedigo hace que en la variable rectangulos se guarde una listade las instancias de la clase Rectangulo que tienen una altura superior a 10 y una anchura igual a 7
Estas funciones que CLIPS nos ofrece tienen otra funcionalidad y es que podemos realizar buacutesquedas deconjuntos de instancias
(bind rectangulos (find-all-instances ((a Rectangulo) (b Rectangulo)) (= aalturabaltura))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas de instancias de laclase Rectangulo que tienen la misma altura
Por uacuteltimo es necesario comentar que se pueden realizar buacutesquedas de conjuntos de instancias que seande distintas clases
(bind figuras (find-all-instances ((rect Rectangulo) (circ Circulo)) (= rectalturacircradio))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas ltrectangulocirculogtque cumplan que la altura del rectaacutengulo sea igual al radio del ciacuterculo
Existen maacutes comandos para obtener instancias pero son menos utilizadas a nivel baacutesico como pueden serany-instancep do-for-instance do-for-all-instances y delayed-do-for-all-instances
359 iquestCoacutemo se interactuacutea con objetos
La interaccioacuten con objetos se efectuacutea mediante lo que se denomina mensaje
(defmessage-handlerltnombre-clasegtltnombre-mensajegt[lttipo-handlergt] [ltcomentariogt]ltparaacutemetrogt [ltparaacutemetro-comodiacutengt])ltaccioacutengt
)
Un gestor de mensajes consta de 7 partes
1 Nombre de clase a la que el gestor estaraacute asociado
2 Nombre del mensaje
3 Tipo de gestor (Nosotros habitualmente usaremos primary que viene por defecto)
4 Comentario (opcional)
5 Lista de paraacutemetros6 Paraacutemetro comodiacuten (para gestionar muacuteltiples paraacutemetros)
7 Secuencia de acciones o expresiones que seraacuten ejecutadas por el gestor
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2759
24 Capiacutetulo 3 CLIPS
Enfocado a la praacutectica de CLIPS la maacutes comuacuten es que queramos interactuar con objetos para
1 Imprimir los objetos Un ejemplo
1 (defmessage-handler avion imprimir-beneficio ()
2 Para implementar funciones calculadas asociadas al objeto Un ejemplo
1 (defmessage-handler avion calcular-beneficio ()2 ( selfplazas-ocupadas selfprecio-billete))3 )
Como se puede observar el paraacutemetro impliacutecito self contiene la instancia activa para este mensaje
3510 iquestComo se interactuacutea con las instancias de los objetos
Podremos interactuar entre las instancias de los objetos mediante la funcioacuten send
(send ltexpresioacuten-de-objetogtltnombre-de-mensajegtltexpresioacutengt)Donde se toman como argumentos el objeto destino del mensaje el mensaje mismo y otros paraacutemetros
que debieran ser pasados a los gestoresParticularmente en el aacutembito de la praacutectica usualmente necesitaremos utilizar el envioacute de mensajes de
tipo get put and delete Estos mensajes tiene la siguiente sintaxis
get-ltnombre-atributogt
put-ltnombre-atributogt
delete
Aquiacute tenemos un ejemplo de como utilizarlo recordando que ponemos entre corchetes la instancia la cualse enviacutea el mensaje
(defclass avion (is-a USER)(role concrete)(slot precio-billete (create-accessor read) (default 34))(slot plazas-ocupadas (create-accessor write) (default 0)))
Clase creada
gt(make-instance a of avion) Creacioacuten de una instancia de avion[a]
gt(send [a] get-precio-billete) Obtencioacuten de un slot34 Resultado obtenidogt(send [a] put-plazas-ocupadas 100) Modificacioacuten de un slotgt(send [a] delete) Eliminacioacuten de la instanciaTrue
3511 Uso de make-instance
Cuando queremos crear una instancia de una clase para ir rellenandola con los resultados o datos quevayamos obteniendo se haria lo siguiente
(bind variable_instancia (make-instance nombre_instancia of nombre_clase))
Una vez creada podemos jugar con dicha instancia en las diferentes reglas siempre que la llamemos enlos activadores
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2859
35 Las clasesinstancias 25
(defrule reglavar_instancia lt- (object (is-a nombre_clase))=gt
)
De esta manera dentro de la regla podemos hacer acciones con la instancia por ejemplo(send var_instancia put-articulo articulo_ejemplo)
3512 Como generar automaacuteticamente nombres de instancia
En ocasiones queremos crear instancias en reglas y queremos que su nombre sea distinto del de otrasque ya tenemos Para ello podemos utilizar las funciones gensym y gensym La primera genera un siacutembolodel estilo genN donde N es un nuacutemero La segunda hace lo mismo pero aseguraacutendose de que ese siacutembolono exista ya Se puede reiniciar el contador que usan estas dos funciones con el operador (setgen ltnumgt)donde ltnumgt es el nuacutemero por el que queremos que empiecen ahora los siacutembolos
Para usar esto para generar el nombre de una instancia podemos hacer
(make-instance (gensym) of ltclasegt)
Cada vez que se ejecute se generaraacute un nombre de instancia nuevoSi creamos instancias de diferentes clases y queremos que las instancias tengan nombres que podamos
identificar podemos concatenar siacutembolos a los siacutembolos generados por gensym por ejemplo
(make-instance (sym-cat pepe- (gensym)) of ltclasegt)
generaraacute una instancia con el nombre pepe-genN
3513 Com fer un getset drsquoun slot drsquouna classe
Per consultar el valor drsquoun slot drsquouna classe ho podem fer enviant-li un missatge de la seguumlent manera
(send ltVARIABLEgt get-ltNOM_ATRIBUTgt)
Per exemple si tenim una instagravencia de la classe Plat ( instancia ) i volem saber el valor del seu slotnom
(send instancia get-nom)
Per assignar un valor a un slot drsquouna drsquoinstagravencia hem drsquoenviar-li un missatge de la seguumlent manera
(send ltVARIABLEgt put-ltNOM_ATRIBUTgt ltVALORgt)On ltVALORgt pot ser un valor o un megravetode que retorni un valor
(send instancia put-nom nom)
3514 iquestCoacutemo acceder a una instancia cuyo nombre conocemos
Si conocemos el nombre de una instancia y necesitamos acceder a ella es decir necesitamos enviarle alguacutenmensaje mediante la funcioacuten send podemos hacerlo directamente escribiendo en lugar de la variable quealmacena la instancia el nombre de la instancia entre corchetes [ ] A continuacioacuten se muestra un ejemplo
(bind altura_rect1 (send [rect1] get-altura))
En este caso se guardaraacute en la variable altura_rect1 el valor de la altura de la instancia que tiene comonombre rect1
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2959
26 Capiacutetulo 3 CLIPS
3515 Obtenir el nom drsquouna classe
Si tenim una instagravencia drsquouna classe i volem saber el nom de la classe (uacutetil si tenim una bona taxonomiade classes) ho podem fer amb el megravetode (class ltINSTANCIAgt)
Si per exemple imaginem que tenim la classe Actor la qual teacute com subclasses la classe APrincipalASecundari i ACameo Imaginem que estem tractant amb instancies drsquoactors i volem saber si la instanciaque estem tractant es de la classe APrincipal
Ho hauriacuteem de fer de la seguumlent manera
(eq (class instancia) APrincipal)
Fixem-nos que APrincipal eacutes un siacutembol no un String (un truco eacutes fixar-se en que no teacute cometes) Si vol-gueacutessim comparar-ho amb un String (per exemple un String introduiumlt per lrsquousuari) ho podriacuteem transformara un String amb el megravetode str-cat
(eq (str-cat (class instancia)) Principal)
3516 Como convierto un INSTANCE-ADRESS en un INSTANCE-NAME
En alguacuten momento nos podemos encontrar con la situacioacuten de que disponemos de un puntero a unainstancia y necesitamos su nombre o lo contrario En ambos casos podemos usar la funcioacuten instance-nameSu funcionamiento es bidireccional podemos introducirle un instance-name y nos devolveraacute un instance-adress y viceversa
1 (defrule imprimir-nombre2 estlt-(object (is-a Estudiante) (edad 25))3 =gt4 (printout t (instance-name est) crlf)5
)
3517 Com iterar a traveacutes drsquoun multi-slot
El seguumlent tambeacute eacutes vagravelid com exemple de com iterar a traveacutes drsquouna llistaImaginem que tenim una instagravencia de la classe Plat a la varible (plat) la qual teacute un multi-slot drsquoinstagravencies
de la classe Ingredient Imaginem que volem imprimir per pantalla el nom drsquoaquests ingredients (slot nomde la classe Ingredient) Necessitarem iterar sobre la llista drsquoingredients
1 (bind i 1)2 (while (lt= i (length$ (send plat get-ingredients)))3 do4 (bind ingredient (nth$ i (send plat get-ingredients)))5 (printout t (send ingredient get-nom) crlf)6 (bind i (+ i 1))7 )
El megravetode (nth$ ltINDEXgtltLLISTAgt) et retorna lrsquoelement situat a INDEX de LLISTAEl megravetode (length$ ltLLISTAgt) retorna el nuacutemero drsquoelements de LLISTA
3518 Coacutemo modificarinsertarborrar valores en un multislot
Los valores de un multislot se pueden cambiar usando la funcioacuten slot-replace$ La sintaxis es la siguiente
(slot-replace$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt ltvalorgt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3059
35 Las clasesinstancias 27
Donde ltiniciogt y ltfingt son el rango de posiciones del multislot que se quiere modificar y ltvalorgtson los valores que queremos reemplazar Obviamente deberaacute haber tantos valores como posiciones hayamosindicado en el rango
Para insertar nuevos valores podemos usar la funcioacuten slot-insert$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltposgt ltvalorgt)
El valor se inserta delante de la posicioacuten indicada si la posicioacuten es mayor que la longitud del multislot secolocaraacute al final
Para borrar elementos de un multislot podemos usar la funcioacuten slot-delete$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt)
Se borraraacuten los elementos que estaacuten en el rango indicado
3519 Coacutemo recorrer un atributo multievaluado
Supongamos que la variable respuesta tiene una lista de instancias
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 aquiacute hacemos lo que queramos4 )5 )
Loop-for-count funciona como un for primero la variable que haraacute de contador luego el valor de origeny luego el valor final Para controlar el final usamos la funcioacuten que he explicado antes i tomaraacute valoresdesde 1 hasta n asiacute que usando la funcioacuten nth$ obtendremos cada uno de los elementos La variable auxiraacute teniendo cada uno de los valores
3520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz)
Es igual que antes pero con dos bucles
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 (bind aux2 (send aux get-slot_que_queremos))4 (loop-for-count (j 1 (length$ aux2)) do5 (bind aux_final (nth$ j aux2))6 aquiacute ya podemos trabajar con el elemento en concreto7 )8 )
Supongamos que respuesta tiene una lista de instancias con el primer bucle haremos lo mismo que antes ir
iterando por esas instancias Una vez que tenemos cada instancia con aux2 con el segundo bucle iteraremosdentro de sus instancias interiores
Por ejemplo si tenemos varios equipos de fuacutetbol y cada equipo tiene varios jugadores en el primer bucleestamos iterando entre los equipos y en el segundo entre los jugadores de cada equipo en particular
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3159
28 Capiacutetulo 3 CLIPS
3521 Com puc esborrar una instagravencia
Per esborrar una instagravencia (per exemple segons la informacioacute que proporcioni lrsquousuari podem deduir queuna segraverie drsquoinstagravencies eacutes impossible que es facin servir per a la solucioacute) ho podem fer enviant un missatgedelete a la instagravencia eacutes a dir (send ltINSTANCIAgtdelete)
(send inst delete)
Un megravetode que podria ser uacutetil de la cara a la pragravectica podria ser el seguumlent
1 (defrule elimina-instancia2 (declare (salience 10))3 elimina-fact lt- (elimina-inst inst)4 =gt5 (send inst delete)6 (retract elimina-fact)
Imaginem que per exemple que volem eliminar una llista drsquoinstagravencies Per eliminar-les podriacuteem recoacuterrerel llistat marcant les instagravencies que volem esborrar afegint el seguumlent fet
(assert (elimina-instancia inst))
Aixiacute com que elimina-instancia teacute un salience alt esborraria les instagravencies marcades quan tingueacutes ocasioacuteDrsquoaquesta manera ens estalviem el problema de recoacuterrer un llistat drsquoinstagravencies amb un iterador mentre
anem eliminant els elements de la llista cosa que pot donar problemes amb lrsquoiterador
3522 Com imprimir una instagravencia
Per imprimir una classe (uacutetil per exemple per mostrar el resultat final) el millor eacutes definir message-handlersPer exemple imaginem que tenim una classe Plat la qual teacute un slot nom de tipus String Si volgueacutessimimprimir per pantalla un missatge que digueacutes
El nom del plat eacutes ndashltnom del platgtndash
Hauriacuteem de definir un message-handler que simplement imprimiacutes per pantalla el valor de lrsquoslot de laforma
(defmesssage-handler ltCLASSNAMEgt ltMESSAGENAMEgt primary ()ltCODIgt
)
Per el cas de lrsquoexemple
1 (defmessage-handler Plat print primary ()2 (printout t -- selfnom --) )3 )
Per cridar-ho nomeacutes caldragrave enviar-li un missatge a la instagravencia amb el nom del message-handler (enaquest cas print)
(send instancia print)
Un message-handler pot cridar a altres message-handlers amb el que es poden encadenar diverses instagraven-cies Per exemple imaginem que tenim la classe Menuacute la qual teacute un atribut plats que eacutes un llista drsquoinstagravenciesde la classe Plat Dintre del message-handler menuacute podriacuteem iterar a traveacutes de la llista de plats enviant elmissatge print que hem definit anteriorment
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3259
36 Programacioacuten 29
3523 Com es navega entre instagravencies relacionades
Per exemple tinc una instagravencia iA que teacute un slot anomenat slotB que eacutes una instagravencia drsquoun frame B Vullsaber el nom de la instagravencia associada al slotB de iA Ho pots fer aixiacute
(bind B (send iA get-slotB))(bind res (send B get-nom))
Si estagraves dins drsquouna condicioacute ho pots simplificar de la forma seguumlent
(bind res (send iAslotB get-nom)
Els dos punts soacuten equivalents al punt de Java
36 Programacioacuten
361 Com introduir un comentari
Els comentaris a CLIPS va darrere de un com per exemple
Comentari
Tambeacute podem afegir comentaris a les nostres regles deffacts deftemplates etc Generalment van darrereel nom de la estructura per exemple
1 (defrule neteja regla per la qual si la cuina estagrave bruta srsquoafegiragrave una tasca de2 neteja
3 (estat-cuina bruta)4 =gt5 (assert (tasca netejar))6 )
362 Referenciar el valor null a CLIPS
Per referenciar el valor null a clips es fa amb el simbol nil Per exemple si volem saber si una instagravenciainst es null ho podriacuteem fer de la seguumlent manera
(eq inst nil)
363 Formas de recorrer una lista
Para recorrer una lista disponemos de diferentes opciones en este FAQ explicaremos como crear unaestructura tipo ldquoWHILErdquo y tipo ldquoFORrdquo
1 While Esta regla se ejecuta hasta que la expresioacuten a evaluar sea falsa Este tipo de estructura se rigepor seguir la sintaxis while - do y se construiriacutea de la siguiente forma
(while ltexpresioacutengt[do] ltaccioacutengt)
Doacutende dependiendo del valor de ltexpresioacutengt
Valor TRUE Se realizaraacute la accioacuten ltaccioacutengt i se volveraacute a evaluar ltexpresioacutengt
Valor FALSE No se ejecutaraacute la accioacuten ltaccioacutengt
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3359
30 Capiacutetulo 3 CLIPS
2 For Esta regla sirve para ejecutar un bucle N (final - inicio) veces Este tipo de estructura se rige porseguir la sintaxis loop-for-count y se construiriacutea de la siguiente forma
(loop-for-count (ltvargtltiniciogtltfinalgt) [do] ltaccioacutengt)
Doacutende
ltvargt Variable que se usara como iacutendice
ltiniciogt Valor inicial que tendraacute ltvargt
ltfinalgt Ultimo valor que tendraacute la variable ltvargt
ltaccioacutengt Accioacuten que es realizaraacute hasta que ltvargt tenga el valor de ltfingt
364 Formas de elegir una opcioacuten
En este apartado explicaremos como crear una estructura if y una estructura switch
If Este tipo de estructura se rige por seguir la sintaxis if - then - else y se construiriacutea de lasiguiente forma
(if ltexpresioacutengtthen ltaccioacutengt[else ltaccioacuten2gt])
Doacutende dependiendo del valor de ltexpresioacutengt
bull Valor TRUE Se realizaraacute la accioacuten ltaccioacutengtbull Valor FALSE Se realizaraacute la accioacuten ltaccioacuten2gt (en caso de haber)
Switch Este tipo de estructura se rige por seguir la sintaxis switch - opciones y se construiriacutea dela siguiente forma
(switch ltexpresioacuten-testgt(case OPCION1 then ACCION1)(case OPCION2 then ACCION2)
([default] ACCION-DEFAULT)
)
Doacutende dependiendo del valor de ltexpresioacuten-casegt se ejecutaraacute una ltaccioacutengt en particular Si nin-guna ltopcioacutengt es correcta se ejecutara la ltaccioacuten-defaultgt
365 Funciones con la clase String
Habitualmente trabajaremos con Strings o cadena de Strings CLIPS proporciona una serie de herramien-tas para trabajar con esta clase
1 Convertir string a MAYUacuteSCULAS A veces es conveniente tener todos los caracteres en mayuacutesculaspara no tener problemas de comparaciones o simplemente por convenio Para ello CLIPS dispone dela funcioacuten upcase la cual convierte a mayuacutesculas un siacutembolo o string
(upcase ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplos
(upcase Ccedillips es divertido) rarr CcedilLIPS ES DIVERTIDO
(upcase Clips_es_divertido) rarr CLIPS_ES_DIVERTIDO
2 Convertir string a MINUacuteSCULAS la funcioacuten es downcase
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3459
36 Programacioacuten 31
3 Concatenacioacuten de strings Tambieacuten es de gran utilidad poder juntar dos o maacutes paraacutemetros en un solostring Todo paraacutemetro a juntar deben ser de uno de los siguientes tipos symbol String integer floato instance-name
(str-cat parametro1 parametro2 parametroN )
Ejemplo
(str-cat IA nota 10) rarr IAnota10
4 Comparacioacuten de strings Funcioacuten que nos indica si dos strings son iguales
(str-compareltexpresioacuten-simboacutelica-o-de-cadenagtltexpresioacuten-simboacutelica-o-de-cadenagt
)
Esta funcioacuten devuelve
0 Si ambos strings son iguales1 Si el primer string es mayor que el segundo string-1 Si el primer string es menor que el segundo string
5 Longitud de un string Muchas veces es de gran utilidad saber que tamantildeo tiene un string
(str-length ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplo
(str-length Inteligencia Artificial) rarr 23
366 iquestCoacutemo obtener el contenido de una variable en un string
Para conseguir un string a partir de un integer float symbol instance-name debes utilizar el comandostr-cat Si a la funcioacuten le pasamos como paraacutemetros varios elementos los transformaraacute a string y losconcatenaraacute La sintaxis de esta funcioacuten es la siguiente (str-cat elementos) Esta funcioacuten la usaremossobre todo cuando queramos realizar comparaciones entre el contenido de una variable y un string ya quepreviamente necesitaremos usar la funcioacuten str-cat para pasar el contenido de la variable a string y realizarde este modo la comparacioacuten de forma correcta
367 iquestComo se crea una lista
Con create$ Todos los operadores sobre listas llevan el siacutembolo $ al final Igual que con las variables sedebe usar bind siempre que se desee modificar una lista
(bind lista (create$ a b c))
368 iquestComo borro un elemento de una lista
Con delete$Usa la siguiente sintaxis(delete$ ltlistagt ltindice-iniciogt ltindice-finalgt)Se borraraacuten todos los elementos del rango entre las posiciones inicio y final ambas incluidas Tambieacuten exis-
tedelete-member$ (delete-member$ ltlistagt ltelementogt) Borraraacute todas las apariciones del elemento enla lista
(delete$ (create$ a b c d e f) 3 5) minusrarr (a b f)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 959
6 Capiacutetulo 1 Introduccioacuten
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1059
2 Protegravegegrave
Para saber como funciona Protegravegegrave usad la ayuda de la aplicacioacuten y el material correspondiente estascuestiones se refieren a como integrar lo que se desarrolla en Protegravegegrave con CLIPS
21 Coacutemo cambiar el nombre de las instancias en Protegravegegrave
En realidad no se trata de cambiar el nombre de las instancias sino de darle algo maacutes visual que unnuacutemero para poder hacer las relaciones Si os encontraacuteis en la pestantildea de crear instancias el uacuteltimo botoacutenes una flecha hacia abajo Darle y luego set display slots Ahiacute debeacuteis indicar con que slot quereacuteis referenciarla instancia
22 Com exporto una ontologia de Proteacutegeacute a CLIPS
A Proteacutegeacute ves a File rarr Export to Format rarr CLIPS Un cop fet aixograve es crearan dos nous fitxers ambles classes i instagravencies de lrsquoontologia (nompont i nompins respectivament)
Despreacutes obre aquests dos fitxers amb un editor de text i copia el seu contingut al fitxer CLIPS de laseguumlent manera
copy-paste de nompont
(definstances instanciescopy-paste de nompins)
23 iquestCoacutemo exporto una ontologiacutea de Proteacutegeacute a CLIPS (2a posibilidad)
Alternativamente a hacer corta y pega de los ficheros de protege en el fichero de CLIPS se puede crearun fichero que cargue todos los ficheros sin tener que juntarlos
Para ello hay que crear un fichero que incluya las oacuterdenes de carga de los diferentes ficheros Por ejemplopodemos llamar a este fichero cargaclp El contenido de este fichero seraacute
(load PATHnompont)(load-instances PATHnompins)(load PATHfichero-de-reglasclp)
Donde PATH es el directorio donde se encuentran vuestros ficherosEste fichero se ha de cargar desde el inteacuterprete mediante la orden batch ((batch cargaclp)) o con
la opcioacuten de menuacute load batch Usando la instruccioacuten load-instances evitamos tener que antildeadir al fichero de instancias la instruccioacuten
definstances
24 Per quegrave em doacutena error CLIPS al tenir una instancia que hereta de meacutesdrsquouna classe
7
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1159
8 Capiacutetulo 2 Protegravegegrave
Proteacutegeacute permet lrsquoheregravencia muacuteltiple en instagravencies perograve CLIPS no En CLIPS nomeacutes poden tenir heregravenciamuacuteltiple las classes perograve no les instagravencies Aixoacute es aixiacute perque el lenguatge de CLIPS es orientat a objectesno es realment un lenguatge drsquoontologiacutees
La manera meacutes senzilla de simular-ho si les clases no tenen ancestres comuns eacutes tenir classes que repre-sentin aquesta heregravencia muacuteltiple i fer que les instagravencies pengin drsquoelles que es com es faria a un llenguatge
orientat a objectesEn el cas de tenir ancestres comuns no es pot fer lrsquounica manera es duplicar la instancia amb nomsdiferents i penjar-les de les clases on es vol tenir-la
De totes maneres el CLIPS permet recuperar fagravecilment les instagravencies que tenen un valor especiacutefic en unslot pel qual el meacutes senzill eacutes tenir una uacutenica jerarquia i incloure altres possibles classificacions com a slotsencara que obviament perdrem la posibilitat de fer servir una jerarquia de valors per aquest
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1259
3 CLIPS
31 Instalacioacuten del CLIPS
311 iquestCoacutemo instalar CLIPS
La herramienta CLIPS es multiplataforma y esta disponible para los tres SO maacutes utilizados MicrosoftWindows Linux y Mac OS X
iquestCoacutemo instalar CLIPS en Windows
Primero de todo debemos bajarnos el programa de la paacutegina oficial de CLIPS accesible desde este link
(httpclipsrulessourceforgenet) Desde el aacuterea de descarga os podreis bajar el instalador parawindows
iquestCoacutemo instalar CLIPS en Linux
En muchas distribuciones de Linux CLIPS esta disponible como un paquete adicional el paquete sueleinstalar la versioacuten con interfaz graacutefico Si no encuentras el paquete especiacutefico para la distribucion que usassiempre puedes compilarlo a partir del paquete con los fuentes
Tambieacuten estaacute la posibilidad de utilisar el emulador de windows WINE Una vez instalado el emulador sepuede instalar CLIPS y este funcionaacute igual que sobre windows
iquestCoacutemo instalar CLIPS en Mac OS X
Primero de todo debemos bajarnos el programa de la paacutegina oficial de CLIPS accesible desde este link(httpclipsrulessourceforgenet ) Desde el aacuterea de descarga podeis bajar el intalador para MACOS X
312 Entorn finestres VS Consola de comandes
Encara que lrsquoentorn de finestres eacutes molt meacutes intuiumltiu CLIPS a la seva versioacute en liacutenea de comandes eacutes moltmeacutes ragravepid (segurament perquegrave no ha de mostrar en tot moment lrsquoagenda de fets les instancies les regles
etc)La diferencia de velocitat eacutes molt notable en cas de problemes de rendiment o de sensacioacute que lrsquoentorn
de finestres es queda penjat (o directament es tanca sense previ aviacutes) recomanem provar la versioacute en liacuteneade comandes
32 Los hechos
321 iquestQueacute es un hecho en CLIPS
Conceptualmente un hecho representa un dato abstracto del cual almacenamos valores Se puede vercomo una lista de campos donde el primer campo hace referencia al ldquodatordquo al cual le asignamos una listade valores que le suceden teniendo una relacioacuten entre siacute
Formalmente el primer campo es un siacutembolo y los campos restantes son valores
9
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1359
10 Capiacutetulo 3 CLIPS
(siacutembolo valor1 valor2 valorN)
322 iquestQueacute es un hecho ordenado (order Facts)
Un hecho ordenado tienen formato libre por lo tanto no existe restriccioacuten alguna en el orden de los campos
Los campos de un hecho ordenado pueden ser de cualquier tipo primitivo de datos excepto el primero quedebe ser un siacutembolo Como ejemplo tenemos
1 (hermanos Antonio Javier Carlos)2 (padre Pedro David)
323 iquestQueacute es un hecho no ordenado (deftemplates facts)
A traveacutes de los hechos no ordenados podemos abstraernos de la estructura de un hecho asignado unnombre a cada campo (slots)
1 (deftemplate nombre-template comentario2 (slot nombre-slot (tipo-del-slot))3 (multislot nombre-slot (tipo-del-slot))4 )
Por ejemplo
1 (deftemplate avioacuten2 (slot nombre_avion (type STRING))3 (slot compania (type STRING))
4 (slot numero_plazas (type INTEGER) (default 100))
324 iquestPuedo tener un vector como slot
Si debe declararse como multislot
325 iquestPuedo asignar propiedades a los slots
Siacute las maacutes importantes son
Type El tipo de dato primitivo que contiene (en mayuacutesculas)
Allowed-X Permite especificar un conjunto de valores permitidos Siendo X un tipo de datos primitivo(en minuacutesculas y plural) rarr si el slot toma un valor del tipo X debe pertenecer a los valores permi-tidos X puede ser values especificando entonces todos los valores posibles que puede tomar el slotindependientemente del tipo de dato
Range Especifica un rango para slots numeacutericos
Cardinality Nuacutemeros miacutenimo y maacuteximo de elementos que puede tener un multislot
Default Valor por defecto Si ponemos NONE como valor por defecto significaraacute que no se podraacute crear la
instancia a no ser que se especifique el valor de ese slot
1 (deftemplate estudiante2 (slot edad (type INTEGER) (range 0 99))
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1459
32 Los hechos 11
3 (multislot asignaturas (type STRING) (cardinality 1 5))4 (slot num-carreres (default 1))5 (multislot notas (allowed-strings MH NP))6 )
326 iquestQueacute debo utilizar hechos ordenados o no ordenados
Como se puede intuir si tenemos un conjunto de hechos los cuales conceptualmente pertenecen al mismoaacutembito seraacute una solucioacuten maacutes elegante agruparlos a traveacutes de un deftemplate En caso que tengamos quealguacuten hecho aislado seraacute mas sencillo declararlo como un hecho ordenado
327 Fets o Objectes
Veient la definicioacute de deftemplate podem confondrersquons a lrsquohora de decidir si fer servir fets o fer servirobjectes
Deixant de banda altres diferegravencies ja comentades (les classes suporten jerarquia de classes heregravenciaetc) els objectes es fan servir per representar el coneixement (mitjanccedilant un conjunt drsquoinstagravencies)
Aixiacute que generalment farem servir classes i objectes per representar coneixement mentre que farem servirels fets per portar control sobre lrsquoexecucioacute del problema
Per exemple podriacuteem definir un deftemplate per emmagatzemar un resultat o per poder controlar lrsquoestatde lrsquoexecucioacute
A la pragravectica de Mikeo (penjada a la web de lrsquoassignatura) teniacuteem un deftemplate habitacion-actual
1 (deftemplate habitacion-actual2 (slot habitacion)3 (slot area-restante)4
(slot presupuesto-restante)5 (slot precio-total)6 (slot prioridad-actual)7 )
Amb el qual controlagravevem la construccioacute drsquouna habitacioacute Assignagravevem una instagravencia de la classe habita-cioacute al slot habitacion de habitacion-actual i mitjanccedilant una segraverie de regles que feien unificacioacute ambhabitacion-actual actuagravevem sobre lrsquohabitacioacute drsquouna manera o drsquoun altre
328 Creacioacuten de hechos (assertdeffacts)
Si queremos crear un solo hecho utilizaremos el comando assert Por ejemplo (assert (casa roja))Si por el contrario queremos crear una estructura ordenada de hechos utilizaremos deffacts
(deffacts mishechos (casa roja) (pelota azul))
329 Modificar un fet
Per modificar un fet (per exemple molt uacutetil si estem treballant amb deftemplates) ho podem fer mitjanccedilant(modify ltINSTANCIAgtltFETSgt)
Per exemple si tingueacutessim el deftemplate persona
1 (deftemplate persona2 (slot nom)3 (slot edad)4 (slot dni)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1559
12 Capiacutetulo 3 CLIPS
I hagueacutessim afegit el fet
(assert (persona (nom Pepe)(edad 25)(dni 46974431)))
I el fet
(assert (aniversari 46974431))
Podriacuteem tenir la seguumlent regla
1 (defrule aniv2 aniversari lt- (aniversari dni)3 persona lt- (persona (edat edat)(dni dni))4 =gt5 (retract aniversari)6 (modify persona (edat (+ 1 edat)))7 )
La qual srsquoactivaragrave si hi ha un fet aniversari drsquouna persona Fent servir el dni indicat al fet aniversaribusquem el fet persona que teacute el mateix dni Deixem el valor edat a la variable edat per poder treballaramb ella meacutes endavant
Hem agafat tambeacute la direccioacute del fet aniversari per tal de poder esborrar-lo de la base de fets Aixograve srsquohafet per dues raons
Primer per mantenir meacutes neta la base de fets Segon i meacutes important Com que hem canviat el fet laregla tornaragrave a fer unificacioacute amb el fet (perquegrave ara eacutes diferent) amb la regla aniversari amb el que entrariadintre drsquoun bucle sense fi on srsquoaniria incrementant lrsquoedat de la persona
Un cop hem esborrat el fet aniversari incrementem en 1 el valor del slot edat de la persona fent servirla variable edat que hem declarat a la part esquerre de la regla
El comportament de modify es fer un retract del fet a la base de fets i despreacutes fer un assert amb els nous
valors Si volem canviar mes drsquoun slot del fet es convenient canviar-los tots a la vegada La raoacute es que cadavegada que fem un modify lrsquoapuntador al fet es modifica i lrsquoapuntador que tenim a la variable que hem fetservir ja no es vagravelid
Si no temim mes remei que fer la modificacioacute del fet pas a pas srsquoha de saber que la crida a modify retornalrsquoapuntador al nou fet Si el guardem a altra variable (o a la mateixa) podrem continuar modificant el fetamb la nova referegravencia
3210 Com elimino un fet de la base de fets
Per eliminar un fet de la base de fets ho podem fer amb la paraula clau (retract ltFETgt) on ltFETgt eacutes
un punter al fetPer obtenir aquest fet ho podem fer fent servir ltVARgtlt- ltFETgt a la part esquerre de la reglaPer exemple
1 (defrule accionsvent2 vent lt- (vent tipus)3 =gt4 (switch tipus5 (case poc then (assert (accio persiana0)))6 (case normal then (assert (accio persiana50)))7 (case molt then (assert (accio persiana100)))8 )9 (retract vent)
10 )
Afegiragrave fets per realitzar les accions pertinents i esborraragrave el fet de la base de fets
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1659
33 Variables 13
33 Variables
331 Variables a CLIPS
No cal declarar una variable (ni el seu tipus) nomeacutes cal afegir un interrogant al comenccedilament drsquoun simbol
per indicar que eacutes una variableCLIPS srsquoencarrega del control de tipus depenent del que assignem a la variablePer exemple testvar correspondria a la variable testvar Si per exemple assigneacutessim lrsquoenter 3 a
testvar CLIPS tractaria la variable com una variable entera
332 Com assignar un valor a una variable
Per assignar un valor a una variable es fa servir el megravetode (bind) amb la forma
(bind ltVARIABLEgtltVALORgt)
On ltVALORgt pot ser un valor o un megravetode que retorni un valor Per exemple si volem assignar un 4 a lavariable var
(bind var 4)
O per exemple podriacuteem assignar a la variable var la suma de 2 meacutes 2
(bind var (+ 2 2))
333 iquestCoacutemo declarar variables globales
Para crear una variable global hay que meterla dentro de la construccioacuten defglobal La declaracioacuten de la
variable seguiraacute el modelo nombreVariable = expresioacutenPor ejemplo
(defglobal presupuesto = 0)
Pueden aparecer en la parte izquierda de las reglas si no son utilizadas para asignar un valor y su cambiono activa reglas pero no pueden ser paraacutemetros de funciones ni meacutetodos
334 iquestCoacutemo trabajar con variables sumando restando por ejemplo contadores
La mejor forma es con variables globales se definen asiacute (defglobal x = 0) puede ser el valor quequeramos tanto nuacutemero string Y si queremos sumarle 10 por ejemplo
(bind x (+ x 10))
Las variables locales como por ejemplo x soacutelo tienen valor mientras dura su ejecucioacuten y eso suele ser enesa misma liacutenea o en un bucle Si le damos valor a x y luego preguntamos por ella nos diraacute que no existe
335 Quina diferegravencia hi ha entre les variables del tipus nom_variable i les del tipus $nom_variable
Les primeres contenen un sol valor i les segones en poder contenir meacutes drsquoun (o cap)
336 Quegrave significa lrsquointerrogant () quan va sol
Eacutes una variable anogravenima Pots utilitzar sense posar-hi cap nom si no trsquointeressa el valor en concret Perexemple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1759
14 Capiacutetulo 3 CLIPS
(Primer filtre_preu )
Aquesta condicioacute significa ldquosi el fet (Primer filtre_preu) teacute algun valorrdquo O sigui que si tingueacutessimel fet (Primer filtre_preu ok) es compliria la condicioacute (i si en comptes de ldquookrdquo fos ldquopatatardquo tambeacute escompliria) En canvi si el fet fos uacutenicament (Primer filtre_preu) no es compliria la condicioacute
337 Quegrave significa el dogravelar ($) quan va sol
Eacutes com lrsquointerrogant perograve admet meacutes drsquoun valor Per exemple
(Primer filtre_preu $ ok)
donaragrave cert pels fets de lrsquoestil (Primer filtre_preu patata ok) (Primer filtre_preu hola ok)(Primer filtre_preu patata hola ok) (Primer filtre_preu ok) Eacutes a dir no importa els valors quehi hagi entre filtre_preu i ok si al final hi ha un ok
338 iquestComo puedo ver los hechos presentes en un momento determinado
Abriendo la Facts Window en Window de la barra de menuacute
34 Las reglas
341 iquestCoacutemo construir una regla
Para construir una regla utilizaremos la construccioacuten defrule
Sintaxis
(defrule ltnombre-reglagt [ltcomentariogt][ltdeclaracioacutengt]ltelemento-condicioacutengt Parte izquierda (LHS)
=gtltaccioacutengt) Parte dcha (RHS) de la regla
Una regla consta de un conjunto de condiciones (antecedente) tambieacuten denominados elementos condicio-nales (EC) o parte izquierda (LHS) y de un conjunto de acciones (consecuente) tambieacuten denominado partederecha de la regla (RHS) La regla se activaraacute siempre que se satisfagan todos los EC mediante hechos oinstancias que los cumplan
Si se introduce en la base de reglas una nueva regla con el mismo nombre que el de una existente la nuevaregla reemplazaraacute a la antigua
Si una regla no tiene parte izquierda es decir no tiene elementos condicionales entonces el hecho(initial-fact) actuaraacute como el elemento condicional para ese tipo de reglas y la regla se activaraacute cadavez que se ejecute un comando reset
342 iquestCoacutemo gestionar la parte izquierda (LHS) de una regla
Declarar hechosSi no se especifica ninguna condicioacuten la regla se activaraacute siempre Una condicioacuten puede ser un simple hecho
(Ej vegetariano) o un hecho ordenado con unos valores concretos (Ej (persona (nombre Juan))) Si loque queremos es obtener el valor de un hecho insertaremos una variable en su lugar (Ej (persona (nombre
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1859
34 Las reglas 15
n)) ) Entonces entraraacute en la regla para cada valor posible que pueda asignar a la variable n a partir delos hechos
Si queremos indicar cualquier valor utilizaremos el siacutembolo y para cualquier lista el siacutembolo $ (Ej(evento ) (estilo $) ) Tambieacuten existe la opcioacuten de guardar en una variable una referencia al objetoEllo se consigue poniendo var lt- a su izquierda (Ej p lt- (persona (nombre Juan))) Se puede usarpor ejemplo para pasaacuterselo de paraacutemetro a una funcioacuten llamada en la RHS
Establecer condiciones
Ademaacutes podemos especificar restricciones adicionales sobre los valores que puede tomar un campo de unhecho Existen tres tipos principales de restricciones Conectadas (por orden de precedencia o prioridad)
not (~) Evita que cierto campo cumpla determinada restriccioacuten
and (amp) Combina dos restricciones conjuntivamente
or (|) Combina dos restricciones disjuntivamente
De predicado () Obliga a que cierto campo cumpla determinada condicioacuten (especificada por el predicado)
Por valor devuelto por una funcioacuten = Permite llamar a una funcioacuten y utilizar el valor devuelto pararestringir el valor que pueda tomar un campo de un hecho
Se puede comprobar si se cumple una determinada condicioacuten mediante el constructor test Dentro detest se pueden hacer llamadas a cualquier funcioacuten o predicado ya sea primitiva de CLIPS o definidapor nosotros
Combinar elementos
Los diferentes elementos de la parte izquierda van impliacutecitamente unidos mediante una AND que indicaconjuncioacuten No obstante podemos hacerlo expliacutecitamente mediante (and (cond1) (cond2)) aunque suelen
utilizarse para anidar ANDs dentro de ORsOR Sirve para hacer una disyuncioacuten (or (cond1) (cond2)) Es equivalente a escribir varias reglas en lasque cada una de ellas tenga uno de los componentes del OR en su parte izquierda y la misma parte derecha
NOT Sirve para detectar si no existe un determinado hecho (Ej (not (estilo sibarita)))exists Cuando a un conjunto de elementos se le antecede exists se comprueba que hay al menos un
hecho en la base de hechos que cumpla la condicioacuten (Ej (exists(bebida precio (ltprecio 5))) )forall Permite comprobar si todos los hechos que satisfacen un determinado patroacuten cumplen una serie
de condiciones (Ej (forall(plato (estilo moderno)))
343 iquestCoacutemo obtener la direccioacuten de hechos o instancias situados en LHS
En algunas ocasiones vamos a necesitar realizar alguacuten tipo de accioacuten en la parte derecha de las reglassobre hechos o instancias que cumplan unas determinadas condiciones Pero para ello necesitaremos primerotener acceso a estos elementos para despueacutes poder operar sobre ellos Esto lo conseguiremos guardando ladireccioacuten del elemento en una variable hacieacutendolo del siguiente modo
variable_direccion lt- (elemento)
Pongamos un ejemplo para ver realmente el funcionamiento y uso de esta posibilidad que CLIPS nosofrece
1 (defrule imprime-area2 instancia lt- (object (is-a Rectangulo))3 =gt4 (printout t Area del rectangulo (instance-name instancia)5 (send instancia calcula-area) crlf)6 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1959
16 Capiacutetulo 3 CLIPS
Cuando se ejecuta esta regla se imprimiraacuten las aacutereas de todas las instancias de la clase Rectangulo Enla parte izquierda de la regla lo que hacemos es guardar en la variable instancia la direccioacuten de la instanciade Rectangulo que estamos tratando en ese momento La regla se ejecutaraacute para todas las instanciasalmacenadas en la memoria de trabajo que cumplan la condicioacuten (is-a Rectangulo) es decir para todaslas instancias de la clase Rectangulo En la parte derecha de la regla donde se ejecutan las acciones podemosver que se imprimiraacute para cada instancia lo siguiente Area del rectangulo [nombre_instancia] aacuterea
del rectaacutengulo La funcioacuten instance-name nos devuelve el nombre de la instancia que le pasamos porparaacutemetro Ademaacutes hemos llamado al gestor de mensajes calcula-area para que nos devuelva el area delrectaacutengulo
344 iquestCoacutemo hacer sentencias or en la izquierda de las reglas
Con (or ) Si por ejemplo tenemos dos hechos (a) y (b) y queremos ejecutar la derecha de la reglacuando se cumpla uno de los dos tendremos que hacer (or (a) (b)) Atencioacuten porque la parte derecha seejecutaraacute tantas veces como veces se cumpla cada uno de los hechos si para nosotros existe tanto (a) como(b) la parte derecha se ejecutaraacute dos veces Para que soacutelo se usa una vez podemos hacer combinaciones de
or y and (funciona igual) o usar un patroacuten por ejemplo (persona Juan|Pedro) soacutelo se ejecutariacutea una vez
345 Com afegir una condicioacute a la part esquerre drsquouna regla
A vegades eacutes necessari que una regla srsquoinstanciiuml si es produeix una condicioacute especial (i no un fet) Per feraixoacute farem servir la comanda (test ltCONDICIOgt)
Per exemple imaginem que la nostre base de fets compte amb un fet (preu valor) amb un preudeterminat Imaginem que volem una regla que srsquoinstanciiuml quan aquest valor eacutes meacutes gran que 30
Per fer-ho fent servir tot el que hem explicat
1 (defrule preucar2 (preu preu)3 (test (gt preu 30))4 =gt5 (printout t El preu es mes gran que 30)6 )
Eacutes a dir si el preu eacutes meacutes gran que 30 srsquoimprimiragrave un missatge per pantallaAquestes condicions poden contenir ANDs i ORs de varies condicionsPer exemple
1 (defrule preulimit2 (preu preu)3 factminim lt- (preuminim minim)4 factmax lt- (preumaxim maxim)5 (test (and (gt preu minim) (lt preu maxim) ))6 =gt7 (retract factminim)8 (retract factmax)9 (printout t El preu estagrave dintre del rang)
On comprovarem si el preu estagrave dintre drsquoun rang determinat i en aquest cas esborra els fets que contenen
el magravexim preu i el miacutenim preu i mostra un missatge per pantalla
346 Puede una misma regla ejecutarse maacutes de una vez
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2059
34 Las reglas 17
Es muy importante entender que cada regla se ejecutaraacute una vez por cada combinacioacuten de valores en suLHS
1 (defrule regla2 (color col)3 (peso pes)4 =gt5
Si tengo tres colores y dos pesos asertados la regla se ejecutaraacute 6 veces una con cada combinacioacuten decolor y peso
347 Com puc definir lrsquoordre de les regles
La idea drsquoun sistema basant en regles eacutes no definir un ordre lineal drsquoaquestes (costa deixar de pensar de
forma iterativa)En el cas de necessitar que una regla srsquoexecuti despreacutes drsquouna altre pots fer servir Fets la regla anteriorcrea un fet que la segona regla tindragrave a la part esquerra
1 (defrule pregunta12 =gt3 (assert (pregunta1Feta))4 5 )6
7 (defrule pregunta2
8 (pregunta1Feta)9 =gt
10 11 )
I finalment pots usar la propietat salience Aquesta propietat indica la prioritat drsquoexecucioacute de les regles( les regles amb salience majors srsquoexecutaran abans ) Pot prendre valors positius i negatius entre -10000 y+10000 Per defecte les regles tenen salience 0
1 (defrule pregunta12 (declare (salience 2))3 =gt4 5 )6
7 (defrule pregunta28 (declare (salience 1))9 =gt
10 11 )
El valor indicado en la propiedad salience puede ser el nuacutemero directamente o una expresioacuten por ejemplovariable10 podemos usar variable para elegir que regla se ejecutaraacute
Las prioridades deben ser usadas solo para determinar el orden en el que se disparan algunas reglas sobreotras no para fijar el flujo de control ya que la principal ventaja de un sistema basado en reglas es larepresentacioacuten declarativa del conocimiento y de esta forma abusando de las prioridades conduce a unsistema procedimental
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2159
18 Capiacutetulo 3 CLIPS
348 Com forccedilar que una regla sigui la primera
Per que aquesta regla sigui la primera ha de tenir el salience meacutes gran de totes
1 (defrule presentacio2 (declare (salience 20))3 =gt4 (printout t ------ Benvingut ----- crlf)5 )
349 Vull guardar certs valors que es fan servir durant lrsquoexecucioacute de diferents regles Com hopuc fer
Tens principalment dues alternatives Si el valor eacutes un tipus bagravesic pots fer servir una variable global ambla sintaxi seguumlent
(defglobal nom_variable = valor)
Aquesta sentegravencia no va a dins de cap funcioacute ni regla es posa sola a la part que creguis convenient delcodi Vegem un exemple
(defglobal preu_minim_primer = 1000)
Per fer-la servir es fa exactament de la mateixa manera que amb una variable normal perograve has de posarels dos asteriscs Per exemple
(bind preu_minim_primer curr-preu)
Per altra banda si el valor o valors que vols guardar han de ser instagravencies una bona estrategravegia pot serutilitzar un deftemplate Eacutes uacutetil sobretot per anar guardant solucions temporals o llistes drsquoelements quepoden formar part de la solucioacute
Per utilitzar-ho has de seguir els passos seguumlents
1 Definir el deftemplate
(deftemplate nom_del_deftemplate(multislot nom_multislot)
(slot nom_slot)
)
Amb un exemple es veuragrave meacutes clar
(deftemplate llista-plats(multislot primers)(multislot segons)(multislot postres)
)
2 Inicialitzar el deftemplate
(defrule[condicions vagraveries] La condicioacute base eacutes que llista-plats no srsquoha inicialitzat encara
(not (llista-plats))=gt
llista conteacute els valors de llista-plats (que de moment estan buits)(bind llista (assert (llista-plats)))
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2259
35 Las clasesinstancias 19
3 Assignar-li valors
(bind segons_plats (find-all-instances ((plat Plat)) TRUE)(modify llista (segons segons_plats))
4 Recuperar els valors
(defrule[condicions vagraveries]llista lt- (llista-plats (segons $segons_plats))
=gt
Ara la variable $segons_plats conteacute tots els elements de segons
35 Las clasesinstancias
351 Tengo que representar la jerarquiacutea de un frame iquestEs preferible antildeadir las subclases a laontologiacutea o bien diferenciarlas mediante un slot en la superclase
Las dos formas son vaacutelidas pero es recomendable representarlas en clases separadas cuando se vayan abuscar instancias de ese tipo ya que asiacute no tendremos que hacer un recorrido por todas las de la superclaseNo obstante si soacutelo se trata de una caracteriacutestica puntual del frame y no vamos a hacer buacutesquedas de unaexclusiva subclase entonces seraacute maacutes eficiente antildeadir un slot debido a su mejor accesibilidad
352 iquestQueacute es un objeto
Podriacuteamos decir que un objeto es un hecho no ordenado con herencia
353 iquestPorqueacute usar objetos en contexto de la praacutectica de CLIPS de IA
Como bien sabemos una parte de la praacutectica de SBCrsquos consisten en crear la ontologiacutea Esta ontologiacutease exporta para poder interactuar con CLIPS en formato pins y pont El archivo pont contendraacute ladeclaracioacuten de todas las clases creadas previamente por Protege (defclass ) El archivo pins contendraacute
todas las instancias de las clases declaradas en el archivo pont Como puede intuir el lector se necesitaraacuteinteractuar con los objetos previamente creados por Protegravegegrave
354 Como se definen las clases
Para definir las clases usaremos el constructor defclass
(defclass ltnombregt [ltcomentariogt](is-a ltnombre-de-superclasegt)[(role concrete | abstract)]
[(pattern-match reactive | non-reactive)]ltslotgt definicioacuten de los atributos de la clase
ltdocumentacioacuten-handlergt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2359
20 Capiacutetulo 3 CLIPS
En caso de desear que la nueva clase herede las propiedades de otra ya existente el nombre de esta deberaacuteespecificarse despues de is-a El rol determinaraacute si la clase es concreta (se puede instanciar) o abstracta(destinada a ser superclase) El pattern-match debe declararse como reactivo si se desea que las instanciasde la clase puedan unificar con los elementos objeto de las reglas (siacutembolo lt-) Los slots correspondena los atributos de la clase y los handlers a las funciones de eacutesta Los handlers se pueden declarar en ladeclaracioacuten de la propia clase pero se deben definir externamente Dado que no aporta ninguna ventaja
declararlos es recomendable definirlos directamente Noacutetese que todo aquello que estaacute entre corchetes ([])constituye informacioacuten adicional que no es obligatorio especificar
1 (defclass Persona2 (is-a Ser_Vivo)3 (role concrete)4 (single-slot edad5 (type INTEGER)6 (range 1 99)7 (cardinality 0 1)8 (create-accessor read-write)9 )
10 (multislot amigos11 (type INSTANCE)12 (allowed-classes Persona)13 )14 )
El comportamiento y declaracioacuten de los slots es ideacutentico al de los slots de los hechos ordenados Losatributos de tipo INSTANCE (referencian otras instancias) estan en formato INSTANCE-NAME
355 Com consulto una instagravencia a partir drsquouna regla
Podem fer servir la part esquerre drsquouna regla per trobar instagravencies Lrsquouacutes eacutes molt semblant a trobar elpunter a un fet fent servir
(object [(is-a ltNOM_CLASSEgt)|(name ltNOM_INSTANCIA)|(ltNOM-SLOTgt ltVALORVARIABLE))])
Per exemple si volem que una regla srsquoinstanciiuml si tenim instanciat un plat de la classe Plat podriem ferservir
1 (defrule tenimplat2 plat lt- (object (is-a Plat))3 =gt4 (print t (send plat get-nom) crlf)
La regla imprimiragrave el nom del plat que trobi Eacutes important notar que srsquoactivaragrave per cada instagravencia de platque tinguem a la base de coneixement
Podem consultar els valors de la instancia fent servir condicions a la part esquerre de la regla Per exemplesi nomeacutes volgueacutessim els plats amb un preu meacutes gran que 30
1 (defrule platCar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Srsquoactivaragrave per tots els plats amb un preu major a 30
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2459
35 Las clasesinstancias 21
Srsquoha drsquoanar amb cura per aquest tipus de regla ja que si la base de coneixement eacutes molt amplia pot acabarderivant amb problemes de memograveria
Per exemple si en comptes de preguntar per una instagravencia de Plat pregunteacutessim per dues instancies dePlat
1 (defrule platsCars2 plat1 lt- (object (is-a Plat) (Preu p1))3 plat2 lt- (object (is-a Plat) (Preu p2))4 (test (gt p1 30))5 (test (gt p2 30))6 =gt7 (print t (send plat1 get-nom) i (send plat1 get-nom) soacuten cars8 crlf)9 )
Faria unificacioacute amb totes les combinacions possibles (amb repeticions) de dos plats de tota la base deconeixement Aixograve es podria anar ampliant fins fer-se intractable
Si tenim drsquoalguna manera el nom de la instancia podem fer
1 (defrule platPicant2 (cuina (plat p))3 (object (name p) (picant pi))4 =gt5 (print t picant pi crlf)6 )
Aixoacute es pot servir per crear condicions que facin servir noms drsquoinstancies que tenim almacenats a slotsdrsquoaltres instancies per exemple
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send v get-Preu) crlf)6 )
Aquesta regla imprimiria el preu del vi asociat al plat si es negre
356 Tengo problemas en condiciones de reglas con slots de instancias obtenidos con send
A veces dan problemas las reglas en las que las condiciones sobre los valores de los slots de una instanciase escriben usando mensajes get sobre los atributos de una instancia en lugar de utilizar patrones paraobtenerlos por ejemplo la regla
1 (defrule platcar2 plat lt- (object (is-a Plat) )3 (test (gt (send plat get-Preu) 30))4 =gt5 (print t (send plat get-nom) es car6 crlf)7 )
No funciona correctamente en CLIPS pero la regla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2559
22 Capiacutetulo 3 CLIPS
1 (defrule platcar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Siacute lo haceEn el caso de que el valor del slot sea booleano se puede escribir la regla como
1 (defrule platpicant2 plat lt- (object (is-a Plat) (Picant TRUE))3 =gt4 (print t (send plat get-nom) es picant crlf)
En el caso de que el slot sea a su vez una instancia se puede utilizar para obtener los valores de estainstancia en la condicion como se explica en la pregunta anterior
357 Tengo problemas con instancias obtenidas del slot de otra instancia en el patroacuten de unaregla
Este problema aparece cuando el patron de una regla instancia una variable a un nombre de instancia yesta no esta definida en el modulo de la regla por ejemplo si la regla siguiente pertenece a un modulo queno es el de la instancia
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4
=gt5 (print t preu (send v get-Preu) crlf)6 )
La regla se quejaraacute de que la instancia no existe al enviarle el send ya que solo se busca la instancia dentrodel moacutedulo de la regla y no en los importados Para arreglar esto se puede usar la funcioacuten (instance-address[ltMODULOgt|] ltINSTANCIAgt) que busca la direccion de la instancia en un modulo concreto o en todos losmoacutedulos que se importan () Deberiacuteamos entonces escribir la regla
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send (instance-address v) get-Preu) crlf)6 )
358 iquestCoacutemo realizar una buacutesqueda de instancias que cumplan unas restricciones
CLIPS nos ofrece varias funciones de buacutesqueda de instancias que cumplan unas determinadas restriccionesque a nosotros nos interese
La funcioacuten find-instance Esta funcioacuten devuelve la primera instancia que cumple todas las restric-ciones indicadas
La funcioacuten find-all-instances Esta funcioacuten devuelve todas las instancias que cumplen las restric-ciones indicadas
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2659
35 Las clasesinstancias 23
La sintaxis de ambas funciones es igual exceptuando el nombre de la funcioacuten(find-all-instances (clase_instancias) (restricciones))A continuacioacuten se muestran varios ejemplos
(bind rectangulos (find-all-instances ((inst Rectangulo)) (gtinstaltura 10))) Des-pueacutes de ejecutar esta funcioacuten en la variable rectangulos habraacute una lista con todas las instancias de la
clase Rectangulo cuya altura sea superior a 10(bind rectangulos (find-all-instances ((inst Rectangulo)) (and (gtinstaltura 10) (=instanchura 7)))) Este trozo de coacutedigo hace que en la variable rectangulos se guarde una listade las instancias de la clase Rectangulo que tienen una altura superior a 10 y una anchura igual a 7
Estas funciones que CLIPS nos ofrece tienen otra funcionalidad y es que podemos realizar buacutesquedas deconjuntos de instancias
(bind rectangulos (find-all-instances ((a Rectangulo) (b Rectangulo)) (= aalturabaltura))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas de instancias de laclase Rectangulo que tienen la misma altura
Por uacuteltimo es necesario comentar que se pueden realizar buacutesquedas de conjuntos de instancias que seande distintas clases
(bind figuras (find-all-instances ((rect Rectangulo) (circ Circulo)) (= rectalturacircradio))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas ltrectangulocirculogtque cumplan que la altura del rectaacutengulo sea igual al radio del ciacuterculo
Existen maacutes comandos para obtener instancias pero son menos utilizadas a nivel baacutesico como pueden serany-instancep do-for-instance do-for-all-instances y delayed-do-for-all-instances
359 iquestCoacutemo se interactuacutea con objetos
La interaccioacuten con objetos se efectuacutea mediante lo que se denomina mensaje
(defmessage-handlerltnombre-clasegtltnombre-mensajegt[lttipo-handlergt] [ltcomentariogt]ltparaacutemetrogt [ltparaacutemetro-comodiacutengt])ltaccioacutengt
)
Un gestor de mensajes consta de 7 partes
1 Nombre de clase a la que el gestor estaraacute asociado
2 Nombre del mensaje
3 Tipo de gestor (Nosotros habitualmente usaremos primary que viene por defecto)
4 Comentario (opcional)
5 Lista de paraacutemetros6 Paraacutemetro comodiacuten (para gestionar muacuteltiples paraacutemetros)
7 Secuencia de acciones o expresiones que seraacuten ejecutadas por el gestor
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2759
24 Capiacutetulo 3 CLIPS
Enfocado a la praacutectica de CLIPS la maacutes comuacuten es que queramos interactuar con objetos para
1 Imprimir los objetos Un ejemplo
1 (defmessage-handler avion imprimir-beneficio ()
2 Para implementar funciones calculadas asociadas al objeto Un ejemplo
1 (defmessage-handler avion calcular-beneficio ()2 ( selfplazas-ocupadas selfprecio-billete))3 )
Como se puede observar el paraacutemetro impliacutecito self contiene la instancia activa para este mensaje
3510 iquestComo se interactuacutea con las instancias de los objetos
Podremos interactuar entre las instancias de los objetos mediante la funcioacuten send
(send ltexpresioacuten-de-objetogtltnombre-de-mensajegtltexpresioacutengt)Donde se toman como argumentos el objeto destino del mensaje el mensaje mismo y otros paraacutemetros
que debieran ser pasados a los gestoresParticularmente en el aacutembito de la praacutectica usualmente necesitaremos utilizar el envioacute de mensajes de
tipo get put and delete Estos mensajes tiene la siguiente sintaxis
get-ltnombre-atributogt
put-ltnombre-atributogt
delete
Aquiacute tenemos un ejemplo de como utilizarlo recordando que ponemos entre corchetes la instancia la cualse enviacutea el mensaje
(defclass avion (is-a USER)(role concrete)(slot precio-billete (create-accessor read) (default 34))(slot plazas-ocupadas (create-accessor write) (default 0)))
Clase creada
gt(make-instance a of avion) Creacioacuten de una instancia de avion[a]
gt(send [a] get-precio-billete) Obtencioacuten de un slot34 Resultado obtenidogt(send [a] put-plazas-ocupadas 100) Modificacioacuten de un slotgt(send [a] delete) Eliminacioacuten de la instanciaTrue
3511 Uso de make-instance
Cuando queremos crear una instancia de una clase para ir rellenandola con los resultados o datos quevayamos obteniendo se haria lo siguiente
(bind variable_instancia (make-instance nombre_instancia of nombre_clase))
Una vez creada podemos jugar con dicha instancia en las diferentes reglas siempre que la llamemos enlos activadores
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2859
35 Las clasesinstancias 25
(defrule reglavar_instancia lt- (object (is-a nombre_clase))=gt
)
De esta manera dentro de la regla podemos hacer acciones con la instancia por ejemplo(send var_instancia put-articulo articulo_ejemplo)
3512 Como generar automaacuteticamente nombres de instancia
En ocasiones queremos crear instancias en reglas y queremos que su nombre sea distinto del de otrasque ya tenemos Para ello podemos utilizar las funciones gensym y gensym La primera genera un siacutembolodel estilo genN donde N es un nuacutemero La segunda hace lo mismo pero aseguraacutendose de que ese siacutembolono exista ya Se puede reiniciar el contador que usan estas dos funciones con el operador (setgen ltnumgt)donde ltnumgt es el nuacutemero por el que queremos que empiecen ahora los siacutembolos
Para usar esto para generar el nombre de una instancia podemos hacer
(make-instance (gensym) of ltclasegt)
Cada vez que se ejecute se generaraacute un nombre de instancia nuevoSi creamos instancias de diferentes clases y queremos que las instancias tengan nombres que podamos
identificar podemos concatenar siacutembolos a los siacutembolos generados por gensym por ejemplo
(make-instance (sym-cat pepe- (gensym)) of ltclasegt)
generaraacute una instancia con el nombre pepe-genN
3513 Com fer un getset drsquoun slot drsquouna classe
Per consultar el valor drsquoun slot drsquouna classe ho podem fer enviant-li un missatge de la seguumlent manera
(send ltVARIABLEgt get-ltNOM_ATRIBUTgt)
Per exemple si tenim una instagravencia de la classe Plat ( instancia ) i volem saber el valor del seu slotnom
(send instancia get-nom)
Per assignar un valor a un slot drsquouna drsquoinstagravencia hem drsquoenviar-li un missatge de la seguumlent manera
(send ltVARIABLEgt put-ltNOM_ATRIBUTgt ltVALORgt)On ltVALORgt pot ser un valor o un megravetode que retorni un valor
(send instancia put-nom nom)
3514 iquestCoacutemo acceder a una instancia cuyo nombre conocemos
Si conocemos el nombre de una instancia y necesitamos acceder a ella es decir necesitamos enviarle alguacutenmensaje mediante la funcioacuten send podemos hacerlo directamente escribiendo en lugar de la variable quealmacena la instancia el nombre de la instancia entre corchetes [ ] A continuacioacuten se muestra un ejemplo
(bind altura_rect1 (send [rect1] get-altura))
En este caso se guardaraacute en la variable altura_rect1 el valor de la altura de la instancia que tiene comonombre rect1
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2959
26 Capiacutetulo 3 CLIPS
3515 Obtenir el nom drsquouna classe
Si tenim una instagravencia drsquouna classe i volem saber el nom de la classe (uacutetil si tenim una bona taxonomiade classes) ho podem fer amb el megravetode (class ltINSTANCIAgt)
Si per exemple imaginem que tenim la classe Actor la qual teacute com subclasses la classe APrincipalASecundari i ACameo Imaginem que estem tractant amb instancies drsquoactors i volem saber si la instanciaque estem tractant es de la classe APrincipal
Ho hauriacuteem de fer de la seguumlent manera
(eq (class instancia) APrincipal)
Fixem-nos que APrincipal eacutes un siacutembol no un String (un truco eacutes fixar-se en que no teacute cometes) Si vol-gueacutessim comparar-ho amb un String (per exemple un String introduiumlt per lrsquousuari) ho podriacuteem transformara un String amb el megravetode str-cat
(eq (str-cat (class instancia)) Principal)
3516 Como convierto un INSTANCE-ADRESS en un INSTANCE-NAME
En alguacuten momento nos podemos encontrar con la situacioacuten de que disponemos de un puntero a unainstancia y necesitamos su nombre o lo contrario En ambos casos podemos usar la funcioacuten instance-nameSu funcionamiento es bidireccional podemos introducirle un instance-name y nos devolveraacute un instance-adress y viceversa
1 (defrule imprimir-nombre2 estlt-(object (is-a Estudiante) (edad 25))3 =gt4 (printout t (instance-name est) crlf)5
)
3517 Com iterar a traveacutes drsquoun multi-slot
El seguumlent tambeacute eacutes vagravelid com exemple de com iterar a traveacutes drsquouna llistaImaginem que tenim una instagravencia de la classe Plat a la varible (plat) la qual teacute un multi-slot drsquoinstagravencies
de la classe Ingredient Imaginem que volem imprimir per pantalla el nom drsquoaquests ingredients (slot nomde la classe Ingredient) Necessitarem iterar sobre la llista drsquoingredients
1 (bind i 1)2 (while (lt= i (length$ (send plat get-ingredients)))3 do4 (bind ingredient (nth$ i (send plat get-ingredients)))5 (printout t (send ingredient get-nom) crlf)6 (bind i (+ i 1))7 )
El megravetode (nth$ ltINDEXgtltLLISTAgt) et retorna lrsquoelement situat a INDEX de LLISTAEl megravetode (length$ ltLLISTAgt) retorna el nuacutemero drsquoelements de LLISTA
3518 Coacutemo modificarinsertarborrar valores en un multislot
Los valores de un multislot se pueden cambiar usando la funcioacuten slot-replace$ La sintaxis es la siguiente
(slot-replace$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt ltvalorgt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3059
35 Las clasesinstancias 27
Donde ltiniciogt y ltfingt son el rango de posiciones del multislot que se quiere modificar y ltvalorgtson los valores que queremos reemplazar Obviamente deberaacute haber tantos valores como posiciones hayamosindicado en el rango
Para insertar nuevos valores podemos usar la funcioacuten slot-insert$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltposgt ltvalorgt)
El valor se inserta delante de la posicioacuten indicada si la posicioacuten es mayor que la longitud del multislot secolocaraacute al final
Para borrar elementos de un multislot podemos usar la funcioacuten slot-delete$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt)
Se borraraacuten los elementos que estaacuten en el rango indicado
3519 Coacutemo recorrer un atributo multievaluado
Supongamos que la variable respuesta tiene una lista de instancias
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 aquiacute hacemos lo que queramos4 )5 )
Loop-for-count funciona como un for primero la variable que haraacute de contador luego el valor de origeny luego el valor final Para controlar el final usamos la funcioacuten que he explicado antes i tomaraacute valoresdesde 1 hasta n asiacute que usando la funcioacuten nth$ obtendremos cada uno de los elementos La variable auxiraacute teniendo cada uno de los valores
3520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz)
Es igual que antes pero con dos bucles
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 (bind aux2 (send aux get-slot_que_queremos))4 (loop-for-count (j 1 (length$ aux2)) do5 (bind aux_final (nth$ j aux2))6 aquiacute ya podemos trabajar con el elemento en concreto7 )8 )
Supongamos que respuesta tiene una lista de instancias con el primer bucle haremos lo mismo que antes ir
iterando por esas instancias Una vez que tenemos cada instancia con aux2 con el segundo bucle iteraremosdentro de sus instancias interiores
Por ejemplo si tenemos varios equipos de fuacutetbol y cada equipo tiene varios jugadores en el primer bucleestamos iterando entre los equipos y en el segundo entre los jugadores de cada equipo en particular
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3159
28 Capiacutetulo 3 CLIPS
3521 Com puc esborrar una instagravencia
Per esborrar una instagravencia (per exemple segons la informacioacute que proporcioni lrsquousuari podem deduir queuna segraverie drsquoinstagravencies eacutes impossible que es facin servir per a la solucioacute) ho podem fer enviant un missatgedelete a la instagravencia eacutes a dir (send ltINSTANCIAgtdelete)
(send inst delete)
Un megravetode que podria ser uacutetil de la cara a la pragravectica podria ser el seguumlent
1 (defrule elimina-instancia2 (declare (salience 10))3 elimina-fact lt- (elimina-inst inst)4 =gt5 (send inst delete)6 (retract elimina-fact)
Imaginem que per exemple que volem eliminar una llista drsquoinstagravencies Per eliminar-les podriacuteem recoacuterrerel llistat marcant les instagravencies que volem esborrar afegint el seguumlent fet
(assert (elimina-instancia inst))
Aixiacute com que elimina-instancia teacute un salience alt esborraria les instagravencies marcades quan tingueacutes ocasioacuteDrsquoaquesta manera ens estalviem el problema de recoacuterrer un llistat drsquoinstagravencies amb un iterador mentre
anem eliminant els elements de la llista cosa que pot donar problemes amb lrsquoiterador
3522 Com imprimir una instagravencia
Per imprimir una classe (uacutetil per exemple per mostrar el resultat final) el millor eacutes definir message-handlersPer exemple imaginem que tenim una classe Plat la qual teacute un slot nom de tipus String Si volgueacutessimimprimir per pantalla un missatge que digueacutes
El nom del plat eacutes ndashltnom del platgtndash
Hauriacuteem de definir un message-handler que simplement imprimiacutes per pantalla el valor de lrsquoslot de laforma
(defmesssage-handler ltCLASSNAMEgt ltMESSAGENAMEgt primary ()ltCODIgt
)
Per el cas de lrsquoexemple
1 (defmessage-handler Plat print primary ()2 (printout t -- selfnom --) )3 )
Per cridar-ho nomeacutes caldragrave enviar-li un missatge a la instagravencia amb el nom del message-handler (enaquest cas print)
(send instancia print)
Un message-handler pot cridar a altres message-handlers amb el que es poden encadenar diverses instagraven-cies Per exemple imaginem que tenim la classe Menuacute la qual teacute un atribut plats que eacutes un llista drsquoinstagravenciesde la classe Plat Dintre del message-handler menuacute podriacuteem iterar a traveacutes de la llista de plats enviant elmissatge print que hem definit anteriorment
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3259
36 Programacioacuten 29
3523 Com es navega entre instagravencies relacionades
Per exemple tinc una instagravencia iA que teacute un slot anomenat slotB que eacutes una instagravencia drsquoun frame B Vullsaber el nom de la instagravencia associada al slotB de iA Ho pots fer aixiacute
(bind B (send iA get-slotB))(bind res (send B get-nom))
Si estagraves dins drsquouna condicioacute ho pots simplificar de la forma seguumlent
(bind res (send iAslotB get-nom)
Els dos punts soacuten equivalents al punt de Java
36 Programacioacuten
361 Com introduir un comentari
Els comentaris a CLIPS va darrere de un com per exemple
Comentari
Tambeacute podem afegir comentaris a les nostres regles deffacts deftemplates etc Generalment van darrereel nom de la estructura per exemple
1 (defrule neteja regla per la qual si la cuina estagrave bruta srsquoafegiragrave una tasca de2 neteja
3 (estat-cuina bruta)4 =gt5 (assert (tasca netejar))6 )
362 Referenciar el valor null a CLIPS
Per referenciar el valor null a clips es fa amb el simbol nil Per exemple si volem saber si una instagravenciainst es null ho podriacuteem fer de la seguumlent manera
(eq inst nil)
363 Formas de recorrer una lista
Para recorrer una lista disponemos de diferentes opciones en este FAQ explicaremos como crear unaestructura tipo ldquoWHILErdquo y tipo ldquoFORrdquo
1 While Esta regla se ejecuta hasta que la expresioacuten a evaluar sea falsa Este tipo de estructura se rigepor seguir la sintaxis while - do y se construiriacutea de la siguiente forma
(while ltexpresioacutengt[do] ltaccioacutengt)
Doacutende dependiendo del valor de ltexpresioacutengt
Valor TRUE Se realizaraacute la accioacuten ltaccioacutengt i se volveraacute a evaluar ltexpresioacutengt
Valor FALSE No se ejecutaraacute la accioacuten ltaccioacutengt
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3359
30 Capiacutetulo 3 CLIPS
2 For Esta regla sirve para ejecutar un bucle N (final - inicio) veces Este tipo de estructura se rige porseguir la sintaxis loop-for-count y se construiriacutea de la siguiente forma
(loop-for-count (ltvargtltiniciogtltfinalgt) [do] ltaccioacutengt)
Doacutende
ltvargt Variable que se usara como iacutendice
ltiniciogt Valor inicial que tendraacute ltvargt
ltfinalgt Ultimo valor que tendraacute la variable ltvargt
ltaccioacutengt Accioacuten que es realizaraacute hasta que ltvargt tenga el valor de ltfingt
364 Formas de elegir una opcioacuten
En este apartado explicaremos como crear una estructura if y una estructura switch
If Este tipo de estructura se rige por seguir la sintaxis if - then - else y se construiriacutea de lasiguiente forma
(if ltexpresioacutengtthen ltaccioacutengt[else ltaccioacuten2gt])
Doacutende dependiendo del valor de ltexpresioacutengt
bull Valor TRUE Se realizaraacute la accioacuten ltaccioacutengtbull Valor FALSE Se realizaraacute la accioacuten ltaccioacuten2gt (en caso de haber)
Switch Este tipo de estructura se rige por seguir la sintaxis switch - opciones y se construiriacutea dela siguiente forma
(switch ltexpresioacuten-testgt(case OPCION1 then ACCION1)(case OPCION2 then ACCION2)
([default] ACCION-DEFAULT)
)
Doacutende dependiendo del valor de ltexpresioacuten-casegt se ejecutaraacute una ltaccioacutengt en particular Si nin-guna ltopcioacutengt es correcta se ejecutara la ltaccioacuten-defaultgt
365 Funciones con la clase String
Habitualmente trabajaremos con Strings o cadena de Strings CLIPS proporciona una serie de herramien-tas para trabajar con esta clase
1 Convertir string a MAYUacuteSCULAS A veces es conveniente tener todos los caracteres en mayuacutesculaspara no tener problemas de comparaciones o simplemente por convenio Para ello CLIPS dispone dela funcioacuten upcase la cual convierte a mayuacutesculas un siacutembolo o string
(upcase ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplos
(upcase Ccedillips es divertido) rarr CcedilLIPS ES DIVERTIDO
(upcase Clips_es_divertido) rarr CLIPS_ES_DIVERTIDO
2 Convertir string a MINUacuteSCULAS la funcioacuten es downcase
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3459
36 Programacioacuten 31
3 Concatenacioacuten de strings Tambieacuten es de gran utilidad poder juntar dos o maacutes paraacutemetros en un solostring Todo paraacutemetro a juntar deben ser de uno de los siguientes tipos symbol String integer floato instance-name
(str-cat parametro1 parametro2 parametroN )
Ejemplo
(str-cat IA nota 10) rarr IAnota10
4 Comparacioacuten de strings Funcioacuten que nos indica si dos strings son iguales
(str-compareltexpresioacuten-simboacutelica-o-de-cadenagtltexpresioacuten-simboacutelica-o-de-cadenagt
)
Esta funcioacuten devuelve
0 Si ambos strings son iguales1 Si el primer string es mayor que el segundo string-1 Si el primer string es menor que el segundo string
5 Longitud de un string Muchas veces es de gran utilidad saber que tamantildeo tiene un string
(str-length ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplo
(str-length Inteligencia Artificial) rarr 23
366 iquestCoacutemo obtener el contenido de una variable en un string
Para conseguir un string a partir de un integer float symbol instance-name debes utilizar el comandostr-cat Si a la funcioacuten le pasamos como paraacutemetros varios elementos los transformaraacute a string y losconcatenaraacute La sintaxis de esta funcioacuten es la siguiente (str-cat elementos) Esta funcioacuten la usaremossobre todo cuando queramos realizar comparaciones entre el contenido de una variable y un string ya quepreviamente necesitaremos usar la funcioacuten str-cat para pasar el contenido de la variable a string y realizarde este modo la comparacioacuten de forma correcta
367 iquestComo se crea una lista
Con create$ Todos los operadores sobre listas llevan el siacutembolo $ al final Igual que con las variables sedebe usar bind siempre que se desee modificar una lista
(bind lista (create$ a b c))
368 iquestComo borro un elemento de una lista
Con delete$Usa la siguiente sintaxis(delete$ ltlistagt ltindice-iniciogt ltindice-finalgt)Se borraraacuten todos los elementos del rango entre las posiciones inicio y final ambas incluidas Tambieacuten exis-
tedelete-member$ (delete-member$ ltlistagt ltelementogt) Borraraacute todas las apariciones del elemento enla lista
(delete$ (create$ a b c d e f) 3 5) minusrarr (a b f)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1059
2 Protegravegegrave
Para saber como funciona Protegravegegrave usad la ayuda de la aplicacioacuten y el material correspondiente estascuestiones se refieren a como integrar lo que se desarrolla en Protegravegegrave con CLIPS
21 Coacutemo cambiar el nombre de las instancias en Protegravegegrave
En realidad no se trata de cambiar el nombre de las instancias sino de darle algo maacutes visual que unnuacutemero para poder hacer las relaciones Si os encontraacuteis en la pestantildea de crear instancias el uacuteltimo botoacutenes una flecha hacia abajo Darle y luego set display slots Ahiacute debeacuteis indicar con que slot quereacuteis referenciarla instancia
22 Com exporto una ontologia de Proteacutegeacute a CLIPS
A Proteacutegeacute ves a File rarr Export to Format rarr CLIPS Un cop fet aixograve es crearan dos nous fitxers ambles classes i instagravencies de lrsquoontologia (nompont i nompins respectivament)
Despreacutes obre aquests dos fitxers amb un editor de text i copia el seu contingut al fitxer CLIPS de laseguumlent manera
copy-paste de nompont
(definstances instanciescopy-paste de nompins)
23 iquestCoacutemo exporto una ontologiacutea de Proteacutegeacute a CLIPS (2a posibilidad)
Alternativamente a hacer corta y pega de los ficheros de protege en el fichero de CLIPS se puede crearun fichero que cargue todos los ficheros sin tener que juntarlos
Para ello hay que crear un fichero que incluya las oacuterdenes de carga de los diferentes ficheros Por ejemplopodemos llamar a este fichero cargaclp El contenido de este fichero seraacute
(load PATHnompont)(load-instances PATHnompins)(load PATHfichero-de-reglasclp)
Donde PATH es el directorio donde se encuentran vuestros ficherosEste fichero se ha de cargar desde el inteacuterprete mediante la orden batch ((batch cargaclp)) o con
la opcioacuten de menuacute load batch Usando la instruccioacuten load-instances evitamos tener que antildeadir al fichero de instancias la instruccioacuten
definstances
24 Per quegrave em doacutena error CLIPS al tenir una instancia que hereta de meacutesdrsquouna classe
7
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1159
8 Capiacutetulo 2 Protegravegegrave
Proteacutegeacute permet lrsquoheregravencia muacuteltiple en instagravencies perograve CLIPS no En CLIPS nomeacutes poden tenir heregravenciamuacuteltiple las classes perograve no les instagravencies Aixoacute es aixiacute perque el lenguatge de CLIPS es orientat a objectesno es realment un lenguatge drsquoontologiacutees
La manera meacutes senzilla de simular-ho si les clases no tenen ancestres comuns eacutes tenir classes que repre-sentin aquesta heregravencia muacuteltiple i fer que les instagravencies pengin drsquoelles que es com es faria a un llenguatge
orientat a objectesEn el cas de tenir ancestres comuns no es pot fer lrsquounica manera es duplicar la instancia amb nomsdiferents i penjar-les de les clases on es vol tenir-la
De totes maneres el CLIPS permet recuperar fagravecilment les instagravencies que tenen un valor especiacutefic en unslot pel qual el meacutes senzill eacutes tenir una uacutenica jerarquia i incloure altres possibles classificacions com a slotsencara que obviament perdrem la posibilitat de fer servir una jerarquia de valors per aquest
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1259
3 CLIPS
31 Instalacioacuten del CLIPS
311 iquestCoacutemo instalar CLIPS
La herramienta CLIPS es multiplataforma y esta disponible para los tres SO maacutes utilizados MicrosoftWindows Linux y Mac OS X
iquestCoacutemo instalar CLIPS en Windows
Primero de todo debemos bajarnos el programa de la paacutegina oficial de CLIPS accesible desde este link
(httpclipsrulessourceforgenet) Desde el aacuterea de descarga os podreis bajar el instalador parawindows
iquestCoacutemo instalar CLIPS en Linux
En muchas distribuciones de Linux CLIPS esta disponible como un paquete adicional el paquete sueleinstalar la versioacuten con interfaz graacutefico Si no encuentras el paquete especiacutefico para la distribucion que usassiempre puedes compilarlo a partir del paquete con los fuentes
Tambieacuten estaacute la posibilidad de utilisar el emulador de windows WINE Una vez instalado el emulador sepuede instalar CLIPS y este funcionaacute igual que sobre windows
iquestCoacutemo instalar CLIPS en Mac OS X
Primero de todo debemos bajarnos el programa de la paacutegina oficial de CLIPS accesible desde este link(httpclipsrulessourceforgenet ) Desde el aacuterea de descarga podeis bajar el intalador para MACOS X
312 Entorn finestres VS Consola de comandes
Encara que lrsquoentorn de finestres eacutes molt meacutes intuiumltiu CLIPS a la seva versioacute en liacutenea de comandes eacutes moltmeacutes ragravepid (segurament perquegrave no ha de mostrar en tot moment lrsquoagenda de fets les instancies les regles
etc)La diferencia de velocitat eacutes molt notable en cas de problemes de rendiment o de sensacioacute que lrsquoentorn
de finestres es queda penjat (o directament es tanca sense previ aviacutes) recomanem provar la versioacute en liacuteneade comandes
32 Los hechos
321 iquestQueacute es un hecho en CLIPS
Conceptualmente un hecho representa un dato abstracto del cual almacenamos valores Se puede vercomo una lista de campos donde el primer campo hace referencia al ldquodatordquo al cual le asignamos una listade valores que le suceden teniendo una relacioacuten entre siacute
Formalmente el primer campo es un siacutembolo y los campos restantes son valores
9
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1359
10 Capiacutetulo 3 CLIPS
(siacutembolo valor1 valor2 valorN)
322 iquestQueacute es un hecho ordenado (order Facts)
Un hecho ordenado tienen formato libre por lo tanto no existe restriccioacuten alguna en el orden de los campos
Los campos de un hecho ordenado pueden ser de cualquier tipo primitivo de datos excepto el primero quedebe ser un siacutembolo Como ejemplo tenemos
1 (hermanos Antonio Javier Carlos)2 (padre Pedro David)
323 iquestQueacute es un hecho no ordenado (deftemplates facts)
A traveacutes de los hechos no ordenados podemos abstraernos de la estructura de un hecho asignado unnombre a cada campo (slots)
1 (deftemplate nombre-template comentario2 (slot nombre-slot (tipo-del-slot))3 (multislot nombre-slot (tipo-del-slot))4 )
Por ejemplo
1 (deftemplate avioacuten2 (slot nombre_avion (type STRING))3 (slot compania (type STRING))
4 (slot numero_plazas (type INTEGER) (default 100))
324 iquestPuedo tener un vector como slot
Si debe declararse como multislot
325 iquestPuedo asignar propiedades a los slots
Siacute las maacutes importantes son
Type El tipo de dato primitivo que contiene (en mayuacutesculas)
Allowed-X Permite especificar un conjunto de valores permitidos Siendo X un tipo de datos primitivo(en minuacutesculas y plural) rarr si el slot toma un valor del tipo X debe pertenecer a los valores permi-tidos X puede ser values especificando entonces todos los valores posibles que puede tomar el slotindependientemente del tipo de dato
Range Especifica un rango para slots numeacutericos
Cardinality Nuacutemeros miacutenimo y maacuteximo de elementos que puede tener un multislot
Default Valor por defecto Si ponemos NONE como valor por defecto significaraacute que no se podraacute crear la
instancia a no ser que se especifique el valor de ese slot
1 (deftemplate estudiante2 (slot edad (type INTEGER) (range 0 99))
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1459
32 Los hechos 11
3 (multislot asignaturas (type STRING) (cardinality 1 5))4 (slot num-carreres (default 1))5 (multislot notas (allowed-strings MH NP))6 )
326 iquestQueacute debo utilizar hechos ordenados o no ordenados
Como se puede intuir si tenemos un conjunto de hechos los cuales conceptualmente pertenecen al mismoaacutembito seraacute una solucioacuten maacutes elegante agruparlos a traveacutes de un deftemplate En caso que tengamos quealguacuten hecho aislado seraacute mas sencillo declararlo como un hecho ordenado
327 Fets o Objectes
Veient la definicioacute de deftemplate podem confondrersquons a lrsquohora de decidir si fer servir fets o fer servirobjectes
Deixant de banda altres diferegravencies ja comentades (les classes suporten jerarquia de classes heregravenciaetc) els objectes es fan servir per representar el coneixement (mitjanccedilant un conjunt drsquoinstagravencies)
Aixiacute que generalment farem servir classes i objectes per representar coneixement mentre que farem servirels fets per portar control sobre lrsquoexecucioacute del problema
Per exemple podriacuteem definir un deftemplate per emmagatzemar un resultat o per poder controlar lrsquoestatde lrsquoexecucioacute
A la pragravectica de Mikeo (penjada a la web de lrsquoassignatura) teniacuteem un deftemplate habitacion-actual
1 (deftemplate habitacion-actual2 (slot habitacion)3 (slot area-restante)4
(slot presupuesto-restante)5 (slot precio-total)6 (slot prioridad-actual)7 )
Amb el qual controlagravevem la construccioacute drsquouna habitacioacute Assignagravevem una instagravencia de la classe habita-cioacute al slot habitacion de habitacion-actual i mitjanccedilant una segraverie de regles que feien unificacioacute ambhabitacion-actual actuagravevem sobre lrsquohabitacioacute drsquouna manera o drsquoun altre
328 Creacioacuten de hechos (assertdeffacts)
Si queremos crear un solo hecho utilizaremos el comando assert Por ejemplo (assert (casa roja))Si por el contrario queremos crear una estructura ordenada de hechos utilizaremos deffacts
(deffacts mishechos (casa roja) (pelota azul))
329 Modificar un fet
Per modificar un fet (per exemple molt uacutetil si estem treballant amb deftemplates) ho podem fer mitjanccedilant(modify ltINSTANCIAgtltFETSgt)
Per exemple si tingueacutessim el deftemplate persona
1 (deftemplate persona2 (slot nom)3 (slot edad)4 (slot dni)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1559
12 Capiacutetulo 3 CLIPS
I hagueacutessim afegit el fet
(assert (persona (nom Pepe)(edad 25)(dni 46974431)))
I el fet
(assert (aniversari 46974431))
Podriacuteem tenir la seguumlent regla
1 (defrule aniv2 aniversari lt- (aniversari dni)3 persona lt- (persona (edat edat)(dni dni))4 =gt5 (retract aniversari)6 (modify persona (edat (+ 1 edat)))7 )
La qual srsquoactivaragrave si hi ha un fet aniversari drsquouna persona Fent servir el dni indicat al fet aniversaribusquem el fet persona que teacute el mateix dni Deixem el valor edat a la variable edat per poder treballaramb ella meacutes endavant
Hem agafat tambeacute la direccioacute del fet aniversari per tal de poder esborrar-lo de la base de fets Aixograve srsquohafet per dues raons
Primer per mantenir meacutes neta la base de fets Segon i meacutes important Com que hem canviat el fet laregla tornaragrave a fer unificacioacute amb el fet (perquegrave ara eacutes diferent) amb la regla aniversari amb el que entrariadintre drsquoun bucle sense fi on srsquoaniria incrementant lrsquoedat de la persona
Un cop hem esborrat el fet aniversari incrementem en 1 el valor del slot edat de la persona fent servirla variable edat que hem declarat a la part esquerre de la regla
El comportament de modify es fer un retract del fet a la base de fets i despreacutes fer un assert amb els nous
valors Si volem canviar mes drsquoun slot del fet es convenient canviar-los tots a la vegada La raoacute es que cadavegada que fem un modify lrsquoapuntador al fet es modifica i lrsquoapuntador que tenim a la variable que hem fetservir ja no es vagravelid
Si no temim mes remei que fer la modificacioacute del fet pas a pas srsquoha de saber que la crida a modify retornalrsquoapuntador al nou fet Si el guardem a altra variable (o a la mateixa) podrem continuar modificant el fetamb la nova referegravencia
3210 Com elimino un fet de la base de fets
Per eliminar un fet de la base de fets ho podem fer amb la paraula clau (retract ltFETgt) on ltFETgt eacutes
un punter al fetPer obtenir aquest fet ho podem fer fent servir ltVARgtlt- ltFETgt a la part esquerre de la reglaPer exemple
1 (defrule accionsvent2 vent lt- (vent tipus)3 =gt4 (switch tipus5 (case poc then (assert (accio persiana0)))6 (case normal then (assert (accio persiana50)))7 (case molt then (assert (accio persiana100)))8 )9 (retract vent)
10 )
Afegiragrave fets per realitzar les accions pertinents i esborraragrave el fet de la base de fets
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1659
33 Variables 13
33 Variables
331 Variables a CLIPS
No cal declarar una variable (ni el seu tipus) nomeacutes cal afegir un interrogant al comenccedilament drsquoun simbol
per indicar que eacutes una variableCLIPS srsquoencarrega del control de tipus depenent del que assignem a la variablePer exemple testvar correspondria a la variable testvar Si per exemple assigneacutessim lrsquoenter 3 a
testvar CLIPS tractaria la variable com una variable entera
332 Com assignar un valor a una variable
Per assignar un valor a una variable es fa servir el megravetode (bind) amb la forma
(bind ltVARIABLEgtltVALORgt)
On ltVALORgt pot ser un valor o un megravetode que retorni un valor Per exemple si volem assignar un 4 a lavariable var
(bind var 4)
O per exemple podriacuteem assignar a la variable var la suma de 2 meacutes 2
(bind var (+ 2 2))
333 iquestCoacutemo declarar variables globales
Para crear una variable global hay que meterla dentro de la construccioacuten defglobal La declaracioacuten de la
variable seguiraacute el modelo nombreVariable = expresioacutenPor ejemplo
(defglobal presupuesto = 0)
Pueden aparecer en la parte izquierda de las reglas si no son utilizadas para asignar un valor y su cambiono activa reglas pero no pueden ser paraacutemetros de funciones ni meacutetodos
334 iquestCoacutemo trabajar con variables sumando restando por ejemplo contadores
La mejor forma es con variables globales se definen asiacute (defglobal x = 0) puede ser el valor quequeramos tanto nuacutemero string Y si queremos sumarle 10 por ejemplo
(bind x (+ x 10))
Las variables locales como por ejemplo x soacutelo tienen valor mientras dura su ejecucioacuten y eso suele ser enesa misma liacutenea o en un bucle Si le damos valor a x y luego preguntamos por ella nos diraacute que no existe
335 Quina diferegravencia hi ha entre les variables del tipus nom_variable i les del tipus $nom_variable
Les primeres contenen un sol valor i les segones en poder contenir meacutes drsquoun (o cap)
336 Quegrave significa lrsquointerrogant () quan va sol
Eacutes una variable anogravenima Pots utilitzar sense posar-hi cap nom si no trsquointeressa el valor en concret Perexemple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1759
14 Capiacutetulo 3 CLIPS
(Primer filtre_preu )
Aquesta condicioacute significa ldquosi el fet (Primer filtre_preu) teacute algun valorrdquo O sigui que si tingueacutessimel fet (Primer filtre_preu ok) es compliria la condicioacute (i si en comptes de ldquookrdquo fos ldquopatatardquo tambeacute escompliria) En canvi si el fet fos uacutenicament (Primer filtre_preu) no es compliria la condicioacute
337 Quegrave significa el dogravelar ($) quan va sol
Eacutes com lrsquointerrogant perograve admet meacutes drsquoun valor Per exemple
(Primer filtre_preu $ ok)
donaragrave cert pels fets de lrsquoestil (Primer filtre_preu patata ok) (Primer filtre_preu hola ok)(Primer filtre_preu patata hola ok) (Primer filtre_preu ok) Eacutes a dir no importa els valors quehi hagi entre filtre_preu i ok si al final hi ha un ok
338 iquestComo puedo ver los hechos presentes en un momento determinado
Abriendo la Facts Window en Window de la barra de menuacute
34 Las reglas
341 iquestCoacutemo construir una regla
Para construir una regla utilizaremos la construccioacuten defrule
Sintaxis
(defrule ltnombre-reglagt [ltcomentariogt][ltdeclaracioacutengt]ltelemento-condicioacutengt Parte izquierda (LHS)
=gtltaccioacutengt) Parte dcha (RHS) de la regla
Una regla consta de un conjunto de condiciones (antecedente) tambieacuten denominados elementos condicio-nales (EC) o parte izquierda (LHS) y de un conjunto de acciones (consecuente) tambieacuten denominado partederecha de la regla (RHS) La regla se activaraacute siempre que se satisfagan todos los EC mediante hechos oinstancias que los cumplan
Si se introduce en la base de reglas una nueva regla con el mismo nombre que el de una existente la nuevaregla reemplazaraacute a la antigua
Si una regla no tiene parte izquierda es decir no tiene elementos condicionales entonces el hecho(initial-fact) actuaraacute como el elemento condicional para ese tipo de reglas y la regla se activaraacute cadavez que se ejecute un comando reset
342 iquestCoacutemo gestionar la parte izquierda (LHS) de una regla
Declarar hechosSi no se especifica ninguna condicioacuten la regla se activaraacute siempre Una condicioacuten puede ser un simple hecho
(Ej vegetariano) o un hecho ordenado con unos valores concretos (Ej (persona (nombre Juan))) Si loque queremos es obtener el valor de un hecho insertaremos una variable en su lugar (Ej (persona (nombre
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1859
34 Las reglas 15
n)) ) Entonces entraraacute en la regla para cada valor posible que pueda asignar a la variable n a partir delos hechos
Si queremos indicar cualquier valor utilizaremos el siacutembolo y para cualquier lista el siacutembolo $ (Ej(evento ) (estilo $) ) Tambieacuten existe la opcioacuten de guardar en una variable una referencia al objetoEllo se consigue poniendo var lt- a su izquierda (Ej p lt- (persona (nombre Juan))) Se puede usarpor ejemplo para pasaacuterselo de paraacutemetro a una funcioacuten llamada en la RHS
Establecer condiciones
Ademaacutes podemos especificar restricciones adicionales sobre los valores que puede tomar un campo de unhecho Existen tres tipos principales de restricciones Conectadas (por orden de precedencia o prioridad)
not (~) Evita que cierto campo cumpla determinada restriccioacuten
and (amp) Combina dos restricciones conjuntivamente
or (|) Combina dos restricciones disjuntivamente
De predicado () Obliga a que cierto campo cumpla determinada condicioacuten (especificada por el predicado)
Por valor devuelto por una funcioacuten = Permite llamar a una funcioacuten y utilizar el valor devuelto pararestringir el valor que pueda tomar un campo de un hecho
Se puede comprobar si se cumple una determinada condicioacuten mediante el constructor test Dentro detest se pueden hacer llamadas a cualquier funcioacuten o predicado ya sea primitiva de CLIPS o definidapor nosotros
Combinar elementos
Los diferentes elementos de la parte izquierda van impliacutecitamente unidos mediante una AND que indicaconjuncioacuten No obstante podemos hacerlo expliacutecitamente mediante (and (cond1) (cond2)) aunque suelen
utilizarse para anidar ANDs dentro de ORsOR Sirve para hacer una disyuncioacuten (or (cond1) (cond2)) Es equivalente a escribir varias reglas en lasque cada una de ellas tenga uno de los componentes del OR en su parte izquierda y la misma parte derecha
NOT Sirve para detectar si no existe un determinado hecho (Ej (not (estilo sibarita)))exists Cuando a un conjunto de elementos se le antecede exists se comprueba que hay al menos un
hecho en la base de hechos que cumpla la condicioacuten (Ej (exists(bebida precio (ltprecio 5))) )forall Permite comprobar si todos los hechos que satisfacen un determinado patroacuten cumplen una serie
de condiciones (Ej (forall(plato (estilo moderno)))
343 iquestCoacutemo obtener la direccioacuten de hechos o instancias situados en LHS
En algunas ocasiones vamos a necesitar realizar alguacuten tipo de accioacuten en la parte derecha de las reglassobre hechos o instancias que cumplan unas determinadas condiciones Pero para ello necesitaremos primerotener acceso a estos elementos para despueacutes poder operar sobre ellos Esto lo conseguiremos guardando ladireccioacuten del elemento en una variable hacieacutendolo del siguiente modo
variable_direccion lt- (elemento)
Pongamos un ejemplo para ver realmente el funcionamiento y uso de esta posibilidad que CLIPS nosofrece
1 (defrule imprime-area2 instancia lt- (object (is-a Rectangulo))3 =gt4 (printout t Area del rectangulo (instance-name instancia)5 (send instancia calcula-area) crlf)6 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1959
16 Capiacutetulo 3 CLIPS
Cuando se ejecuta esta regla se imprimiraacuten las aacutereas de todas las instancias de la clase Rectangulo Enla parte izquierda de la regla lo que hacemos es guardar en la variable instancia la direccioacuten de la instanciade Rectangulo que estamos tratando en ese momento La regla se ejecutaraacute para todas las instanciasalmacenadas en la memoria de trabajo que cumplan la condicioacuten (is-a Rectangulo) es decir para todaslas instancias de la clase Rectangulo En la parte derecha de la regla donde se ejecutan las acciones podemosver que se imprimiraacute para cada instancia lo siguiente Area del rectangulo [nombre_instancia] aacuterea
del rectaacutengulo La funcioacuten instance-name nos devuelve el nombre de la instancia que le pasamos porparaacutemetro Ademaacutes hemos llamado al gestor de mensajes calcula-area para que nos devuelva el area delrectaacutengulo
344 iquestCoacutemo hacer sentencias or en la izquierda de las reglas
Con (or ) Si por ejemplo tenemos dos hechos (a) y (b) y queremos ejecutar la derecha de la reglacuando se cumpla uno de los dos tendremos que hacer (or (a) (b)) Atencioacuten porque la parte derecha seejecutaraacute tantas veces como veces se cumpla cada uno de los hechos si para nosotros existe tanto (a) como(b) la parte derecha se ejecutaraacute dos veces Para que soacutelo se usa una vez podemos hacer combinaciones de
or y and (funciona igual) o usar un patroacuten por ejemplo (persona Juan|Pedro) soacutelo se ejecutariacutea una vez
345 Com afegir una condicioacute a la part esquerre drsquouna regla
A vegades eacutes necessari que una regla srsquoinstanciiuml si es produeix una condicioacute especial (i no un fet) Per feraixoacute farem servir la comanda (test ltCONDICIOgt)
Per exemple imaginem que la nostre base de fets compte amb un fet (preu valor) amb un preudeterminat Imaginem que volem una regla que srsquoinstanciiuml quan aquest valor eacutes meacutes gran que 30
Per fer-ho fent servir tot el que hem explicat
1 (defrule preucar2 (preu preu)3 (test (gt preu 30))4 =gt5 (printout t El preu es mes gran que 30)6 )
Eacutes a dir si el preu eacutes meacutes gran que 30 srsquoimprimiragrave un missatge per pantallaAquestes condicions poden contenir ANDs i ORs de varies condicionsPer exemple
1 (defrule preulimit2 (preu preu)3 factminim lt- (preuminim minim)4 factmax lt- (preumaxim maxim)5 (test (and (gt preu minim) (lt preu maxim) ))6 =gt7 (retract factminim)8 (retract factmax)9 (printout t El preu estagrave dintre del rang)
On comprovarem si el preu estagrave dintre drsquoun rang determinat i en aquest cas esborra els fets que contenen
el magravexim preu i el miacutenim preu i mostra un missatge per pantalla
346 Puede una misma regla ejecutarse maacutes de una vez
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2059
34 Las reglas 17
Es muy importante entender que cada regla se ejecutaraacute una vez por cada combinacioacuten de valores en suLHS
1 (defrule regla2 (color col)3 (peso pes)4 =gt5
Si tengo tres colores y dos pesos asertados la regla se ejecutaraacute 6 veces una con cada combinacioacuten decolor y peso
347 Com puc definir lrsquoordre de les regles
La idea drsquoun sistema basant en regles eacutes no definir un ordre lineal drsquoaquestes (costa deixar de pensar de
forma iterativa)En el cas de necessitar que una regla srsquoexecuti despreacutes drsquouna altre pots fer servir Fets la regla anteriorcrea un fet que la segona regla tindragrave a la part esquerra
1 (defrule pregunta12 =gt3 (assert (pregunta1Feta))4 5 )6
7 (defrule pregunta2
8 (pregunta1Feta)9 =gt
10 11 )
I finalment pots usar la propietat salience Aquesta propietat indica la prioritat drsquoexecucioacute de les regles( les regles amb salience majors srsquoexecutaran abans ) Pot prendre valors positius i negatius entre -10000 y+10000 Per defecte les regles tenen salience 0
1 (defrule pregunta12 (declare (salience 2))3 =gt4 5 )6
7 (defrule pregunta28 (declare (salience 1))9 =gt
10 11 )
El valor indicado en la propiedad salience puede ser el nuacutemero directamente o una expresioacuten por ejemplovariable10 podemos usar variable para elegir que regla se ejecutaraacute
Las prioridades deben ser usadas solo para determinar el orden en el que se disparan algunas reglas sobreotras no para fijar el flujo de control ya que la principal ventaja de un sistema basado en reglas es larepresentacioacuten declarativa del conocimiento y de esta forma abusando de las prioridades conduce a unsistema procedimental
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2159
18 Capiacutetulo 3 CLIPS
348 Com forccedilar que una regla sigui la primera
Per que aquesta regla sigui la primera ha de tenir el salience meacutes gran de totes
1 (defrule presentacio2 (declare (salience 20))3 =gt4 (printout t ------ Benvingut ----- crlf)5 )
349 Vull guardar certs valors que es fan servir durant lrsquoexecucioacute de diferents regles Com hopuc fer
Tens principalment dues alternatives Si el valor eacutes un tipus bagravesic pots fer servir una variable global ambla sintaxi seguumlent
(defglobal nom_variable = valor)
Aquesta sentegravencia no va a dins de cap funcioacute ni regla es posa sola a la part que creguis convenient delcodi Vegem un exemple
(defglobal preu_minim_primer = 1000)
Per fer-la servir es fa exactament de la mateixa manera que amb una variable normal perograve has de posarels dos asteriscs Per exemple
(bind preu_minim_primer curr-preu)
Per altra banda si el valor o valors que vols guardar han de ser instagravencies una bona estrategravegia pot serutilitzar un deftemplate Eacutes uacutetil sobretot per anar guardant solucions temporals o llistes drsquoelements quepoden formar part de la solucioacute
Per utilitzar-ho has de seguir els passos seguumlents
1 Definir el deftemplate
(deftemplate nom_del_deftemplate(multislot nom_multislot)
(slot nom_slot)
)
Amb un exemple es veuragrave meacutes clar
(deftemplate llista-plats(multislot primers)(multislot segons)(multislot postres)
)
2 Inicialitzar el deftemplate
(defrule[condicions vagraveries] La condicioacute base eacutes que llista-plats no srsquoha inicialitzat encara
(not (llista-plats))=gt
llista conteacute els valors de llista-plats (que de moment estan buits)(bind llista (assert (llista-plats)))
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2259
35 Las clasesinstancias 19
3 Assignar-li valors
(bind segons_plats (find-all-instances ((plat Plat)) TRUE)(modify llista (segons segons_plats))
4 Recuperar els valors
(defrule[condicions vagraveries]llista lt- (llista-plats (segons $segons_plats))
=gt
Ara la variable $segons_plats conteacute tots els elements de segons
35 Las clasesinstancias
351 Tengo que representar la jerarquiacutea de un frame iquestEs preferible antildeadir las subclases a laontologiacutea o bien diferenciarlas mediante un slot en la superclase
Las dos formas son vaacutelidas pero es recomendable representarlas en clases separadas cuando se vayan abuscar instancias de ese tipo ya que asiacute no tendremos que hacer un recorrido por todas las de la superclaseNo obstante si soacutelo se trata de una caracteriacutestica puntual del frame y no vamos a hacer buacutesquedas de unaexclusiva subclase entonces seraacute maacutes eficiente antildeadir un slot debido a su mejor accesibilidad
352 iquestQueacute es un objeto
Podriacuteamos decir que un objeto es un hecho no ordenado con herencia
353 iquestPorqueacute usar objetos en contexto de la praacutectica de CLIPS de IA
Como bien sabemos una parte de la praacutectica de SBCrsquos consisten en crear la ontologiacutea Esta ontologiacutease exporta para poder interactuar con CLIPS en formato pins y pont El archivo pont contendraacute ladeclaracioacuten de todas las clases creadas previamente por Protege (defclass ) El archivo pins contendraacute
todas las instancias de las clases declaradas en el archivo pont Como puede intuir el lector se necesitaraacuteinteractuar con los objetos previamente creados por Protegravegegrave
354 Como se definen las clases
Para definir las clases usaremos el constructor defclass
(defclass ltnombregt [ltcomentariogt](is-a ltnombre-de-superclasegt)[(role concrete | abstract)]
[(pattern-match reactive | non-reactive)]ltslotgt definicioacuten de los atributos de la clase
ltdocumentacioacuten-handlergt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2359
20 Capiacutetulo 3 CLIPS
En caso de desear que la nueva clase herede las propiedades de otra ya existente el nombre de esta deberaacuteespecificarse despues de is-a El rol determinaraacute si la clase es concreta (se puede instanciar) o abstracta(destinada a ser superclase) El pattern-match debe declararse como reactivo si se desea que las instanciasde la clase puedan unificar con los elementos objeto de las reglas (siacutembolo lt-) Los slots correspondena los atributos de la clase y los handlers a las funciones de eacutesta Los handlers se pueden declarar en ladeclaracioacuten de la propia clase pero se deben definir externamente Dado que no aporta ninguna ventaja
declararlos es recomendable definirlos directamente Noacutetese que todo aquello que estaacute entre corchetes ([])constituye informacioacuten adicional que no es obligatorio especificar
1 (defclass Persona2 (is-a Ser_Vivo)3 (role concrete)4 (single-slot edad5 (type INTEGER)6 (range 1 99)7 (cardinality 0 1)8 (create-accessor read-write)9 )
10 (multislot amigos11 (type INSTANCE)12 (allowed-classes Persona)13 )14 )
El comportamiento y declaracioacuten de los slots es ideacutentico al de los slots de los hechos ordenados Losatributos de tipo INSTANCE (referencian otras instancias) estan en formato INSTANCE-NAME
355 Com consulto una instagravencia a partir drsquouna regla
Podem fer servir la part esquerre drsquouna regla per trobar instagravencies Lrsquouacutes eacutes molt semblant a trobar elpunter a un fet fent servir
(object [(is-a ltNOM_CLASSEgt)|(name ltNOM_INSTANCIA)|(ltNOM-SLOTgt ltVALORVARIABLE))])
Per exemple si volem que una regla srsquoinstanciiuml si tenim instanciat un plat de la classe Plat podriem ferservir
1 (defrule tenimplat2 plat lt- (object (is-a Plat))3 =gt4 (print t (send plat get-nom) crlf)
La regla imprimiragrave el nom del plat que trobi Eacutes important notar que srsquoactivaragrave per cada instagravencia de platque tinguem a la base de coneixement
Podem consultar els valors de la instancia fent servir condicions a la part esquerre de la regla Per exemplesi nomeacutes volgueacutessim els plats amb un preu meacutes gran que 30
1 (defrule platCar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Srsquoactivaragrave per tots els plats amb un preu major a 30
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2459
35 Las clasesinstancias 21
Srsquoha drsquoanar amb cura per aquest tipus de regla ja que si la base de coneixement eacutes molt amplia pot acabarderivant amb problemes de memograveria
Per exemple si en comptes de preguntar per una instagravencia de Plat pregunteacutessim per dues instancies dePlat
1 (defrule platsCars2 plat1 lt- (object (is-a Plat) (Preu p1))3 plat2 lt- (object (is-a Plat) (Preu p2))4 (test (gt p1 30))5 (test (gt p2 30))6 =gt7 (print t (send plat1 get-nom) i (send plat1 get-nom) soacuten cars8 crlf)9 )
Faria unificacioacute amb totes les combinacions possibles (amb repeticions) de dos plats de tota la base deconeixement Aixograve es podria anar ampliant fins fer-se intractable
Si tenim drsquoalguna manera el nom de la instancia podem fer
1 (defrule platPicant2 (cuina (plat p))3 (object (name p) (picant pi))4 =gt5 (print t picant pi crlf)6 )
Aixoacute es pot servir per crear condicions que facin servir noms drsquoinstancies que tenim almacenats a slotsdrsquoaltres instancies per exemple
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send v get-Preu) crlf)6 )
Aquesta regla imprimiria el preu del vi asociat al plat si es negre
356 Tengo problemas en condiciones de reglas con slots de instancias obtenidos con send
A veces dan problemas las reglas en las que las condiciones sobre los valores de los slots de una instanciase escriben usando mensajes get sobre los atributos de una instancia en lugar de utilizar patrones paraobtenerlos por ejemplo la regla
1 (defrule platcar2 plat lt- (object (is-a Plat) )3 (test (gt (send plat get-Preu) 30))4 =gt5 (print t (send plat get-nom) es car6 crlf)7 )
No funciona correctamente en CLIPS pero la regla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2559
22 Capiacutetulo 3 CLIPS
1 (defrule platcar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Siacute lo haceEn el caso de que el valor del slot sea booleano se puede escribir la regla como
1 (defrule platpicant2 plat lt- (object (is-a Plat) (Picant TRUE))3 =gt4 (print t (send plat get-nom) es picant crlf)
En el caso de que el slot sea a su vez una instancia se puede utilizar para obtener los valores de estainstancia en la condicion como se explica en la pregunta anterior
357 Tengo problemas con instancias obtenidas del slot de otra instancia en el patroacuten de unaregla
Este problema aparece cuando el patron de una regla instancia una variable a un nombre de instancia yesta no esta definida en el modulo de la regla por ejemplo si la regla siguiente pertenece a un modulo queno es el de la instancia
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4
=gt5 (print t preu (send v get-Preu) crlf)6 )
La regla se quejaraacute de que la instancia no existe al enviarle el send ya que solo se busca la instancia dentrodel moacutedulo de la regla y no en los importados Para arreglar esto se puede usar la funcioacuten (instance-address[ltMODULOgt|] ltINSTANCIAgt) que busca la direccion de la instancia en un modulo concreto o en todos losmoacutedulos que se importan () Deberiacuteamos entonces escribir la regla
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send (instance-address v) get-Preu) crlf)6 )
358 iquestCoacutemo realizar una buacutesqueda de instancias que cumplan unas restricciones
CLIPS nos ofrece varias funciones de buacutesqueda de instancias que cumplan unas determinadas restriccionesque a nosotros nos interese
La funcioacuten find-instance Esta funcioacuten devuelve la primera instancia que cumple todas las restric-ciones indicadas
La funcioacuten find-all-instances Esta funcioacuten devuelve todas las instancias que cumplen las restric-ciones indicadas
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2659
35 Las clasesinstancias 23
La sintaxis de ambas funciones es igual exceptuando el nombre de la funcioacuten(find-all-instances (clase_instancias) (restricciones))A continuacioacuten se muestran varios ejemplos
(bind rectangulos (find-all-instances ((inst Rectangulo)) (gtinstaltura 10))) Des-pueacutes de ejecutar esta funcioacuten en la variable rectangulos habraacute una lista con todas las instancias de la
clase Rectangulo cuya altura sea superior a 10(bind rectangulos (find-all-instances ((inst Rectangulo)) (and (gtinstaltura 10) (=instanchura 7)))) Este trozo de coacutedigo hace que en la variable rectangulos se guarde una listade las instancias de la clase Rectangulo que tienen una altura superior a 10 y una anchura igual a 7
Estas funciones que CLIPS nos ofrece tienen otra funcionalidad y es que podemos realizar buacutesquedas deconjuntos de instancias
(bind rectangulos (find-all-instances ((a Rectangulo) (b Rectangulo)) (= aalturabaltura))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas de instancias de laclase Rectangulo que tienen la misma altura
Por uacuteltimo es necesario comentar que se pueden realizar buacutesquedas de conjuntos de instancias que seande distintas clases
(bind figuras (find-all-instances ((rect Rectangulo) (circ Circulo)) (= rectalturacircradio))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas ltrectangulocirculogtque cumplan que la altura del rectaacutengulo sea igual al radio del ciacuterculo
Existen maacutes comandos para obtener instancias pero son menos utilizadas a nivel baacutesico como pueden serany-instancep do-for-instance do-for-all-instances y delayed-do-for-all-instances
359 iquestCoacutemo se interactuacutea con objetos
La interaccioacuten con objetos se efectuacutea mediante lo que se denomina mensaje
(defmessage-handlerltnombre-clasegtltnombre-mensajegt[lttipo-handlergt] [ltcomentariogt]ltparaacutemetrogt [ltparaacutemetro-comodiacutengt])ltaccioacutengt
)
Un gestor de mensajes consta de 7 partes
1 Nombre de clase a la que el gestor estaraacute asociado
2 Nombre del mensaje
3 Tipo de gestor (Nosotros habitualmente usaremos primary que viene por defecto)
4 Comentario (opcional)
5 Lista de paraacutemetros6 Paraacutemetro comodiacuten (para gestionar muacuteltiples paraacutemetros)
7 Secuencia de acciones o expresiones que seraacuten ejecutadas por el gestor
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2759
24 Capiacutetulo 3 CLIPS
Enfocado a la praacutectica de CLIPS la maacutes comuacuten es que queramos interactuar con objetos para
1 Imprimir los objetos Un ejemplo
1 (defmessage-handler avion imprimir-beneficio ()
2 Para implementar funciones calculadas asociadas al objeto Un ejemplo
1 (defmessage-handler avion calcular-beneficio ()2 ( selfplazas-ocupadas selfprecio-billete))3 )
Como se puede observar el paraacutemetro impliacutecito self contiene la instancia activa para este mensaje
3510 iquestComo se interactuacutea con las instancias de los objetos
Podremos interactuar entre las instancias de los objetos mediante la funcioacuten send
(send ltexpresioacuten-de-objetogtltnombre-de-mensajegtltexpresioacutengt)Donde se toman como argumentos el objeto destino del mensaje el mensaje mismo y otros paraacutemetros
que debieran ser pasados a los gestoresParticularmente en el aacutembito de la praacutectica usualmente necesitaremos utilizar el envioacute de mensajes de
tipo get put and delete Estos mensajes tiene la siguiente sintaxis
get-ltnombre-atributogt
put-ltnombre-atributogt
delete
Aquiacute tenemos un ejemplo de como utilizarlo recordando que ponemos entre corchetes la instancia la cualse enviacutea el mensaje
(defclass avion (is-a USER)(role concrete)(slot precio-billete (create-accessor read) (default 34))(slot plazas-ocupadas (create-accessor write) (default 0)))
Clase creada
gt(make-instance a of avion) Creacioacuten de una instancia de avion[a]
gt(send [a] get-precio-billete) Obtencioacuten de un slot34 Resultado obtenidogt(send [a] put-plazas-ocupadas 100) Modificacioacuten de un slotgt(send [a] delete) Eliminacioacuten de la instanciaTrue
3511 Uso de make-instance
Cuando queremos crear una instancia de una clase para ir rellenandola con los resultados o datos quevayamos obteniendo se haria lo siguiente
(bind variable_instancia (make-instance nombre_instancia of nombre_clase))
Una vez creada podemos jugar con dicha instancia en las diferentes reglas siempre que la llamemos enlos activadores
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2859
35 Las clasesinstancias 25
(defrule reglavar_instancia lt- (object (is-a nombre_clase))=gt
)
De esta manera dentro de la regla podemos hacer acciones con la instancia por ejemplo(send var_instancia put-articulo articulo_ejemplo)
3512 Como generar automaacuteticamente nombres de instancia
En ocasiones queremos crear instancias en reglas y queremos que su nombre sea distinto del de otrasque ya tenemos Para ello podemos utilizar las funciones gensym y gensym La primera genera un siacutembolodel estilo genN donde N es un nuacutemero La segunda hace lo mismo pero aseguraacutendose de que ese siacutembolono exista ya Se puede reiniciar el contador que usan estas dos funciones con el operador (setgen ltnumgt)donde ltnumgt es el nuacutemero por el que queremos que empiecen ahora los siacutembolos
Para usar esto para generar el nombre de una instancia podemos hacer
(make-instance (gensym) of ltclasegt)
Cada vez que se ejecute se generaraacute un nombre de instancia nuevoSi creamos instancias de diferentes clases y queremos que las instancias tengan nombres que podamos
identificar podemos concatenar siacutembolos a los siacutembolos generados por gensym por ejemplo
(make-instance (sym-cat pepe- (gensym)) of ltclasegt)
generaraacute una instancia con el nombre pepe-genN
3513 Com fer un getset drsquoun slot drsquouna classe
Per consultar el valor drsquoun slot drsquouna classe ho podem fer enviant-li un missatge de la seguumlent manera
(send ltVARIABLEgt get-ltNOM_ATRIBUTgt)
Per exemple si tenim una instagravencia de la classe Plat ( instancia ) i volem saber el valor del seu slotnom
(send instancia get-nom)
Per assignar un valor a un slot drsquouna drsquoinstagravencia hem drsquoenviar-li un missatge de la seguumlent manera
(send ltVARIABLEgt put-ltNOM_ATRIBUTgt ltVALORgt)On ltVALORgt pot ser un valor o un megravetode que retorni un valor
(send instancia put-nom nom)
3514 iquestCoacutemo acceder a una instancia cuyo nombre conocemos
Si conocemos el nombre de una instancia y necesitamos acceder a ella es decir necesitamos enviarle alguacutenmensaje mediante la funcioacuten send podemos hacerlo directamente escribiendo en lugar de la variable quealmacena la instancia el nombre de la instancia entre corchetes [ ] A continuacioacuten se muestra un ejemplo
(bind altura_rect1 (send [rect1] get-altura))
En este caso se guardaraacute en la variable altura_rect1 el valor de la altura de la instancia que tiene comonombre rect1
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2959
26 Capiacutetulo 3 CLIPS
3515 Obtenir el nom drsquouna classe
Si tenim una instagravencia drsquouna classe i volem saber el nom de la classe (uacutetil si tenim una bona taxonomiade classes) ho podem fer amb el megravetode (class ltINSTANCIAgt)
Si per exemple imaginem que tenim la classe Actor la qual teacute com subclasses la classe APrincipalASecundari i ACameo Imaginem que estem tractant amb instancies drsquoactors i volem saber si la instanciaque estem tractant es de la classe APrincipal
Ho hauriacuteem de fer de la seguumlent manera
(eq (class instancia) APrincipal)
Fixem-nos que APrincipal eacutes un siacutembol no un String (un truco eacutes fixar-se en que no teacute cometes) Si vol-gueacutessim comparar-ho amb un String (per exemple un String introduiumlt per lrsquousuari) ho podriacuteem transformara un String amb el megravetode str-cat
(eq (str-cat (class instancia)) Principal)
3516 Como convierto un INSTANCE-ADRESS en un INSTANCE-NAME
En alguacuten momento nos podemos encontrar con la situacioacuten de que disponemos de un puntero a unainstancia y necesitamos su nombre o lo contrario En ambos casos podemos usar la funcioacuten instance-nameSu funcionamiento es bidireccional podemos introducirle un instance-name y nos devolveraacute un instance-adress y viceversa
1 (defrule imprimir-nombre2 estlt-(object (is-a Estudiante) (edad 25))3 =gt4 (printout t (instance-name est) crlf)5
)
3517 Com iterar a traveacutes drsquoun multi-slot
El seguumlent tambeacute eacutes vagravelid com exemple de com iterar a traveacutes drsquouna llistaImaginem que tenim una instagravencia de la classe Plat a la varible (plat) la qual teacute un multi-slot drsquoinstagravencies
de la classe Ingredient Imaginem que volem imprimir per pantalla el nom drsquoaquests ingredients (slot nomde la classe Ingredient) Necessitarem iterar sobre la llista drsquoingredients
1 (bind i 1)2 (while (lt= i (length$ (send plat get-ingredients)))3 do4 (bind ingredient (nth$ i (send plat get-ingredients)))5 (printout t (send ingredient get-nom) crlf)6 (bind i (+ i 1))7 )
El megravetode (nth$ ltINDEXgtltLLISTAgt) et retorna lrsquoelement situat a INDEX de LLISTAEl megravetode (length$ ltLLISTAgt) retorna el nuacutemero drsquoelements de LLISTA
3518 Coacutemo modificarinsertarborrar valores en un multislot
Los valores de un multislot se pueden cambiar usando la funcioacuten slot-replace$ La sintaxis es la siguiente
(slot-replace$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt ltvalorgt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3059
35 Las clasesinstancias 27
Donde ltiniciogt y ltfingt son el rango de posiciones del multislot que se quiere modificar y ltvalorgtson los valores que queremos reemplazar Obviamente deberaacute haber tantos valores como posiciones hayamosindicado en el rango
Para insertar nuevos valores podemos usar la funcioacuten slot-insert$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltposgt ltvalorgt)
El valor se inserta delante de la posicioacuten indicada si la posicioacuten es mayor que la longitud del multislot secolocaraacute al final
Para borrar elementos de un multislot podemos usar la funcioacuten slot-delete$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt)
Se borraraacuten los elementos que estaacuten en el rango indicado
3519 Coacutemo recorrer un atributo multievaluado
Supongamos que la variable respuesta tiene una lista de instancias
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 aquiacute hacemos lo que queramos4 )5 )
Loop-for-count funciona como un for primero la variable que haraacute de contador luego el valor de origeny luego el valor final Para controlar el final usamos la funcioacuten que he explicado antes i tomaraacute valoresdesde 1 hasta n asiacute que usando la funcioacuten nth$ obtendremos cada uno de los elementos La variable auxiraacute teniendo cada uno de los valores
3520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz)
Es igual que antes pero con dos bucles
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 (bind aux2 (send aux get-slot_que_queremos))4 (loop-for-count (j 1 (length$ aux2)) do5 (bind aux_final (nth$ j aux2))6 aquiacute ya podemos trabajar con el elemento en concreto7 )8 )
Supongamos que respuesta tiene una lista de instancias con el primer bucle haremos lo mismo que antes ir
iterando por esas instancias Una vez que tenemos cada instancia con aux2 con el segundo bucle iteraremosdentro de sus instancias interiores
Por ejemplo si tenemos varios equipos de fuacutetbol y cada equipo tiene varios jugadores en el primer bucleestamos iterando entre los equipos y en el segundo entre los jugadores de cada equipo en particular
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3159
28 Capiacutetulo 3 CLIPS
3521 Com puc esborrar una instagravencia
Per esborrar una instagravencia (per exemple segons la informacioacute que proporcioni lrsquousuari podem deduir queuna segraverie drsquoinstagravencies eacutes impossible que es facin servir per a la solucioacute) ho podem fer enviant un missatgedelete a la instagravencia eacutes a dir (send ltINSTANCIAgtdelete)
(send inst delete)
Un megravetode que podria ser uacutetil de la cara a la pragravectica podria ser el seguumlent
1 (defrule elimina-instancia2 (declare (salience 10))3 elimina-fact lt- (elimina-inst inst)4 =gt5 (send inst delete)6 (retract elimina-fact)
Imaginem que per exemple que volem eliminar una llista drsquoinstagravencies Per eliminar-les podriacuteem recoacuterrerel llistat marcant les instagravencies que volem esborrar afegint el seguumlent fet
(assert (elimina-instancia inst))
Aixiacute com que elimina-instancia teacute un salience alt esborraria les instagravencies marcades quan tingueacutes ocasioacuteDrsquoaquesta manera ens estalviem el problema de recoacuterrer un llistat drsquoinstagravencies amb un iterador mentre
anem eliminant els elements de la llista cosa que pot donar problemes amb lrsquoiterador
3522 Com imprimir una instagravencia
Per imprimir una classe (uacutetil per exemple per mostrar el resultat final) el millor eacutes definir message-handlersPer exemple imaginem que tenim una classe Plat la qual teacute un slot nom de tipus String Si volgueacutessimimprimir per pantalla un missatge que digueacutes
El nom del plat eacutes ndashltnom del platgtndash
Hauriacuteem de definir un message-handler que simplement imprimiacutes per pantalla el valor de lrsquoslot de laforma
(defmesssage-handler ltCLASSNAMEgt ltMESSAGENAMEgt primary ()ltCODIgt
)
Per el cas de lrsquoexemple
1 (defmessage-handler Plat print primary ()2 (printout t -- selfnom --) )3 )
Per cridar-ho nomeacutes caldragrave enviar-li un missatge a la instagravencia amb el nom del message-handler (enaquest cas print)
(send instancia print)
Un message-handler pot cridar a altres message-handlers amb el que es poden encadenar diverses instagraven-cies Per exemple imaginem que tenim la classe Menuacute la qual teacute un atribut plats que eacutes un llista drsquoinstagravenciesde la classe Plat Dintre del message-handler menuacute podriacuteem iterar a traveacutes de la llista de plats enviant elmissatge print que hem definit anteriorment
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3259
36 Programacioacuten 29
3523 Com es navega entre instagravencies relacionades
Per exemple tinc una instagravencia iA que teacute un slot anomenat slotB que eacutes una instagravencia drsquoun frame B Vullsaber el nom de la instagravencia associada al slotB de iA Ho pots fer aixiacute
(bind B (send iA get-slotB))(bind res (send B get-nom))
Si estagraves dins drsquouna condicioacute ho pots simplificar de la forma seguumlent
(bind res (send iAslotB get-nom)
Els dos punts soacuten equivalents al punt de Java
36 Programacioacuten
361 Com introduir un comentari
Els comentaris a CLIPS va darrere de un com per exemple
Comentari
Tambeacute podem afegir comentaris a les nostres regles deffacts deftemplates etc Generalment van darrereel nom de la estructura per exemple
1 (defrule neteja regla per la qual si la cuina estagrave bruta srsquoafegiragrave una tasca de2 neteja
3 (estat-cuina bruta)4 =gt5 (assert (tasca netejar))6 )
362 Referenciar el valor null a CLIPS
Per referenciar el valor null a clips es fa amb el simbol nil Per exemple si volem saber si una instagravenciainst es null ho podriacuteem fer de la seguumlent manera
(eq inst nil)
363 Formas de recorrer una lista
Para recorrer una lista disponemos de diferentes opciones en este FAQ explicaremos como crear unaestructura tipo ldquoWHILErdquo y tipo ldquoFORrdquo
1 While Esta regla se ejecuta hasta que la expresioacuten a evaluar sea falsa Este tipo de estructura se rigepor seguir la sintaxis while - do y se construiriacutea de la siguiente forma
(while ltexpresioacutengt[do] ltaccioacutengt)
Doacutende dependiendo del valor de ltexpresioacutengt
Valor TRUE Se realizaraacute la accioacuten ltaccioacutengt i se volveraacute a evaluar ltexpresioacutengt
Valor FALSE No se ejecutaraacute la accioacuten ltaccioacutengt
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3359
30 Capiacutetulo 3 CLIPS
2 For Esta regla sirve para ejecutar un bucle N (final - inicio) veces Este tipo de estructura se rige porseguir la sintaxis loop-for-count y se construiriacutea de la siguiente forma
(loop-for-count (ltvargtltiniciogtltfinalgt) [do] ltaccioacutengt)
Doacutende
ltvargt Variable que se usara como iacutendice
ltiniciogt Valor inicial que tendraacute ltvargt
ltfinalgt Ultimo valor que tendraacute la variable ltvargt
ltaccioacutengt Accioacuten que es realizaraacute hasta que ltvargt tenga el valor de ltfingt
364 Formas de elegir una opcioacuten
En este apartado explicaremos como crear una estructura if y una estructura switch
If Este tipo de estructura se rige por seguir la sintaxis if - then - else y se construiriacutea de lasiguiente forma
(if ltexpresioacutengtthen ltaccioacutengt[else ltaccioacuten2gt])
Doacutende dependiendo del valor de ltexpresioacutengt
bull Valor TRUE Se realizaraacute la accioacuten ltaccioacutengtbull Valor FALSE Se realizaraacute la accioacuten ltaccioacuten2gt (en caso de haber)
Switch Este tipo de estructura se rige por seguir la sintaxis switch - opciones y se construiriacutea dela siguiente forma
(switch ltexpresioacuten-testgt(case OPCION1 then ACCION1)(case OPCION2 then ACCION2)
([default] ACCION-DEFAULT)
)
Doacutende dependiendo del valor de ltexpresioacuten-casegt se ejecutaraacute una ltaccioacutengt en particular Si nin-guna ltopcioacutengt es correcta se ejecutara la ltaccioacuten-defaultgt
365 Funciones con la clase String
Habitualmente trabajaremos con Strings o cadena de Strings CLIPS proporciona una serie de herramien-tas para trabajar con esta clase
1 Convertir string a MAYUacuteSCULAS A veces es conveniente tener todos los caracteres en mayuacutesculaspara no tener problemas de comparaciones o simplemente por convenio Para ello CLIPS dispone dela funcioacuten upcase la cual convierte a mayuacutesculas un siacutembolo o string
(upcase ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplos
(upcase Ccedillips es divertido) rarr CcedilLIPS ES DIVERTIDO
(upcase Clips_es_divertido) rarr CLIPS_ES_DIVERTIDO
2 Convertir string a MINUacuteSCULAS la funcioacuten es downcase
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3459
36 Programacioacuten 31
3 Concatenacioacuten de strings Tambieacuten es de gran utilidad poder juntar dos o maacutes paraacutemetros en un solostring Todo paraacutemetro a juntar deben ser de uno de los siguientes tipos symbol String integer floato instance-name
(str-cat parametro1 parametro2 parametroN )
Ejemplo
(str-cat IA nota 10) rarr IAnota10
4 Comparacioacuten de strings Funcioacuten que nos indica si dos strings son iguales
(str-compareltexpresioacuten-simboacutelica-o-de-cadenagtltexpresioacuten-simboacutelica-o-de-cadenagt
)
Esta funcioacuten devuelve
0 Si ambos strings son iguales1 Si el primer string es mayor que el segundo string-1 Si el primer string es menor que el segundo string
5 Longitud de un string Muchas veces es de gran utilidad saber que tamantildeo tiene un string
(str-length ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplo
(str-length Inteligencia Artificial) rarr 23
366 iquestCoacutemo obtener el contenido de una variable en un string
Para conseguir un string a partir de un integer float symbol instance-name debes utilizar el comandostr-cat Si a la funcioacuten le pasamos como paraacutemetros varios elementos los transformaraacute a string y losconcatenaraacute La sintaxis de esta funcioacuten es la siguiente (str-cat elementos) Esta funcioacuten la usaremossobre todo cuando queramos realizar comparaciones entre el contenido de una variable y un string ya quepreviamente necesitaremos usar la funcioacuten str-cat para pasar el contenido de la variable a string y realizarde este modo la comparacioacuten de forma correcta
367 iquestComo se crea una lista
Con create$ Todos los operadores sobre listas llevan el siacutembolo $ al final Igual que con las variables sedebe usar bind siempre que se desee modificar una lista
(bind lista (create$ a b c))
368 iquestComo borro un elemento de una lista
Con delete$Usa la siguiente sintaxis(delete$ ltlistagt ltindice-iniciogt ltindice-finalgt)Se borraraacuten todos los elementos del rango entre las posiciones inicio y final ambas incluidas Tambieacuten exis-
tedelete-member$ (delete-member$ ltlistagt ltelementogt) Borraraacute todas las apariciones del elemento enla lista
(delete$ (create$ a b c d e f) 3 5) minusrarr (a b f)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1159
8 Capiacutetulo 2 Protegravegegrave
Proteacutegeacute permet lrsquoheregravencia muacuteltiple en instagravencies perograve CLIPS no En CLIPS nomeacutes poden tenir heregravenciamuacuteltiple las classes perograve no les instagravencies Aixoacute es aixiacute perque el lenguatge de CLIPS es orientat a objectesno es realment un lenguatge drsquoontologiacutees
La manera meacutes senzilla de simular-ho si les clases no tenen ancestres comuns eacutes tenir classes que repre-sentin aquesta heregravencia muacuteltiple i fer que les instagravencies pengin drsquoelles que es com es faria a un llenguatge
orientat a objectesEn el cas de tenir ancestres comuns no es pot fer lrsquounica manera es duplicar la instancia amb nomsdiferents i penjar-les de les clases on es vol tenir-la
De totes maneres el CLIPS permet recuperar fagravecilment les instagravencies que tenen un valor especiacutefic en unslot pel qual el meacutes senzill eacutes tenir una uacutenica jerarquia i incloure altres possibles classificacions com a slotsencara que obviament perdrem la posibilitat de fer servir una jerarquia de valors per aquest
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1259
3 CLIPS
31 Instalacioacuten del CLIPS
311 iquestCoacutemo instalar CLIPS
La herramienta CLIPS es multiplataforma y esta disponible para los tres SO maacutes utilizados MicrosoftWindows Linux y Mac OS X
iquestCoacutemo instalar CLIPS en Windows
Primero de todo debemos bajarnos el programa de la paacutegina oficial de CLIPS accesible desde este link
(httpclipsrulessourceforgenet) Desde el aacuterea de descarga os podreis bajar el instalador parawindows
iquestCoacutemo instalar CLIPS en Linux
En muchas distribuciones de Linux CLIPS esta disponible como un paquete adicional el paquete sueleinstalar la versioacuten con interfaz graacutefico Si no encuentras el paquete especiacutefico para la distribucion que usassiempre puedes compilarlo a partir del paquete con los fuentes
Tambieacuten estaacute la posibilidad de utilisar el emulador de windows WINE Una vez instalado el emulador sepuede instalar CLIPS y este funcionaacute igual que sobre windows
iquestCoacutemo instalar CLIPS en Mac OS X
Primero de todo debemos bajarnos el programa de la paacutegina oficial de CLIPS accesible desde este link(httpclipsrulessourceforgenet ) Desde el aacuterea de descarga podeis bajar el intalador para MACOS X
312 Entorn finestres VS Consola de comandes
Encara que lrsquoentorn de finestres eacutes molt meacutes intuiumltiu CLIPS a la seva versioacute en liacutenea de comandes eacutes moltmeacutes ragravepid (segurament perquegrave no ha de mostrar en tot moment lrsquoagenda de fets les instancies les regles
etc)La diferencia de velocitat eacutes molt notable en cas de problemes de rendiment o de sensacioacute que lrsquoentorn
de finestres es queda penjat (o directament es tanca sense previ aviacutes) recomanem provar la versioacute en liacuteneade comandes
32 Los hechos
321 iquestQueacute es un hecho en CLIPS
Conceptualmente un hecho representa un dato abstracto del cual almacenamos valores Se puede vercomo una lista de campos donde el primer campo hace referencia al ldquodatordquo al cual le asignamos una listade valores que le suceden teniendo una relacioacuten entre siacute
Formalmente el primer campo es un siacutembolo y los campos restantes son valores
9
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1359
10 Capiacutetulo 3 CLIPS
(siacutembolo valor1 valor2 valorN)
322 iquestQueacute es un hecho ordenado (order Facts)
Un hecho ordenado tienen formato libre por lo tanto no existe restriccioacuten alguna en el orden de los campos
Los campos de un hecho ordenado pueden ser de cualquier tipo primitivo de datos excepto el primero quedebe ser un siacutembolo Como ejemplo tenemos
1 (hermanos Antonio Javier Carlos)2 (padre Pedro David)
323 iquestQueacute es un hecho no ordenado (deftemplates facts)
A traveacutes de los hechos no ordenados podemos abstraernos de la estructura de un hecho asignado unnombre a cada campo (slots)
1 (deftemplate nombre-template comentario2 (slot nombre-slot (tipo-del-slot))3 (multislot nombre-slot (tipo-del-slot))4 )
Por ejemplo
1 (deftemplate avioacuten2 (slot nombre_avion (type STRING))3 (slot compania (type STRING))
4 (slot numero_plazas (type INTEGER) (default 100))
324 iquestPuedo tener un vector como slot
Si debe declararse como multislot
325 iquestPuedo asignar propiedades a los slots
Siacute las maacutes importantes son
Type El tipo de dato primitivo que contiene (en mayuacutesculas)
Allowed-X Permite especificar un conjunto de valores permitidos Siendo X un tipo de datos primitivo(en minuacutesculas y plural) rarr si el slot toma un valor del tipo X debe pertenecer a los valores permi-tidos X puede ser values especificando entonces todos los valores posibles que puede tomar el slotindependientemente del tipo de dato
Range Especifica un rango para slots numeacutericos
Cardinality Nuacutemeros miacutenimo y maacuteximo de elementos que puede tener un multislot
Default Valor por defecto Si ponemos NONE como valor por defecto significaraacute que no se podraacute crear la
instancia a no ser que se especifique el valor de ese slot
1 (deftemplate estudiante2 (slot edad (type INTEGER) (range 0 99))
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1459
32 Los hechos 11
3 (multislot asignaturas (type STRING) (cardinality 1 5))4 (slot num-carreres (default 1))5 (multislot notas (allowed-strings MH NP))6 )
326 iquestQueacute debo utilizar hechos ordenados o no ordenados
Como se puede intuir si tenemos un conjunto de hechos los cuales conceptualmente pertenecen al mismoaacutembito seraacute una solucioacuten maacutes elegante agruparlos a traveacutes de un deftemplate En caso que tengamos quealguacuten hecho aislado seraacute mas sencillo declararlo como un hecho ordenado
327 Fets o Objectes
Veient la definicioacute de deftemplate podem confondrersquons a lrsquohora de decidir si fer servir fets o fer servirobjectes
Deixant de banda altres diferegravencies ja comentades (les classes suporten jerarquia de classes heregravenciaetc) els objectes es fan servir per representar el coneixement (mitjanccedilant un conjunt drsquoinstagravencies)
Aixiacute que generalment farem servir classes i objectes per representar coneixement mentre que farem servirels fets per portar control sobre lrsquoexecucioacute del problema
Per exemple podriacuteem definir un deftemplate per emmagatzemar un resultat o per poder controlar lrsquoestatde lrsquoexecucioacute
A la pragravectica de Mikeo (penjada a la web de lrsquoassignatura) teniacuteem un deftemplate habitacion-actual
1 (deftemplate habitacion-actual2 (slot habitacion)3 (slot area-restante)4
(slot presupuesto-restante)5 (slot precio-total)6 (slot prioridad-actual)7 )
Amb el qual controlagravevem la construccioacute drsquouna habitacioacute Assignagravevem una instagravencia de la classe habita-cioacute al slot habitacion de habitacion-actual i mitjanccedilant una segraverie de regles que feien unificacioacute ambhabitacion-actual actuagravevem sobre lrsquohabitacioacute drsquouna manera o drsquoun altre
328 Creacioacuten de hechos (assertdeffacts)
Si queremos crear un solo hecho utilizaremos el comando assert Por ejemplo (assert (casa roja))Si por el contrario queremos crear una estructura ordenada de hechos utilizaremos deffacts
(deffacts mishechos (casa roja) (pelota azul))
329 Modificar un fet
Per modificar un fet (per exemple molt uacutetil si estem treballant amb deftemplates) ho podem fer mitjanccedilant(modify ltINSTANCIAgtltFETSgt)
Per exemple si tingueacutessim el deftemplate persona
1 (deftemplate persona2 (slot nom)3 (slot edad)4 (slot dni)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1559
12 Capiacutetulo 3 CLIPS
I hagueacutessim afegit el fet
(assert (persona (nom Pepe)(edad 25)(dni 46974431)))
I el fet
(assert (aniversari 46974431))
Podriacuteem tenir la seguumlent regla
1 (defrule aniv2 aniversari lt- (aniversari dni)3 persona lt- (persona (edat edat)(dni dni))4 =gt5 (retract aniversari)6 (modify persona (edat (+ 1 edat)))7 )
La qual srsquoactivaragrave si hi ha un fet aniversari drsquouna persona Fent servir el dni indicat al fet aniversaribusquem el fet persona que teacute el mateix dni Deixem el valor edat a la variable edat per poder treballaramb ella meacutes endavant
Hem agafat tambeacute la direccioacute del fet aniversari per tal de poder esborrar-lo de la base de fets Aixograve srsquohafet per dues raons
Primer per mantenir meacutes neta la base de fets Segon i meacutes important Com que hem canviat el fet laregla tornaragrave a fer unificacioacute amb el fet (perquegrave ara eacutes diferent) amb la regla aniversari amb el que entrariadintre drsquoun bucle sense fi on srsquoaniria incrementant lrsquoedat de la persona
Un cop hem esborrat el fet aniversari incrementem en 1 el valor del slot edat de la persona fent servirla variable edat que hem declarat a la part esquerre de la regla
El comportament de modify es fer un retract del fet a la base de fets i despreacutes fer un assert amb els nous
valors Si volem canviar mes drsquoun slot del fet es convenient canviar-los tots a la vegada La raoacute es que cadavegada que fem un modify lrsquoapuntador al fet es modifica i lrsquoapuntador que tenim a la variable que hem fetservir ja no es vagravelid
Si no temim mes remei que fer la modificacioacute del fet pas a pas srsquoha de saber que la crida a modify retornalrsquoapuntador al nou fet Si el guardem a altra variable (o a la mateixa) podrem continuar modificant el fetamb la nova referegravencia
3210 Com elimino un fet de la base de fets
Per eliminar un fet de la base de fets ho podem fer amb la paraula clau (retract ltFETgt) on ltFETgt eacutes
un punter al fetPer obtenir aquest fet ho podem fer fent servir ltVARgtlt- ltFETgt a la part esquerre de la reglaPer exemple
1 (defrule accionsvent2 vent lt- (vent tipus)3 =gt4 (switch tipus5 (case poc then (assert (accio persiana0)))6 (case normal then (assert (accio persiana50)))7 (case molt then (assert (accio persiana100)))8 )9 (retract vent)
10 )
Afegiragrave fets per realitzar les accions pertinents i esborraragrave el fet de la base de fets
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1659
33 Variables 13
33 Variables
331 Variables a CLIPS
No cal declarar una variable (ni el seu tipus) nomeacutes cal afegir un interrogant al comenccedilament drsquoun simbol
per indicar que eacutes una variableCLIPS srsquoencarrega del control de tipus depenent del que assignem a la variablePer exemple testvar correspondria a la variable testvar Si per exemple assigneacutessim lrsquoenter 3 a
testvar CLIPS tractaria la variable com una variable entera
332 Com assignar un valor a una variable
Per assignar un valor a una variable es fa servir el megravetode (bind) amb la forma
(bind ltVARIABLEgtltVALORgt)
On ltVALORgt pot ser un valor o un megravetode que retorni un valor Per exemple si volem assignar un 4 a lavariable var
(bind var 4)
O per exemple podriacuteem assignar a la variable var la suma de 2 meacutes 2
(bind var (+ 2 2))
333 iquestCoacutemo declarar variables globales
Para crear una variable global hay que meterla dentro de la construccioacuten defglobal La declaracioacuten de la
variable seguiraacute el modelo nombreVariable = expresioacutenPor ejemplo
(defglobal presupuesto = 0)
Pueden aparecer en la parte izquierda de las reglas si no son utilizadas para asignar un valor y su cambiono activa reglas pero no pueden ser paraacutemetros de funciones ni meacutetodos
334 iquestCoacutemo trabajar con variables sumando restando por ejemplo contadores
La mejor forma es con variables globales se definen asiacute (defglobal x = 0) puede ser el valor quequeramos tanto nuacutemero string Y si queremos sumarle 10 por ejemplo
(bind x (+ x 10))
Las variables locales como por ejemplo x soacutelo tienen valor mientras dura su ejecucioacuten y eso suele ser enesa misma liacutenea o en un bucle Si le damos valor a x y luego preguntamos por ella nos diraacute que no existe
335 Quina diferegravencia hi ha entre les variables del tipus nom_variable i les del tipus $nom_variable
Les primeres contenen un sol valor i les segones en poder contenir meacutes drsquoun (o cap)
336 Quegrave significa lrsquointerrogant () quan va sol
Eacutes una variable anogravenima Pots utilitzar sense posar-hi cap nom si no trsquointeressa el valor en concret Perexemple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1759
14 Capiacutetulo 3 CLIPS
(Primer filtre_preu )
Aquesta condicioacute significa ldquosi el fet (Primer filtre_preu) teacute algun valorrdquo O sigui que si tingueacutessimel fet (Primer filtre_preu ok) es compliria la condicioacute (i si en comptes de ldquookrdquo fos ldquopatatardquo tambeacute escompliria) En canvi si el fet fos uacutenicament (Primer filtre_preu) no es compliria la condicioacute
337 Quegrave significa el dogravelar ($) quan va sol
Eacutes com lrsquointerrogant perograve admet meacutes drsquoun valor Per exemple
(Primer filtre_preu $ ok)
donaragrave cert pels fets de lrsquoestil (Primer filtre_preu patata ok) (Primer filtre_preu hola ok)(Primer filtre_preu patata hola ok) (Primer filtre_preu ok) Eacutes a dir no importa els valors quehi hagi entre filtre_preu i ok si al final hi ha un ok
338 iquestComo puedo ver los hechos presentes en un momento determinado
Abriendo la Facts Window en Window de la barra de menuacute
34 Las reglas
341 iquestCoacutemo construir una regla
Para construir una regla utilizaremos la construccioacuten defrule
Sintaxis
(defrule ltnombre-reglagt [ltcomentariogt][ltdeclaracioacutengt]ltelemento-condicioacutengt Parte izquierda (LHS)
=gtltaccioacutengt) Parte dcha (RHS) de la regla
Una regla consta de un conjunto de condiciones (antecedente) tambieacuten denominados elementos condicio-nales (EC) o parte izquierda (LHS) y de un conjunto de acciones (consecuente) tambieacuten denominado partederecha de la regla (RHS) La regla se activaraacute siempre que se satisfagan todos los EC mediante hechos oinstancias que los cumplan
Si se introduce en la base de reglas una nueva regla con el mismo nombre que el de una existente la nuevaregla reemplazaraacute a la antigua
Si una regla no tiene parte izquierda es decir no tiene elementos condicionales entonces el hecho(initial-fact) actuaraacute como el elemento condicional para ese tipo de reglas y la regla se activaraacute cadavez que se ejecute un comando reset
342 iquestCoacutemo gestionar la parte izquierda (LHS) de una regla
Declarar hechosSi no se especifica ninguna condicioacuten la regla se activaraacute siempre Una condicioacuten puede ser un simple hecho
(Ej vegetariano) o un hecho ordenado con unos valores concretos (Ej (persona (nombre Juan))) Si loque queremos es obtener el valor de un hecho insertaremos una variable en su lugar (Ej (persona (nombre
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1859
34 Las reglas 15
n)) ) Entonces entraraacute en la regla para cada valor posible que pueda asignar a la variable n a partir delos hechos
Si queremos indicar cualquier valor utilizaremos el siacutembolo y para cualquier lista el siacutembolo $ (Ej(evento ) (estilo $) ) Tambieacuten existe la opcioacuten de guardar en una variable una referencia al objetoEllo se consigue poniendo var lt- a su izquierda (Ej p lt- (persona (nombre Juan))) Se puede usarpor ejemplo para pasaacuterselo de paraacutemetro a una funcioacuten llamada en la RHS
Establecer condiciones
Ademaacutes podemos especificar restricciones adicionales sobre los valores que puede tomar un campo de unhecho Existen tres tipos principales de restricciones Conectadas (por orden de precedencia o prioridad)
not (~) Evita que cierto campo cumpla determinada restriccioacuten
and (amp) Combina dos restricciones conjuntivamente
or (|) Combina dos restricciones disjuntivamente
De predicado () Obliga a que cierto campo cumpla determinada condicioacuten (especificada por el predicado)
Por valor devuelto por una funcioacuten = Permite llamar a una funcioacuten y utilizar el valor devuelto pararestringir el valor que pueda tomar un campo de un hecho
Se puede comprobar si se cumple una determinada condicioacuten mediante el constructor test Dentro detest se pueden hacer llamadas a cualquier funcioacuten o predicado ya sea primitiva de CLIPS o definidapor nosotros
Combinar elementos
Los diferentes elementos de la parte izquierda van impliacutecitamente unidos mediante una AND que indicaconjuncioacuten No obstante podemos hacerlo expliacutecitamente mediante (and (cond1) (cond2)) aunque suelen
utilizarse para anidar ANDs dentro de ORsOR Sirve para hacer una disyuncioacuten (or (cond1) (cond2)) Es equivalente a escribir varias reglas en lasque cada una de ellas tenga uno de los componentes del OR en su parte izquierda y la misma parte derecha
NOT Sirve para detectar si no existe un determinado hecho (Ej (not (estilo sibarita)))exists Cuando a un conjunto de elementos se le antecede exists se comprueba que hay al menos un
hecho en la base de hechos que cumpla la condicioacuten (Ej (exists(bebida precio (ltprecio 5))) )forall Permite comprobar si todos los hechos que satisfacen un determinado patroacuten cumplen una serie
de condiciones (Ej (forall(plato (estilo moderno)))
343 iquestCoacutemo obtener la direccioacuten de hechos o instancias situados en LHS
En algunas ocasiones vamos a necesitar realizar alguacuten tipo de accioacuten en la parte derecha de las reglassobre hechos o instancias que cumplan unas determinadas condiciones Pero para ello necesitaremos primerotener acceso a estos elementos para despueacutes poder operar sobre ellos Esto lo conseguiremos guardando ladireccioacuten del elemento en una variable hacieacutendolo del siguiente modo
variable_direccion lt- (elemento)
Pongamos un ejemplo para ver realmente el funcionamiento y uso de esta posibilidad que CLIPS nosofrece
1 (defrule imprime-area2 instancia lt- (object (is-a Rectangulo))3 =gt4 (printout t Area del rectangulo (instance-name instancia)5 (send instancia calcula-area) crlf)6 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1959
16 Capiacutetulo 3 CLIPS
Cuando se ejecuta esta regla se imprimiraacuten las aacutereas de todas las instancias de la clase Rectangulo Enla parte izquierda de la regla lo que hacemos es guardar en la variable instancia la direccioacuten de la instanciade Rectangulo que estamos tratando en ese momento La regla se ejecutaraacute para todas las instanciasalmacenadas en la memoria de trabajo que cumplan la condicioacuten (is-a Rectangulo) es decir para todaslas instancias de la clase Rectangulo En la parte derecha de la regla donde se ejecutan las acciones podemosver que se imprimiraacute para cada instancia lo siguiente Area del rectangulo [nombre_instancia] aacuterea
del rectaacutengulo La funcioacuten instance-name nos devuelve el nombre de la instancia que le pasamos porparaacutemetro Ademaacutes hemos llamado al gestor de mensajes calcula-area para que nos devuelva el area delrectaacutengulo
344 iquestCoacutemo hacer sentencias or en la izquierda de las reglas
Con (or ) Si por ejemplo tenemos dos hechos (a) y (b) y queremos ejecutar la derecha de la reglacuando se cumpla uno de los dos tendremos que hacer (or (a) (b)) Atencioacuten porque la parte derecha seejecutaraacute tantas veces como veces se cumpla cada uno de los hechos si para nosotros existe tanto (a) como(b) la parte derecha se ejecutaraacute dos veces Para que soacutelo se usa una vez podemos hacer combinaciones de
or y and (funciona igual) o usar un patroacuten por ejemplo (persona Juan|Pedro) soacutelo se ejecutariacutea una vez
345 Com afegir una condicioacute a la part esquerre drsquouna regla
A vegades eacutes necessari que una regla srsquoinstanciiuml si es produeix una condicioacute especial (i no un fet) Per feraixoacute farem servir la comanda (test ltCONDICIOgt)
Per exemple imaginem que la nostre base de fets compte amb un fet (preu valor) amb un preudeterminat Imaginem que volem una regla que srsquoinstanciiuml quan aquest valor eacutes meacutes gran que 30
Per fer-ho fent servir tot el que hem explicat
1 (defrule preucar2 (preu preu)3 (test (gt preu 30))4 =gt5 (printout t El preu es mes gran que 30)6 )
Eacutes a dir si el preu eacutes meacutes gran que 30 srsquoimprimiragrave un missatge per pantallaAquestes condicions poden contenir ANDs i ORs de varies condicionsPer exemple
1 (defrule preulimit2 (preu preu)3 factminim lt- (preuminim minim)4 factmax lt- (preumaxim maxim)5 (test (and (gt preu minim) (lt preu maxim) ))6 =gt7 (retract factminim)8 (retract factmax)9 (printout t El preu estagrave dintre del rang)
On comprovarem si el preu estagrave dintre drsquoun rang determinat i en aquest cas esborra els fets que contenen
el magravexim preu i el miacutenim preu i mostra un missatge per pantalla
346 Puede una misma regla ejecutarse maacutes de una vez
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2059
34 Las reglas 17
Es muy importante entender que cada regla se ejecutaraacute una vez por cada combinacioacuten de valores en suLHS
1 (defrule regla2 (color col)3 (peso pes)4 =gt5
Si tengo tres colores y dos pesos asertados la regla se ejecutaraacute 6 veces una con cada combinacioacuten decolor y peso
347 Com puc definir lrsquoordre de les regles
La idea drsquoun sistema basant en regles eacutes no definir un ordre lineal drsquoaquestes (costa deixar de pensar de
forma iterativa)En el cas de necessitar que una regla srsquoexecuti despreacutes drsquouna altre pots fer servir Fets la regla anteriorcrea un fet que la segona regla tindragrave a la part esquerra
1 (defrule pregunta12 =gt3 (assert (pregunta1Feta))4 5 )6
7 (defrule pregunta2
8 (pregunta1Feta)9 =gt
10 11 )
I finalment pots usar la propietat salience Aquesta propietat indica la prioritat drsquoexecucioacute de les regles( les regles amb salience majors srsquoexecutaran abans ) Pot prendre valors positius i negatius entre -10000 y+10000 Per defecte les regles tenen salience 0
1 (defrule pregunta12 (declare (salience 2))3 =gt4 5 )6
7 (defrule pregunta28 (declare (salience 1))9 =gt
10 11 )
El valor indicado en la propiedad salience puede ser el nuacutemero directamente o una expresioacuten por ejemplovariable10 podemos usar variable para elegir que regla se ejecutaraacute
Las prioridades deben ser usadas solo para determinar el orden en el que se disparan algunas reglas sobreotras no para fijar el flujo de control ya que la principal ventaja de un sistema basado en reglas es larepresentacioacuten declarativa del conocimiento y de esta forma abusando de las prioridades conduce a unsistema procedimental
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2159
18 Capiacutetulo 3 CLIPS
348 Com forccedilar que una regla sigui la primera
Per que aquesta regla sigui la primera ha de tenir el salience meacutes gran de totes
1 (defrule presentacio2 (declare (salience 20))3 =gt4 (printout t ------ Benvingut ----- crlf)5 )
349 Vull guardar certs valors que es fan servir durant lrsquoexecucioacute de diferents regles Com hopuc fer
Tens principalment dues alternatives Si el valor eacutes un tipus bagravesic pots fer servir una variable global ambla sintaxi seguumlent
(defglobal nom_variable = valor)
Aquesta sentegravencia no va a dins de cap funcioacute ni regla es posa sola a la part que creguis convenient delcodi Vegem un exemple
(defglobal preu_minim_primer = 1000)
Per fer-la servir es fa exactament de la mateixa manera que amb una variable normal perograve has de posarels dos asteriscs Per exemple
(bind preu_minim_primer curr-preu)
Per altra banda si el valor o valors que vols guardar han de ser instagravencies una bona estrategravegia pot serutilitzar un deftemplate Eacutes uacutetil sobretot per anar guardant solucions temporals o llistes drsquoelements quepoden formar part de la solucioacute
Per utilitzar-ho has de seguir els passos seguumlents
1 Definir el deftemplate
(deftemplate nom_del_deftemplate(multislot nom_multislot)
(slot nom_slot)
)
Amb un exemple es veuragrave meacutes clar
(deftemplate llista-plats(multislot primers)(multislot segons)(multislot postres)
)
2 Inicialitzar el deftemplate
(defrule[condicions vagraveries] La condicioacute base eacutes que llista-plats no srsquoha inicialitzat encara
(not (llista-plats))=gt
llista conteacute els valors de llista-plats (que de moment estan buits)(bind llista (assert (llista-plats)))
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2259
35 Las clasesinstancias 19
3 Assignar-li valors
(bind segons_plats (find-all-instances ((plat Plat)) TRUE)(modify llista (segons segons_plats))
4 Recuperar els valors
(defrule[condicions vagraveries]llista lt- (llista-plats (segons $segons_plats))
=gt
Ara la variable $segons_plats conteacute tots els elements de segons
35 Las clasesinstancias
351 Tengo que representar la jerarquiacutea de un frame iquestEs preferible antildeadir las subclases a laontologiacutea o bien diferenciarlas mediante un slot en la superclase
Las dos formas son vaacutelidas pero es recomendable representarlas en clases separadas cuando se vayan abuscar instancias de ese tipo ya que asiacute no tendremos que hacer un recorrido por todas las de la superclaseNo obstante si soacutelo se trata de una caracteriacutestica puntual del frame y no vamos a hacer buacutesquedas de unaexclusiva subclase entonces seraacute maacutes eficiente antildeadir un slot debido a su mejor accesibilidad
352 iquestQueacute es un objeto
Podriacuteamos decir que un objeto es un hecho no ordenado con herencia
353 iquestPorqueacute usar objetos en contexto de la praacutectica de CLIPS de IA
Como bien sabemos una parte de la praacutectica de SBCrsquos consisten en crear la ontologiacutea Esta ontologiacutease exporta para poder interactuar con CLIPS en formato pins y pont El archivo pont contendraacute ladeclaracioacuten de todas las clases creadas previamente por Protege (defclass ) El archivo pins contendraacute
todas las instancias de las clases declaradas en el archivo pont Como puede intuir el lector se necesitaraacuteinteractuar con los objetos previamente creados por Protegravegegrave
354 Como se definen las clases
Para definir las clases usaremos el constructor defclass
(defclass ltnombregt [ltcomentariogt](is-a ltnombre-de-superclasegt)[(role concrete | abstract)]
[(pattern-match reactive | non-reactive)]ltslotgt definicioacuten de los atributos de la clase
ltdocumentacioacuten-handlergt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2359
20 Capiacutetulo 3 CLIPS
En caso de desear que la nueva clase herede las propiedades de otra ya existente el nombre de esta deberaacuteespecificarse despues de is-a El rol determinaraacute si la clase es concreta (se puede instanciar) o abstracta(destinada a ser superclase) El pattern-match debe declararse como reactivo si se desea que las instanciasde la clase puedan unificar con los elementos objeto de las reglas (siacutembolo lt-) Los slots correspondena los atributos de la clase y los handlers a las funciones de eacutesta Los handlers se pueden declarar en ladeclaracioacuten de la propia clase pero se deben definir externamente Dado que no aporta ninguna ventaja
declararlos es recomendable definirlos directamente Noacutetese que todo aquello que estaacute entre corchetes ([])constituye informacioacuten adicional que no es obligatorio especificar
1 (defclass Persona2 (is-a Ser_Vivo)3 (role concrete)4 (single-slot edad5 (type INTEGER)6 (range 1 99)7 (cardinality 0 1)8 (create-accessor read-write)9 )
10 (multislot amigos11 (type INSTANCE)12 (allowed-classes Persona)13 )14 )
El comportamiento y declaracioacuten de los slots es ideacutentico al de los slots de los hechos ordenados Losatributos de tipo INSTANCE (referencian otras instancias) estan en formato INSTANCE-NAME
355 Com consulto una instagravencia a partir drsquouna regla
Podem fer servir la part esquerre drsquouna regla per trobar instagravencies Lrsquouacutes eacutes molt semblant a trobar elpunter a un fet fent servir
(object [(is-a ltNOM_CLASSEgt)|(name ltNOM_INSTANCIA)|(ltNOM-SLOTgt ltVALORVARIABLE))])
Per exemple si volem que una regla srsquoinstanciiuml si tenim instanciat un plat de la classe Plat podriem ferservir
1 (defrule tenimplat2 plat lt- (object (is-a Plat))3 =gt4 (print t (send plat get-nom) crlf)
La regla imprimiragrave el nom del plat que trobi Eacutes important notar que srsquoactivaragrave per cada instagravencia de platque tinguem a la base de coneixement
Podem consultar els valors de la instancia fent servir condicions a la part esquerre de la regla Per exemplesi nomeacutes volgueacutessim els plats amb un preu meacutes gran que 30
1 (defrule platCar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Srsquoactivaragrave per tots els plats amb un preu major a 30
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2459
35 Las clasesinstancias 21
Srsquoha drsquoanar amb cura per aquest tipus de regla ja que si la base de coneixement eacutes molt amplia pot acabarderivant amb problemes de memograveria
Per exemple si en comptes de preguntar per una instagravencia de Plat pregunteacutessim per dues instancies dePlat
1 (defrule platsCars2 plat1 lt- (object (is-a Plat) (Preu p1))3 plat2 lt- (object (is-a Plat) (Preu p2))4 (test (gt p1 30))5 (test (gt p2 30))6 =gt7 (print t (send plat1 get-nom) i (send plat1 get-nom) soacuten cars8 crlf)9 )
Faria unificacioacute amb totes les combinacions possibles (amb repeticions) de dos plats de tota la base deconeixement Aixograve es podria anar ampliant fins fer-se intractable
Si tenim drsquoalguna manera el nom de la instancia podem fer
1 (defrule platPicant2 (cuina (plat p))3 (object (name p) (picant pi))4 =gt5 (print t picant pi crlf)6 )
Aixoacute es pot servir per crear condicions que facin servir noms drsquoinstancies que tenim almacenats a slotsdrsquoaltres instancies per exemple
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send v get-Preu) crlf)6 )
Aquesta regla imprimiria el preu del vi asociat al plat si es negre
356 Tengo problemas en condiciones de reglas con slots de instancias obtenidos con send
A veces dan problemas las reglas en las que las condiciones sobre los valores de los slots de una instanciase escriben usando mensajes get sobre los atributos de una instancia en lugar de utilizar patrones paraobtenerlos por ejemplo la regla
1 (defrule platcar2 plat lt- (object (is-a Plat) )3 (test (gt (send plat get-Preu) 30))4 =gt5 (print t (send plat get-nom) es car6 crlf)7 )
No funciona correctamente en CLIPS pero la regla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2559
22 Capiacutetulo 3 CLIPS
1 (defrule platcar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Siacute lo haceEn el caso de que el valor del slot sea booleano se puede escribir la regla como
1 (defrule platpicant2 plat lt- (object (is-a Plat) (Picant TRUE))3 =gt4 (print t (send plat get-nom) es picant crlf)
En el caso de que el slot sea a su vez una instancia se puede utilizar para obtener los valores de estainstancia en la condicion como se explica en la pregunta anterior
357 Tengo problemas con instancias obtenidas del slot de otra instancia en el patroacuten de unaregla
Este problema aparece cuando el patron de una regla instancia una variable a un nombre de instancia yesta no esta definida en el modulo de la regla por ejemplo si la regla siguiente pertenece a un modulo queno es el de la instancia
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4
=gt5 (print t preu (send v get-Preu) crlf)6 )
La regla se quejaraacute de que la instancia no existe al enviarle el send ya que solo se busca la instancia dentrodel moacutedulo de la regla y no en los importados Para arreglar esto se puede usar la funcioacuten (instance-address[ltMODULOgt|] ltINSTANCIAgt) que busca la direccion de la instancia en un modulo concreto o en todos losmoacutedulos que se importan () Deberiacuteamos entonces escribir la regla
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send (instance-address v) get-Preu) crlf)6 )
358 iquestCoacutemo realizar una buacutesqueda de instancias que cumplan unas restricciones
CLIPS nos ofrece varias funciones de buacutesqueda de instancias que cumplan unas determinadas restriccionesque a nosotros nos interese
La funcioacuten find-instance Esta funcioacuten devuelve la primera instancia que cumple todas las restric-ciones indicadas
La funcioacuten find-all-instances Esta funcioacuten devuelve todas las instancias que cumplen las restric-ciones indicadas
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2659
35 Las clasesinstancias 23
La sintaxis de ambas funciones es igual exceptuando el nombre de la funcioacuten(find-all-instances (clase_instancias) (restricciones))A continuacioacuten se muestran varios ejemplos
(bind rectangulos (find-all-instances ((inst Rectangulo)) (gtinstaltura 10))) Des-pueacutes de ejecutar esta funcioacuten en la variable rectangulos habraacute una lista con todas las instancias de la
clase Rectangulo cuya altura sea superior a 10(bind rectangulos (find-all-instances ((inst Rectangulo)) (and (gtinstaltura 10) (=instanchura 7)))) Este trozo de coacutedigo hace que en la variable rectangulos se guarde una listade las instancias de la clase Rectangulo que tienen una altura superior a 10 y una anchura igual a 7
Estas funciones que CLIPS nos ofrece tienen otra funcionalidad y es que podemos realizar buacutesquedas deconjuntos de instancias
(bind rectangulos (find-all-instances ((a Rectangulo) (b Rectangulo)) (= aalturabaltura))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas de instancias de laclase Rectangulo que tienen la misma altura
Por uacuteltimo es necesario comentar que se pueden realizar buacutesquedas de conjuntos de instancias que seande distintas clases
(bind figuras (find-all-instances ((rect Rectangulo) (circ Circulo)) (= rectalturacircradio))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas ltrectangulocirculogtque cumplan que la altura del rectaacutengulo sea igual al radio del ciacuterculo
Existen maacutes comandos para obtener instancias pero son menos utilizadas a nivel baacutesico como pueden serany-instancep do-for-instance do-for-all-instances y delayed-do-for-all-instances
359 iquestCoacutemo se interactuacutea con objetos
La interaccioacuten con objetos se efectuacutea mediante lo que se denomina mensaje
(defmessage-handlerltnombre-clasegtltnombre-mensajegt[lttipo-handlergt] [ltcomentariogt]ltparaacutemetrogt [ltparaacutemetro-comodiacutengt])ltaccioacutengt
)
Un gestor de mensajes consta de 7 partes
1 Nombre de clase a la que el gestor estaraacute asociado
2 Nombre del mensaje
3 Tipo de gestor (Nosotros habitualmente usaremos primary que viene por defecto)
4 Comentario (opcional)
5 Lista de paraacutemetros6 Paraacutemetro comodiacuten (para gestionar muacuteltiples paraacutemetros)
7 Secuencia de acciones o expresiones que seraacuten ejecutadas por el gestor
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2759
24 Capiacutetulo 3 CLIPS
Enfocado a la praacutectica de CLIPS la maacutes comuacuten es que queramos interactuar con objetos para
1 Imprimir los objetos Un ejemplo
1 (defmessage-handler avion imprimir-beneficio ()
2 Para implementar funciones calculadas asociadas al objeto Un ejemplo
1 (defmessage-handler avion calcular-beneficio ()2 ( selfplazas-ocupadas selfprecio-billete))3 )
Como se puede observar el paraacutemetro impliacutecito self contiene la instancia activa para este mensaje
3510 iquestComo se interactuacutea con las instancias de los objetos
Podremos interactuar entre las instancias de los objetos mediante la funcioacuten send
(send ltexpresioacuten-de-objetogtltnombre-de-mensajegtltexpresioacutengt)Donde se toman como argumentos el objeto destino del mensaje el mensaje mismo y otros paraacutemetros
que debieran ser pasados a los gestoresParticularmente en el aacutembito de la praacutectica usualmente necesitaremos utilizar el envioacute de mensajes de
tipo get put and delete Estos mensajes tiene la siguiente sintaxis
get-ltnombre-atributogt
put-ltnombre-atributogt
delete
Aquiacute tenemos un ejemplo de como utilizarlo recordando que ponemos entre corchetes la instancia la cualse enviacutea el mensaje
(defclass avion (is-a USER)(role concrete)(slot precio-billete (create-accessor read) (default 34))(slot plazas-ocupadas (create-accessor write) (default 0)))
Clase creada
gt(make-instance a of avion) Creacioacuten de una instancia de avion[a]
gt(send [a] get-precio-billete) Obtencioacuten de un slot34 Resultado obtenidogt(send [a] put-plazas-ocupadas 100) Modificacioacuten de un slotgt(send [a] delete) Eliminacioacuten de la instanciaTrue
3511 Uso de make-instance
Cuando queremos crear una instancia de una clase para ir rellenandola con los resultados o datos quevayamos obteniendo se haria lo siguiente
(bind variable_instancia (make-instance nombre_instancia of nombre_clase))
Una vez creada podemos jugar con dicha instancia en las diferentes reglas siempre que la llamemos enlos activadores
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2859
35 Las clasesinstancias 25
(defrule reglavar_instancia lt- (object (is-a nombre_clase))=gt
)
De esta manera dentro de la regla podemos hacer acciones con la instancia por ejemplo(send var_instancia put-articulo articulo_ejemplo)
3512 Como generar automaacuteticamente nombres de instancia
En ocasiones queremos crear instancias en reglas y queremos que su nombre sea distinto del de otrasque ya tenemos Para ello podemos utilizar las funciones gensym y gensym La primera genera un siacutembolodel estilo genN donde N es un nuacutemero La segunda hace lo mismo pero aseguraacutendose de que ese siacutembolono exista ya Se puede reiniciar el contador que usan estas dos funciones con el operador (setgen ltnumgt)donde ltnumgt es el nuacutemero por el que queremos que empiecen ahora los siacutembolos
Para usar esto para generar el nombre de una instancia podemos hacer
(make-instance (gensym) of ltclasegt)
Cada vez que se ejecute se generaraacute un nombre de instancia nuevoSi creamos instancias de diferentes clases y queremos que las instancias tengan nombres que podamos
identificar podemos concatenar siacutembolos a los siacutembolos generados por gensym por ejemplo
(make-instance (sym-cat pepe- (gensym)) of ltclasegt)
generaraacute una instancia con el nombre pepe-genN
3513 Com fer un getset drsquoun slot drsquouna classe
Per consultar el valor drsquoun slot drsquouna classe ho podem fer enviant-li un missatge de la seguumlent manera
(send ltVARIABLEgt get-ltNOM_ATRIBUTgt)
Per exemple si tenim una instagravencia de la classe Plat ( instancia ) i volem saber el valor del seu slotnom
(send instancia get-nom)
Per assignar un valor a un slot drsquouna drsquoinstagravencia hem drsquoenviar-li un missatge de la seguumlent manera
(send ltVARIABLEgt put-ltNOM_ATRIBUTgt ltVALORgt)On ltVALORgt pot ser un valor o un megravetode que retorni un valor
(send instancia put-nom nom)
3514 iquestCoacutemo acceder a una instancia cuyo nombre conocemos
Si conocemos el nombre de una instancia y necesitamos acceder a ella es decir necesitamos enviarle alguacutenmensaje mediante la funcioacuten send podemos hacerlo directamente escribiendo en lugar de la variable quealmacena la instancia el nombre de la instancia entre corchetes [ ] A continuacioacuten se muestra un ejemplo
(bind altura_rect1 (send [rect1] get-altura))
En este caso se guardaraacute en la variable altura_rect1 el valor de la altura de la instancia que tiene comonombre rect1
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2959
26 Capiacutetulo 3 CLIPS
3515 Obtenir el nom drsquouna classe
Si tenim una instagravencia drsquouna classe i volem saber el nom de la classe (uacutetil si tenim una bona taxonomiade classes) ho podem fer amb el megravetode (class ltINSTANCIAgt)
Si per exemple imaginem que tenim la classe Actor la qual teacute com subclasses la classe APrincipalASecundari i ACameo Imaginem que estem tractant amb instancies drsquoactors i volem saber si la instanciaque estem tractant es de la classe APrincipal
Ho hauriacuteem de fer de la seguumlent manera
(eq (class instancia) APrincipal)
Fixem-nos que APrincipal eacutes un siacutembol no un String (un truco eacutes fixar-se en que no teacute cometes) Si vol-gueacutessim comparar-ho amb un String (per exemple un String introduiumlt per lrsquousuari) ho podriacuteem transformara un String amb el megravetode str-cat
(eq (str-cat (class instancia)) Principal)
3516 Como convierto un INSTANCE-ADRESS en un INSTANCE-NAME
En alguacuten momento nos podemos encontrar con la situacioacuten de que disponemos de un puntero a unainstancia y necesitamos su nombre o lo contrario En ambos casos podemos usar la funcioacuten instance-nameSu funcionamiento es bidireccional podemos introducirle un instance-name y nos devolveraacute un instance-adress y viceversa
1 (defrule imprimir-nombre2 estlt-(object (is-a Estudiante) (edad 25))3 =gt4 (printout t (instance-name est) crlf)5
)
3517 Com iterar a traveacutes drsquoun multi-slot
El seguumlent tambeacute eacutes vagravelid com exemple de com iterar a traveacutes drsquouna llistaImaginem que tenim una instagravencia de la classe Plat a la varible (plat) la qual teacute un multi-slot drsquoinstagravencies
de la classe Ingredient Imaginem que volem imprimir per pantalla el nom drsquoaquests ingredients (slot nomde la classe Ingredient) Necessitarem iterar sobre la llista drsquoingredients
1 (bind i 1)2 (while (lt= i (length$ (send plat get-ingredients)))3 do4 (bind ingredient (nth$ i (send plat get-ingredients)))5 (printout t (send ingredient get-nom) crlf)6 (bind i (+ i 1))7 )
El megravetode (nth$ ltINDEXgtltLLISTAgt) et retorna lrsquoelement situat a INDEX de LLISTAEl megravetode (length$ ltLLISTAgt) retorna el nuacutemero drsquoelements de LLISTA
3518 Coacutemo modificarinsertarborrar valores en un multislot
Los valores de un multislot se pueden cambiar usando la funcioacuten slot-replace$ La sintaxis es la siguiente
(slot-replace$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt ltvalorgt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3059
35 Las clasesinstancias 27
Donde ltiniciogt y ltfingt son el rango de posiciones del multislot que se quiere modificar y ltvalorgtson los valores que queremos reemplazar Obviamente deberaacute haber tantos valores como posiciones hayamosindicado en el rango
Para insertar nuevos valores podemos usar la funcioacuten slot-insert$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltposgt ltvalorgt)
El valor se inserta delante de la posicioacuten indicada si la posicioacuten es mayor que la longitud del multislot secolocaraacute al final
Para borrar elementos de un multislot podemos usar la funcioacuten slot-delete$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt)
Se borraraacuten los elementos que estaacuten en el rango indicado
3519 Coacutemo recorrer un atributo multievaluado
Supongamos que la variable respuesta tiene una lista de instancias
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 aquiacute hacemos lo que queramos4 )5 )
Loop-for-count funciona como un for primero la variable que haraacute de contador luego el valor de origeny luego el valor final Para controlar el final usamos la funcioacuten que he explicado antes i tomaraacute valoresdesde 1 hasta n asiacute que usando la funcioacuten nth$ obtendremos cada uno de los elementos La variable auxiraacute teniendo cada uno de los valores
3520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz)
Es igual que antes pero con dos bucles
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 (bind aux2 (send aux get-slot_que_queremos))4 (loop-for-count (j 1 (length$ aux2)) do5 (bind aux_final (nth$ j aux2))6 aquiacute ya podemos trabajar con el elemento en concreto7 )8 )
Supongamos que respuesta tiene una lista de instancias con el primer bucle haremos lo mismo que antes ir
iterando por esas instancias Una vez que tenemos cada instancia con aux2 con el segundo bucle iteraremosdentro de sus instancias interiores
Por ejemplo si tenemos varios equipos de fuacutetbol y cada equipo tiene varios jugadores en el primer bucleestamos iterando entre los equipos y en el segundo entre los jugadores de cada equipo en particular
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3159
28 Capiacutetulo 3 CLIPS
3521 Com puc esborrar una instagravencia
Per esborrar una instagravencia (per exemple segons la informacioacute que proporcioni lrsquousuari podem deduir queuna segraverie drsquoinstagravencies eacutes impossible que es facin servir per a la solucioacute) ho podem fer enviant un missatgedelete a la instagravencia eacutes a dir (send ltINSTANCIAgtdelete)
(send inst delete)
Un megravetode que podria ser uacutetil de la cara a la pragravectica podria ser el seguumlent
1 (defrule elimina-instancia2 (declare (salience 10))3 elimina-fact lt- (elimina-inst inst)4 =gt5 (send inst delete)6 (retract elimina-fact)
Imaginem que per exemple que volem eliminar una llista drsquoinstagravencies Per eliminar-les podriacuteem recoacuterrerel llistat marcant les instagravencies que volem esborrar afegint el seguumlent fet
(assert (elimina-instancia inst))
Aixiacute com que elimina-instancia teacute un salience alt esborraria les instagravencies marcades quan tingueacutes ocasioacuteDrsquoaquesta manera ens estalviem el problema de recoacuterrer un llistat drsquoinstagravencies amb un iterador mentre
anem eliminant els elements de la llista cosa que pot donar problemes amb lrsquoiterador
3522 Com imprimir una instagravencia
Per imprimir una classe (uacutetil per exemple per mostrar el resultat final) el millor eacutes definir message-handlersPer exemple imaginem que tenim una classe Plat la qual teacute un slot nom de tipus String Si volgueacutessimimprimir per pantalla un missatge que digueacutes
El nom del plat eacutes ndashltnom del platgtndash
Hauriacuteem de definir un message-handler que simplement imprimiacutes per pantalla el valor de lrsquoslot de laforma
(defmesssage-handler ltCLASSNAMEgt ltMESSAGENAMEgt primary ()ltCODIgt
)
Per el cas de lrsquoexemple
1 (defmessage-handler Plat print primary ()2 (printout t -- selfnom --) )3 )
Per cridar-ho nomeacutes caldragrave enviar-li un missatge a la instagravencia amb el nom del message-handler (enaquest cas print)
(send instancia print)
Un message-handler pot cridar a altres message-handlers amb el que es poden encadenar diverses instagraven-cies Per exemple imaginem que tenim la classe Menuacute la qual teacute un atribut plats que eacutes un llista drsquoinstagravenciesde la classe Plat Dintre del message-handler menuacute podriacuteem iterar a traveacutes de la llista de plats enviant elmissatge print que hem definit anteriorment
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3259
36 Programacioacuten 29
3523 Com es navega entre instagravencies relacionades
Per exemple tinc una instagravencia iA que teacute un slot anomenat slotB que eacutes una instagravencia drsquoun frame B Vullsaber el nom de la instagravencia associada al slotB de iA Ho pots fer aixiacute
(bind B (send iA get-slotB))(bind res (send B get-nom))
Si estagraves dins drsquouna condicioacute ho pots simplificar de la forma seguumlent
(bind res (send iAslotB get-nom)
Els dos punts soacuten equivalents al punt de Java
36 Programacioacuten
361 Com introduir un comentari
Els comentaris a CLIPS va darrere de un com per exemple
Comentari
Tambeacute podem afegir comentaris a les nostres regles deffacts deftemplates etc Generalment van darrereel nom de la estructura per exemple
1 (defrule neteja regla per la qual si la cuina estagrave bruta srsquoafegiragrave una tasca de2 neteja
3 (estat-cuina bruta)4 =gt5 (assert (tasca netejar))6 )
362 Referenciar el valor null a CLIPS
Per referenciar el valor null a clips es fa amb el simbol nil Per exemple si volem saber si una instagravenciainst es null ho podriacuteem fer de la seguumlent manera
(eq inst nil)
363 Formas de recorrer una lista
Para recorrer una lista disponemos de diferentes opciones en este FAQ explicaremos como crear unaestructura tipo ldquoWHILErdquo y tipo ldquoFORrdquo
1 While Esta regla se ejecuta hasta que la expresioacuten a evaluar sea falsa Este tipo de estructura se rigepor seguir la sintaxis while - do y se construiriacutea de la siguiente forma
(while ltexpresioacutengt[do] ltaccioacutengt)
Doacutende dependiendo del valor de ltexpresioacutengt
Valor TRUE Se realizaraacute la accioacuten ltaccioacutengt i se volveraacute a evaluar ltexpresioacutengt
Valor FALSE No se ejecutaraacute la accioacuten ltaccioacutengt
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3359
30 Capiacutetulo 3 CLIPS
2 For Esta regla sirve para ejecutar un bucle N (final - inicio) veces Este tipo de estructura se rige porseguir la sintaxis loop-for-count y se construiriacutea de la siguiente forma
(loop-for-count (ltvargtltiniciogtltfinalgt) [do] ltaccioacutengt)
Doacutende
ltvargt Variable que se usara como iacutendice
ltiniciogt Valor inicial que tendraacute ltvargt
ltfinalgt Ultimo valor que tendraacute la variable ltvargt
ltaccioacutengt Accioacuten que es realizaraacute hasta que ltvargt tenga el valor de ltfingt
364 Formas de elegir una opcioacuten
En este apartado explicaremos como crear una estructura if y una estructura switch
If Este tipo de estructura se rige por seguir la sintaxis if - then - else y se construiriacutea de lasiguiente forma
(if ltexpresioacutengtthen ltaccioacutengt[else ltaccioacuten2gt])
Doacutende dependiendo del valor de ltexpresioacutengt
bull Valor TRUE Se realizaraacute la accioacuten ltaccioacutengtbull Valor FALSE Se realizaraacute la accioacuten ltaccioacuten2gt (en caso de haber)
Switch Este tipo de estructura se rige por seguir la sintaxis switch - opciones y se construiriacutea dela siguiente forma
(switch ltexpresioacuten-testgt(case OPCION1 then ACCION1)(case OPCION2 then ACCION2)
([default] ACCION-DEFAULT)
)
Doacutende dependiendo del valor de ltexpresioacuten-casegt se ejecutaraacute una ltaccioacutengt en particular Si nin-guna ltopcioacutengt es correcta se ejecutara la ltaccioacuten-defaultgt
365 Funciones con la clase String
Habitualmente trabajaremos con Strings o cadena de Strings CLIPS proporciona una serie de herramien-tas para trabajar con esta clase
1 Convertir string a MAYUacuteSCULAS A veces es conveniente tener todos los caracteres en mayuacutesculaspara no tener problemas de comparaciones o simplemente por convenio Para ello CLIPS dispone dela funcioacuten upcase la cual convierte a mayuacutesculas un siacutembolo o string
(upcase ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplos
(upcase Ccedillips es divertido) rarr CcedilLIPS ES DIVERTIDO
(upcase Clips_es_divertido) rarr CLIPS_ES_DIVERTIDO
2 Convertir string a MINUacuteSCULAS la funcioacuten es downcase
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3459
36 Programacioacuten 31
3 Concatenacioacuten de strings Tambieacuten es de gran utilidad poder juntar dos o maacutes paraacutemetros en un solostring Todo paraacutemetro a juntar deben ser de uno de los siguientes tipos symbol String integer floato instance-name
(str-cat parametro1 parametro2 parametroN )
Ejemplo
(str-cat IA nota 10) rarr IAnota10
4 Comparacioacuten de strings Funcioacuten que nos indica si dos strings son iguales
(str-compareltexpresioacuten-simboacutelica-o-de-cadenagtltexpresioacuten-simboacutelica-o-de-cadenagt
)
Esta funcioacuten devuelve
0 Si ambos strings son iguales1 Si el primer string es mayor que el segundo string-1 Si el primer string es menor que el segundo string
5 Longitud de un string Muchas veces es de gran utilidad saber que tamantildeo tiene un string
(str-length ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplo
(str-length Inteligencia Artificial) rarr 23
366 iquestCoacutemo obtener el contenido de una variable en un string
Para conseguir un string a partir de un integer float symbol instance-name debes utilizar el comandostr-cat Si a la funcioacuten le pasamos como paraacutemetros varios elementos los transformaraacute a string y losconcatenaraacute La sintaxis de esta funcioacuten es la siguiente (str-cat elementos) Esta funcioacuten la usaremossobre todo cuando queramos realizar comparaciones entre el contenido de una variable y un string ya quepreviamente necesitaremos usar la funcioacuten str-cat para pasar el contenido de la variable a string y realizarde este modo la comparacioacuten de forma correcta
367 iquestComo se crea una lista
Con create$ Todos los operadores sobre listas llevan el siacutembolo $ al final Igual que con las variables sedebe usar bind siempre que se desee modificar una lista
(bind lista (create$ a b c))
368 iquestComo borro un elemento de una lista
Con delete$Usa la siguiente sintaxis(delete$ ltlistagt ltindice-iniciogt ltindice-finalgt)Se borraraacuten todos los elementos del rango entre las posiciones inicio y final ambas incluidas Tambieacuten exis-
tedelete-member$ (delete-member$ ltlistagt ltelementogt) Borraraacute todas las apariciones del elemento enla lista
(delete$ (create$ a b c d e f) 3 5) minusrarr (a b f)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1259
3 CLIPS
31 Instalacioacuten del CLIPS
311 iquestCoacutemo instalar CLIPS
La herramienta CLIPS es multiplataforma y esta disponible para los tres SO maacutes utilizados MicrosoftWindows Linux y Mac OS X
iquestCoacutemo instalar CLIPS en Windows
Primero de todo debemos bajarnos el programa de la paacutegina oficial de CLIPS accesible desde este link
(httpclipsrulessourceforgenet) Desde el aacuterea de descarga os podreis bajar el instalador parawindows
iquestCoacutemo instalar CLIPS en Linux
En muchas distribuciones de Linux CLIPS esta disponible como un paquete adicional el paquete sueleinstalar la versioacuten con interfaz graacutefico Si no encuentras el paquete especiacutefico para la distribucion que usassiempre puedes compilarlo a partir del paquete con los fuentes
Tambieacuten estaacute la posibilidad de utilisar el emulador de windows WINE Una vez instalado el emulador sepuede instalar CLIPS y este funcionaacute igual que sobre windows
iquestCoacutemo instalar CLIPS en Mac OS X
Primero de todo debemos bajarnos el programa de la paacutegina oficial de CLIPS accesible desde este link(httpclipsrulessourceforgenet ) Desde el aacuterea de descarga podeis bajar el intalador para MACOS X
312 Entorn finestres VS Consola de comandes
Encara que lrsquoentorn de finestres eacutes molt meacutes intuiumltiu CLIPS a la seva versioacute en liacutenea de comandes eacutes moltmeacutes ragravepid (segurament perquegrave no ha de mostrar en tot moment lrsquoagenda de fets les instancies les regles
etc)La diferencia de velocitat eacutes molt notable en cas de problemes de rendiment o de sensacioacute que lrsquoentorn
de finestres es queda penjat (o directament es tanca sense previ aviacutes) recomanem provar la versioacute en liacuteneade comandes
32 Los hechos
321 iquestQueacute es un hecho en CLIPS
Conceptualmente un hecho representa un dato abstracto del cual almacenamos valores Se puede vercomo una lista de campos donde el primer campo hace referencia al ldquodatordquo al cual le asignamos una listade valores que le suceden teniendo una relacioacuten entre siacute
Formalmente el primer campo es un siacutembolo y los campos restantes son valores
9
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1359
10 Capiacutetulo 3 CLIPS
(siacutembolo valor1 valor2 valorN)
322 iquestQueacute es un hecho ordenado (order Facts)
Un hecho ordenado tienen formato libre por lo tanto no existe restriccioacuten alguna en el orden de los campos
Los campos de un hecho ordenado pueden ser de cualquier tipo primitivo de datos excepto el primero quedebe ser un siacutembolo Como ejemplo tenemos
1 (hermanos Antonio Javier Carlos)2 (padre Pedro David)
323 iquestQueacute es un hecho no ordenado (deftemplates facts)
A traveacutes de los hechos no ordenados podemos abstraernos de la estructura de un hecho asignado unnombre a cada campo (slots)
1 (deftemplate nombre-template comentario2 (slot nombre-slot (tipo-del-slot))3 (multislot nombre-slot (tipo-del-slot))4 )
Por ejemplo
1 (deftemplate avioacuten2 (slot nombre_avion (type STRING))3 (slot compania (type STRING))
4 (slot numero_plazas (type INTEGER) (default 100))
324 iquestPuedo tener un vector como slot
Si debe declararse como multislot
325 iquestPuedo asignar propiedades a los slots
Siacute las maacutes importantes son
Type El tipo de dato primitivo que contiene (en mayuacutesculas)
Allowed-X Permite especificar un conjunto de valores permitidos Siendo X un tipo de datos primitivo(en minuacutesculas y plural) rarr si el slot toma un valor del tipo X debe pertenecer a los valores permi-tidos X puede ser values especificando entonces todos los valores posibles que puede tomar el slotindependientemente del tipo de dato
Range Especifica un rango para slots numeacutericos
Cardinality Nuacutemeros miacutenimo y maacuteximo de elementos que puede tener un multislot
Default Valor por defecto Si ponemos NONE como valor por defecto significaraacute que no se podraacute crear la
instancia a no ser que se especifique el valor de ese slot
1 (deftemplate estudiante2 (slot edad (type INTEGER) (range 0 99))
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1459
32 Los hechos 11
3 (multislot asignaturas (type STRING) (cardinality 1 5))4 (slot num-carreres (default 1))5 (multislot notas (allowed-strings MH NP))6 )
326 iquestQueacute debo utilizar hechos ordenados o no ordenados
Como se puede intuir si tenemos un conjunto de hechos los cuales conceptualmente pertenecen al mismoaacutembito seraacute una solucioacuten maacutes elegante agruparlos a traveacutes de un deftemplate En caso que tengamos quealguacuten hecho aislado seraacute mas sencillo declararlo como un hecho ordenado
327 Fets o Objectes
Veient la definicioacute de deftemplate podem confondrersquons a lrsquohora de decidir si fer servir fets o fer servirobjectes
Deixant de banda altres diferegravencies ja comentades (les classes suporten jerarquia de classes heregravenciaetc) els objectes es fan servir per representar el coneixement (mitjanccedilant un conjunt drsquoinstagravencies)
Aixiacute que generalment farem servir classes i objectes per representar coneixement mentre que farem servirels fets per portar control sobre lrsquoexecucioacute del problema
Per exemple podriacuteem definir un deftemplate per emmagatzemar un resultat o per poder controlar lrsquoestatde lrsquoexecucioacute
A la pragravectica de Mikeo (penjada a la web de lrsquoassignatura) teniacuteem un deftemplate habitacion-actual
1 (deftemplate habitacion-actual2 (slot habitacion)3 (slot area-restante)4
(slot presupuesto-restante)5 (slot precio-total)6 (slot prioridad-actual)7 )
Amb el qual controlagravevem la construccioacute drsquouna habitacioacute Assignagravevem una instagravencia de la classe habita-cioacute al slot habitacion de habitacion-actual i mitjanccedilant una segraverie de regles que feien unificacioacute ambhabitacion-actual actuagravevem sobre lrsquohabitacioacute drsquouna manera o drsquoun altre
328 Creacioacuten de hechos (assertdeffacts)
Si queremos crear un solo hecho utilizaremos el comando assert Por ejemplo (assert (casa roja))Si por el contrario queremos crear una estructura ordenada de hechos utilizaremos deffacts
(deffacts mishechos (casa roja) (pelota azul))
329 Modificar un fet
Per modificar un fet (per exemple molt uacutetil si estem treballant amb deftemplates) ho podem fer mitjanccedilant(modify ltINSTANCIAgtltFETSgt)
Per exemple si tingueacutessim el deftemplate persona
1 (deftemplate persona2 (slot nom)3 (slot edad)4 (slot dni)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1559
12 Capiacutetulo 3 CLIPS
I hagueacutessim afegit el fet
(assert (persona (nom Pepe)(edad 25)(dni 46974431)))
I el fet
(assert (aniversari 46974431))
Podriacuteem tenir la seguumlent regla
1 (defrule aniv2 aniversari lt- (aniversari dni)3 persona lt- (persona (edat edat)(dni dni))4 =gt5 (retract aniversari)6 (modify persona (edat (+ 1 edat)))7 )
La qual srsquoactivaragrave si hi ha un fet aniversari drsquouna persona Fent servir el dni indicat al fet aniversaribusquem el fet persona que teacute el mateix dni Deixem el valor edat a la variable edat per poder treballaramb ella meacutes endavant
Hem agafat tambeacute la direccioacute del fet aniversari per tal de poder esborrar-lo de la base de fets Aixograve srsquohafet per dues raons
Primer per mantenir meacutes neta la base de fets Segon i meacutes important Com que hem canviat el fet laregla tornaragrave a fer unificacioacute amb el fet (perquegrave ara eacutes diferent) amb la regla aniversari amb el que entrariadintre drsquoun bucle sense fi on srsquoaniria incrementant lrsquoedat de la persona
Un cop hem esborrat el fet aniversari incrementem en 1 el valor del slot edat de la persona fent servirla variable edat que hem declarat a la part esquerre de la regla
El comportament de modify es fer un retract del fet a la base de fets i despreacutes fer un assert amb els nous
valors Si volem canviar mes drsquoun slot del fet es convenient canviar-los tots a la vegada La raoacute es que cadavegada que fem un modify lrsquoapuntador al fet es modifica i lrsquoapuntador que tenim a la variable que hem fetservir ja no es vagravelid
Si no temim mes remei que fer la modificacioacute del fet pas a pas srsquoha de saber que la crida a modify retornalrsquoapuntador al nou fet Si el guardem a altra variable (o a la mateixa) podrem continuar modificant el fetamb la nova referegravencia
3210 Com elimino un fet de la base de fets
Per eliminar un fet de la base de fets ho podem fer amb la paraula clau (retract ltFETgt) on ltFETgt eacutes
un punter al fetPer obtenir aquest fet ho podem fer fent servir ltVARgtlt- ltFETgt a la part esquerre de la reglaPer exemple
1 (defrule accionsvent2 vent lt- (vent tipus)3 =gt4 (switch tipus5 (case poc then (assert (accio persiana0)))6 (case normal then (assert (accio persiana50)))7 (case molt then (assert (accio persiana100)))8 )9 (retract vent)
10 )
Afegiragrave fets per realitzar les accions pertinents i esborraragrave el fet de la base de fets
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1659
33 Variables 13
33 Variables
331 Variables a CLIPS
No cal declarar una variable (ni el seu tipus) nomeacutes cal afegir un interrogant al comenccedilament drsquoun simbol
per indicar que eacutes una variableCLIPS srsquoencarrega del control de tipus depenent del que assignem a la variablePer exemple testvar correspondria a la variable testvar Si per exemple assigneacutessim lrsquoenter 3 a
testvar CLIPS tractaria la variable com una variable entera
332 Com assignar un valor a una variable
Per assignar un valor a una variable es fa servir el megravetode (bind) amb la forma
(bind ltVARIABLEgtltVALORgt)
On ltVALORgt pot ser un valor o un megravetode que retorni un valor Per exemple si volem assignar un 4 a lavariable var
(bind var 4)
O per exemple podriacuteem assignar a la variable var la suma de 2 meacutes 2
(bind var (+ 2 2))
333 iquestCoacutemo declarar variables globales
Para crear una variable global hay que meterla dentro de la construccioacuten defglobal La declaracioacuten de la
variable seguiraacute el modelo nombreVariable = expresioacutenPor ejemplo
(defglobal presupuesto = 0)
Pueden aparecer en la parte izquierda de las reglas si no son utilizadas para asignar un valor y su cambiono activa reglas pero no pueden ser paraacutemetros de funciones ni meacutetodos
334 iquestCoacutemo trabajar con variables sumando restando por ejemplo contadores
La mejor forma es con variables globales se definen asiacute (defglobal x = 0) puede ser el valor quequeramos tanto nuacutemero string Y si queremos sumarle 10 por ejemplo
(bind x (+ x 10))
Las variables locales como por ejemplo x soacutelo tienen valor mientras dura su ejecucioacuten y eso suele ser enesa misma liacutenea o en un bucle Si le damos valor a x y luego preguntamos por ella nos diraacute que no existe
335 Quina diferegravencia hi ha entre les variables del tipus nom_variable i les del tipus $nom_variable
Les primeres contenen un sol valor i les segones en poder contenir meacutes drsquoun (o cap)
336 Quegrave significa lrsquointerrogant () quan va sol
Eacutes una variable anogravenima Pots utilitzar sense posar-hi cap nom si no trsquointeressa el valor en concret Perexemple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1759
14 Capiacutetulo 3 CLIPS
(Primer filtre_preu )
Aquesta condicioacute significa ldquosi el fet (Primer filtre_preu) teacute algun valorrdquo O sigui que si tingueacutessimel fet (Primer filtre_preu ok) es compliria la condicioacute (i si en comptes de ldquookrdquo fos ldquopatatardquo tambeacute escompliria) En canvi si el fet fos uacutenicament (Primer filtre_preu) no es compliria la condicioacute
337 Quegrave significa el dogravelar ($) quan va sol
Eacutes com lrsquointerrogant perograve admet meacutes drsquoun valor Per exemple
(Primer filtre_preu $ ok)
donaragrave cert pels fets de lrsquoestil (Primer filtre_preu patata ok) (Primer filtre_preu hola ok)(Primer filtre_preu patata hola ok) (Primer filtre_preu ok) Eacutes a dir no importa els valors quehi hagi entre filtre_preu i ok si al final hi ha un ok
338 iquestComo puedo ver los hechos presentes en un momento determinado
Abriendo la Facts Window en Window de la barra de menuacute
34 Las reglas
341 iquestCoacutemo construir una regla
Para construir una regla utilizaremos la construccioacuten defrule
Sintaxis
(defrule ltnombre-reglagt [ltcomentariogt][ltdeclaracioacutengt]ltelemento-condicioacutengt Parte izquierda (LHS)
=gtltaccioacutengt) Parte dcha (RHS) de la regla
Una regla consta de un conjunto de condiciones (antecedente) tambieacuten denominados elementos condicio-nales (EC) o parte izquierda (LHS) y de un conjunto de acciones (consecuente) tambieacuten denominado partederecha de la regla (RHS) La regla se activaraacute siempre que se satisfagan todos los EC mediante hechos oinstancias que los cumplan
Si se introduce en la base de reglas una nueva regla con el mismo nombre que el de una existente la nuevaregla reemplazaraacute a la antigua
Si una regla no tiene parte izquierda es decir no tiene elementos condicionales entonces el hecho(initial-fact) actuaraacute como el elemento condicional para ese tipo de reglas y la regla se activaraacute cadavez que se ejecute un comando reset
342 iquestCoacutemo gestionar la parte izquierda (LHS) de una regla
Declarar hechosSi no se especifica ninguna condicioacuten la regla se activaraacute siempre Una condicioacuten puede ser un simple hecho
(Ej vegetariano) o un hecho ordenado con unos valores concretos (Ej (persona (nombre Juan))) Si loque queremos es obtener el valor de un hecho insertaremos una variable en su lugar (Ej (persona (nombre
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1859
34 Las reglas 15
n)) ) Entonces entraraacute en la regla para cada valor posible que pueda asignar a la variable n a partir delos hechos
Si queremos indicar cualquier valor utilizaremos el siacutembolo y para cualquier lista el siacutembolo $ (Ej(evento ) (estilo $) ) Tambieacuten existe la opcioacuten de guardar en una variable una referencia al objetoEllo se consigue poniendo var lt- a su izquierda (Ej p lt- (persona (nombre Juan))) Se puede usarpor ejemplo para pasaacuterselo de paraacutemetro a una funcioacuten llamada en la RHS
Establecer condiciones
Ademaacutes podemos especificar restricciones adicionales sobre los valores que puede tomar un campo de unhecho Existen tres tipos principales de restricciones Conectadas (por orden de precedencia o prioridad)
not (~) Evita que cierto campo cumpla determinada restriccioacuten
and (amp) Combina dos restricciones conjuntivamente
or (|) Combina dos restricciones disjuntivamente
De predicado () Obliga a que cierto campo cumpla determinada condicioacuten (especificada por el predicado)
Por valor devuelto por una funcioacuten = Permite llamar a una funcioacuten y utilizar el valor devuelto pararestringir el valor que pueda tomar un campo de un hecho
Se puede comprobar si se cumple una determinada condicioacuten mediante el constructor test Dentro detest se pueden hacer llamadas a cualquier funcioacuten o predicado ya sea primitiva de CLIPS o definidapor nosotros
Combinar elementos
Los diferentes elementos de la parte izquierda van impliacutecitamente unidos mediante una AND que indicaconjuncioacuten No obstante podemos hacerlo expliacutecitamente mediante (and (cond1) (cond2)) aunque suelen
utilizarse para anidar ANDs dentro de ORsOR Sirve para hacer una disyuncioacuten (or (cond1) (cond2)) Es equivalente a escribir varias reglas en lasque cada una de ellas tenga uno de los componentes del OR en su parte izquierda y la misma parte derecha
NOT Sirve para detectar si no existe un determinado hecho (Ej (not (estilo sibarita)))exists Cuando a un conjunto de elementos se le antecede exists se comprueba que hay al menos un
hecho en la base de hechos que cumpla la condicioacuten (Ej (exists(bebida precio (ltprecio 5))) )forall Permite comprobar si todos los hechos que satisfacen un determinado patroacuten cumplen una serie
de condiciones (Ej (forall(plato (estilo moderno)))
343 iquestCoacutemo obtener la direccioacuten de hechos o instancias situados en LHS
En algunas ocasiones vamos a necesitar realizar alguacuten tipo de accioacuten en la parte derecha de las reglassobre hechos o instancias que cumplan unas determinadas condiciones Pero para ello necesitaremos primerotener acceso a estos elementos para despueacutes poder operar sobre ellos Esto lo conseguiremos guardando ladireccioacuten del elemento en una variable hacieacutendolo del siguiente modo
variable_direccion lt- (elemento)
Pongamos un ejemplo para ver realmente el funcionamiento y uso de esta posibilidad que CLIPS nosofrece
1 (defrule imprime-area2 instancia lt- (object (is-a Rectangulo))3 =gt4 (printout t Area del rectangulo (instance-name instancia)5 (send instancia calcula-area) crlf)6 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1959
16 Capiacutetulo 3 CLIPS
Cuando se ejecuta esta regla se imprimiraacuten las aacutereas de todas las instancias de la clase Rectangulo Enla parte izquierda de la regla lo que hacemos es guardar en la variable instancia la direccioacuten de la instanciade Rectangulo que estamos tratando en ese momento La regla se ejecutaraacute para todas las instanciasalmacenadas en la memoria de trabajo que cumplan la condicioacuten (is-a Rectangulo) es decir para todaslas instancias de la clase Rectangulo En la parte derecha de la regla donde se ejecutan las acciones podemosver que se imprimiraacute para cada instancia lo siguiente Area del rectangulo [nombre_instancia] aacuterea
del rectaacutengulo La funcioacuten instance-name nos devuelve el nombre de la instancia que le pasamos porparaacutemetro Ademaacutes hemos llamado al gestor de mensajes calcula-area para que nos devuelva el area delrectaacutengulo
344 iquestCoacutemo hacer sentencias or en la izquierda de las reglas
Con (or ) Si por ejemplo tenemos dos hechos (a) y (b) y queremos ejecutar la derecha de la reglacuando se cumpla uno de los dos tendremos que hacer (or (a) (b)) Atencioacuten porque la parte derecha seejecutaraacute tantas veces como veces se cumpla cada uno de los hechos si para nosotros existe tanto (a) como(b) la parte derecha se ejecutaraacute dos veces Para que soacutelo se usa una vez podemos hacer combinaciones de
or y and (funciona igual) o usar un patroacuten por ejemplo (persona Juan|Pedro) soacutelo se ejecutariacutea una vez
345 Com afegir una condicioacute a la part esquerre drsquouna regla
A vegades eacutes necessari que una regla srsquoinstanciiuml si es produeix una condicioacute especial (i no un fet) Per feraixoacute farem servir la comanda (test ltCONDICIOgt)
Per exemple imaginem que la nostre base de fets compte amb un fet (preu valor) amb un preudeterminat Imaginem que volem una regla que srsquoinstanciiuml quan aquest valor eacutes meacutes gran que 30
Per fer-ho fent servir tot el que hem explicat
1 (defrule preucar2 (preu preu)3 (test (gt preu 30))4 =gt5 (printout t El preu es mes gran que 30)6 )
Eacutes a dir si el preu eacutes meacutes gran que 30 srsquoimprimiragrave un missatge per pantallaAquestes condicions poden contenir ANDs i ORs de varies condicionsPer exemple
1 (defrule preulimit2 (preu preu)3 factminim lt- (preuminim minim)4 factmax lt- (preumaxim maxim)5 (test (and (gt preu minim) (lt preu maxim) ))6 =gt7 (retract factminim)8 (retract factmax)9 (printout t El preu estagrave dintre del rang)
On comprovarem si el preu estagrave dintre drsquoun rang determinat i en aquest cas esborra els fets que contenen
el magravexim preu i el miacutenim preu i mostra un missatge per pantalla
346 Puede una misma regla ejecutarse maacutes de una vez
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2059
34 Las reglas 17
Es muy importante entender que cada regla se ejecutaraacute una vez por cada combinacioacuten de valores en suLHS
1 (defrule regla2 (color col)3 (peso pes)4 =gt5
Si tengo tres colores y dos pesos asertados la regla se ejecutaraacute 6 veces una con cada combinacioacuten decolor y peso
347 Com puc definir lrsquoordre de les regles
La idea drsquoun sistema basant en regles eacutes no definir un ordre lineal drsquoaquestes (costa deixar de pensar de
forma iterativa)En el cas de necessitar que una regla srsquoexecuti despreacutes drsquouna altre pots fer servir Fets la regla anteriorcrea un fet que la segona regla tindragrave a la part esquerra
1 (defrule pregunta12 =gt3 (assert (pregunta1Feta))4 5 )6
7 (defrule pregunta2
8 (pregunta1Feta)9 =gt
10 11 )
I finalment pots usar la propietat salience Aquesta propietat indica la prioritat drsquoexecucioacute de les regles( les regles amb salience majors srsquoexecutaran abans ) Pot prendre valors positius i negatius entre -10000 y+10000 Per defecte les regles tenen salience 0
1 (defrule pregunta12 (declare (salience 2))3 =gt4 5 )6
7 (defrule pregunta28 (declare (salience 1))9 =gt
10 11 )
El valor indicado en la propiedad salience puede ser el nuacutemero directamente o una expresioacuten por ejemplovariable10 podemos usar variable para elegir que regla se ejecutaraacute
Las prioridades deben ser usadas solo para determinar el orden en el que se disparan algunas reglas sobreotras no para fijar el flujo de control ya que la principal ventaja de un sistema basado en reglas es larepresentacioacuten declarativa del conocimiento y de esta forma abusando de las prioridades conduce a unsistema procedimental
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2159
18 Capiacutetulo 3 CLIPS
348 Com forccedilar que una regla sigui la primera
Per que aquesta regla sigui la primera ha de tenir el salience meacutes gran de totes
1 (defrule presentacio2 (declare (salience 20))3 =gt4 (printout t ------ Benvingut ----- crlf)5 )
349 Vull guardar certs valors que es fan servir durant lrsquoexecucioacute de diferents regles Com hopuc fer
Tens principalment dues alternatives Si el valor eacutes un tipus bagravesic pots fer servir una variable global ambla sintaxi seguumlent
(defglobal nom_variable = valor)
Aquesta sentegravencia no va a dins de cap funcioacute ni regla es posa sola a la part que creguis convenient delcodi Vegem un exemple
(defglobal preu_minim_primer = 1000)
Per fer-la servir es fa exactament de la mateixa manera que amb una variable normal perograve has de posarels dos asteriscs Per exemple
(bind preu_minim_primer curr-preu)
Per altra banda si el valor o valors que vols guardar han de ser instagravencies una bona estrategravegia pot serutilitzar un deftemplate Eacutes uacutetil sobretot per anar guardant solucions temporals o llistes drsquoelements quepoden formar part de la solucioacute
Per utilitzar-ho has de seguir els passos seguumlents
1 Definir el deftemplate
(deftemplate nom_del_deftemplate(multislot nom_multislot)
(slot nom_slot)
)
Amb un exemple es veuragrave meacutes clar
(deftemplate llista-plats(multislot primers)(multislot segons)(multislot postres)
)
2 Inicialitzar el deftemplate
(defrule[condicions vagraveries] La condicioacute base eacutes que llista-plats no srsquoha inicialitzat encara
(not (llista-plats))=gt
llista conteacute els valors de llista-plats (que de moment estan buits)(bind llista (assert (llista-plats)))
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2259
35 Las clasesinstancias 19
3 Assignar-li valors
(bind segons_plats (find-all-instances ((plat Plat)) TRUE)(modify llista (segons segons_plats))
4 Recuperar els valors
(defrule[condicions vagraveries]llista lt- (llista-plats (segons $segons_plats))
=gt
Ara la variable $segons_plats conteacute tots els elements de segons
35 Las clasesinstancias
351 Tengo que representar la jerarquiacutea de un frame iquestEs preferible antildeadir las subclases a laontologiacutea o bien diferenciarlas mediante un slot en la superclase
Las dos formas son vaacutelidas pero es recomendable representarlas en clases separadas cuando se vayan abuscar instancias de ese tipo ya que asiacute no tendremos que hacer un recorrido por todas las de la superclaseNo obstante si soacutelo se trata de una caracteriacutestica puntual del frame y no vamos a hacer buacutesquedas de unaexclusiva subclase entonces seraacute maacutes eficiente antildeadir un slot debido a su mejor accesibilidad
352 iquestQueacute es un objeto
Podriacuteamos decir que un objeto es un hecho no ordenado con herencia
353 iquestPorqueacute usar objetos en contexto de la praacutectica de CLIPS de IA
Como bien sabemos una parte de la praacutectica de SBCrsquos consisten en crear la ontologiacutea Esta ontologiacutease exporta para poder interactuar con CLIPS en formato pins y pont El archivo pont contendraacute ladeclaracioacuten de todas las clases creadas previamente por Protege (defclass ) El archivo pins contendraacute
todas las instancias de las clases declaradas en el archivo pont Como puede intuir el lector se necesitaraacuteinteractuar con los objetos previamente creados por Protegravegegrave
354 Como se definen las clases
Para definir las clases usaremos el constructor defclass
(defclass ltnombregt [ltcomentariogt](is-a ltnombre-de-superclasegt)[(role concrete | abstract)]
[(pattern-match reactive | non-reactive)]ltslotgt definicioacuten de los atributos de la clase
ltdocumentacioacuten-handlergt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2359
20 Capiacutetulo 3 CLIPS
En caso de desear que la nueva clase herede las propiedades de otra ya existente el nombre de esta deberaacuteespecificarse despues de is-a El rol determinaraacute si la clase es concreta (se puede instanciar) o abstracta(destinada a ser superclase) El pattern-match debe declararse como reactivo si se desea que las instanciasde la clase puedan unificar con los elementos objeto de las reglas (siacutembolo lt-) Los slots correspondena los atributos de la clase y los handlers a las funciones de eacutesta Los handlers se pueden declarar en ladeclaracioacuten de la propia clase pero se deben definir externamente Dado que no aporta ninguna ventaja
declararlos es recomendable definirlos directamente Noacutetese que todo aquello que estaacute entre corchetes ([])constituye informacioacuten adicional que no es obligatorio especificar
1 (defclass Persona2 (is-a Ser_Vivo)3 (role concrete)4 (single-slot edad5 (type INTEGER)6 (range 1 99)7 (cardinality 0 1)8 (create-accessor read-write)9 )
10 (multislot amigos11 (type INSTANCE)12 (allowed-classes Persona)13 )14 )
El comportamiento y declaracioacuten de los slots es ideacutentico al de los slots de los hechos ordenados Losatributos de tipo INSTANCE (referencian otras instancias) estan en formato INSTANCE-NAME
355 Com consulto una instagravencia a partir drsquouna regla
Podem fer servir la part esquerre drsquouna regla per trobar instagravencies Lrsquouacutes eacutes molt semblant a trobar elpunter a un fet fent servir
(object [(is-a ltNOM_CLASSEgt)|(name ltNOM_INSTANCIA)|(ltNOM-SLOTgt ltVALORVARIABLE))])
Per exemple si volem que una regla srsquoinstanciiuml si tenim instanciat un plat de la classe Plat podriem ferservir
1 (defrule tenimplat2 plat lt- (object (is-a Plat))3 =gt4 (print t (send plat get-nom) crlf)
La regla imprimiragrave el nom del plat que trobi Eacutes important notar que srsquoactivaragrave per cada instagravencia de platque tinguem a la base de coneixement
Podem consultar els valors de la instancia fent servir condicions a la part esquerre de la regla Per exemplesi nomeacutes volgueacutessim els plats amb un preu meacutes gran que 30
1 (defrule platCar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Srsquoactivaragrave per tots els plats amb un preu major a 30
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2459
35 Las clasesinstancias 21
Srsquoha drsquoanar amb cura per aquest tipus de regla ja que si la base de coneixement eacutes molt amplia pot acabarderivant amb problemes de memograveria
Per exemple si en comptes de preguntar per una instagravencia de Plat pregunteacutessim per dues instancies dePlat
1 (defrule platsCars2 plat1 lt- (object (is-a Plat) (Preu p1))3 plat2 lt- (object (is-a Plat) (Preu p2))4 (test (gt p1 30))5 (test (gt p2 30))6 =gt7 (print t (send plat1 get-nom) i (send plat1 get-nom) soacuten cars8 crlf)9 )
Faria unificacioacute amb totes les combinacions possibles (amb repeticions) de dos plats de tota la base deconeixement Aixograve es podria anar ampliant fins fer-se intractable
Si tenim drsquoalguna manera el nom de la instancia podem fer
1 (defrule platPicant2 (cuina (plat p))3 (object (name p) (picant pi))4 =gt5 (print t picant pi crlf)6 )
Aixoacute es pot servir per crear condicions que facin servir noms drsquoinstancies que tenim almacenats a slotsdrsquoaltres instancies per exemple
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send v get-Preu) crlf)6 )
Aquesta regla imprimiria el preu del vi asociat al plat si es negre
356 Tengo problemas en condiciones de reglas con slots de instancias obtenidos con send
A veces dan problemas las reglas en las que las condiciones sobre los valores de los slots de una instanciase escriben usando mensajes get sobre los atributos de una instancia en lugar de utilizar patrones paraobtenerlos por ejemplo la regla
1 (defrule platcar2 plat lt- (object (is-a Plat) )3 (test (gt (send plat get-Preu) 30))4 =gt5 (print t (send plat get-nom) es car6 crlf)7 )
No funciona correctamente en CLIPS pero la regla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2559
22 Capiacutetulo 3 CLIPS
1 (defrule platcar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Siacute lo haceEn el caso de que el valor del slot sea booleano se puede escribir la regla como
1 (defrule platpicant2 plat lt- (object (is-a Plat) (Picant TRUE))3 =gt4 (print t (send plat get-nom) es picant crlf)
En el caso de que el slot sea a su vez una instancia se puede utilizar para obtener los valores de estainstancia en la condicion como se explica en la pregunta anterior
357 Tengo problemas con instancias obtenidas del slot de otra instancia en el patroacuten de unaregla
Este problema aparece cuando el patron de una regla instancia una variable a un nombre de instancia yesta no esta definida en el modulo de la regla por ejemplo si la regla siguiente pertenece a un modulo queno es el de la instancia
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4
=gt5 (print t preu (send v get-Preu) crlf)6 )
La regla se quejaraacute de que la instancia no existe al enviarle el send ya que solo se busca la instancia dentrodel moacutedulo de la regla y no en los importados Para arreglar esto se puede usar la funcioacuten (instance-address[ltMODULOgt|] ltINSTANCIAgt) que busca la direccion de la instancia en un modulo concreto o en todos losmoacutedulos que se importan () Deberiacuteamos entonces escribir la regla
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send (instance-address v) get-Preu) crlf)6 )
358 iquestCoacutemo realizar una buacutesqueda de instancias que cumplan unas restricciones
CLIPS nos ofrece varias funciones de buacutesqueda de instancias que cumplan unas determinadas restriccionesque a nosotros nos interese
La funcioacuten find-instance Esta funcioacuten devuelve la primera instancia que cumple todas las restric-ciones indicadas
La funcioacuten find-all-instances Esta funcioacuten devuelve todas las instancias que cumplen las restric-ciones indicadas
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2659
35 Las clasesinstancias 23
La sintaxis de ambas funciones es igual exceptuando el nombre de la funcioacuten(find-all-instances (clase_instancias) (restricciones))A continuacioacuten se muestran varios ejemplos
(bind rectangulos (find-all-instances ((inst Rectangulo)) (gtinstaltura 10))) Des-pueacutes de ejecutar esta funcioacuten en la variable rectangulos habraacute una lista con todas las instancias de la
clase Rectangulo cuya altura sea superior a 10(bind rectangulos (find-all-instances ((inst Rectangulo)) (and (gtinstaltura 10) (=instanchura 7)))) Este trozo de coacutedigo hace que en la variable rectangulos se guarde una listade las instancias de la clase Rectangulo que tienen una altura superior a 10 y una anchura igual a 7
Estas funciones que CLIPS nos ofrece tienen otra funcionalidad y es que podemos realizar buacutesquedas deconjuntos de instancias
(bind rectangulos (find-all-instances ((a Rectangulo) (b Rectangulo)) (= aalturabaltura))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas de instancias de laclase Rectangulo que tienen la misma altura
Por uacuteltimo es necesario comentar que se pueden realizar buacutesquedas de conjuntos de instancias que seande distintas clases
(bind figuras (find-all-instances ((rect Rectangulo) (circ Circulo)) (= rectalturacircradio))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas ltrectangulocirculogtque cumplan que la altura del rectaacutengulo sea igual al radio del ciacuterculo
Existen maacutes comandos para obtener instancias pero son menos utilizadas a nivel baacutesico como pueden serany-instancep do-for-instance do-for-all-instances y delayed-do-for-all-instances
359 iquestCoacutemo se interactuacutea con objetos
La interaccioacuten con objetos se efectuacutea mediante lo que se denomina mensaje
(defmessage-handlerltnombre-clasegtltnombre-mensajegt[lttipo-handlergt] [ltcomentariogt]ltparaacutemetrogt [ltparaacutemetro-comodiacutengt])ltaccioacutengt
)
Un gestor de mensajes consta de 7 partes
1 Nombre de clase a la que el gestor estaraacute asociado
2 Nombre del mensaje
3 Tipo de gestor (Nosotros habitualmente usaremos primary que viene por defecto)
4 Comentario (opcional)
5 Lista de paraacutemetros6 Paraacutemetro comodiacuten (para gestionar muacuteltiples paraacutemetros)
7 Secuencia de acciones o expresiones que seraacuten ejecutadas por el gestor
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2759
24 Capiacutetulo 3 CLIPS
Enfocado a la praacutectica de CLIPS la maacutes comuacuten es que queramos interactuar con objetos para
1 Imprimir los objetos Un ejemplo
1 (defmessage-handler avion imprimir-beneficio ()
2 Para implementar funciones calculadas asociadas al objeto Un ejemplo
1 (defmessage-handler avion calcular-beneficio ()2 ( selfplazas-ocupadas selfprecio-billete))3 )
Como se puede observar el paraacutemetro impliacutecito self contiene la instancia activa para este mensaje
3510 iquestComo se interactuacutea con las instancias de los objetos
Podremos interactuar entre las instancias de los objetos mediante la funcioacuten send
(send ltexpresioacuten-de-objetogtltnombre-de-mensajegtltexpresioacutengt)Donde se toman como argumentos el objeto destino del mensaje el mensaje mismo y otros paraacutemetros
que debieran ser pasados a los gestoresParticularmente en el aacutembito de la praacutectica usualmente necesitaremos utilizar el envioacute de mensajes de
tipo get put and delete Estos mensajes tiene la siguiente sintaxis
get-ltnombre-atributogt
put-ltnombre-atributogt
delete
Aquiacute tenemos un ejemplo de como utilizarlo recordando que ponemos entre corchetes la instancia la cualse enviacutea el mensaje
(defclass avion (is-a USER)(role concrete)(slot precio-billete (create-accessor read) (default 34))(slot plazas-ocupadas (create-accessor write) (default 0)))
Clase creada
gt(make-instance a of avion) Creacioacuten de una instancia de avion[a]
gt(send [a] get-precio-billete) Obtencioacuten de un slot34 Resultado obtenidogt(send [a] put-plazas-ocupadas 100) Modificacioacuten de un slotgt(send [a] delete) Eliminacioacuten de la instanciaTrue
3511 Uso de make-instance
Cuando queremos crear una instancia de una clase para ir rellenandola con los resultados o datos quevayamos obteniendo se haria lo siguiente
(bind variable_instancia (make-instance nombre_instancia of nombre_clase))
Una vez creada podemos jugar con dicha instancia en las diferentes reglas siempre que la llamemos enlos activadores
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2859
35 Las clasesinstancias 25
(defrule reglavar_instancia lt- (object (is-a nombre_clase))=gt
)
De esta manera dentro de la regla podemos hacer acciones con la instancia por ejemplo(send var_instancia put-articulo articulo_ejemplo)
3512 Como generar automaacuteticamente nombres de instancia
En ocasiones queremos crear instancias en reglas y queremos que su nombre sea distinto del de otrasque ya tenemos Para ello podemos utilizar las funciones gensym y gensym La primera genera un siacutembolodel estilo genN donde N es un nuacutemero La segunda hace lo mismo pero aseguraacutendose de que ese siacutembolono exista ya Se puede reiniciar el contador que usan estas dos funciones con el operador (setgen ltnumgt)donde ltnumgt es el nuacutemero por el que queremos que empiecen ahora los siacutembolos
Para usar esto para generar el nombre de una instancia podemos hacer
(make-instance (gensym) of ltclasegt)
Cada vez que se ejecute se generaraacute un nombre de instancia nuevoSi creamos instancias de diferentes clases y queremos que las instancias tengan nombres que podamos
identificar podemos concatenar siacutembolos a los siacutembolos generados por gensym por ejemplo
(make-instance (sym-cat pepe- (gensym)) of ltclasegt)
generaraacute una instancia con el nombre pepe-genN
3513 Com fer un getset drsquoun slot drsquouna classe
Per consultar el valor drsquoun slot drsquouna classe ho podem fer enviant-li un missatge de la seguumlent manera
(send ltVARIABLEgt get-ltNOM_ATRIBUTgt)
Per exemple si tenim una instagravencia de la classe Plat ( instancia ) i volem saber el valor del seu slotnom
(send instancia get-nom)
Per assignar un valor a un slot drsquouna drsquoinstagravencia hem drsquoenviar-li un missatge de la seguumlent manera
(send ltVARIABLEgt put-ltNOM_ATRIBUTgt ltVALORgt)On ltVALORgt pot ser un valor o un megravetode que retorni un valor
(send instancia put-nom nom)
3514 iquestCoacutemo acceder a una instancia cuyo nombre conocemos
Si conocemos el nombre de una instancia y necesitamos acceder a ella es decir necesitamos enviarle alguacutenmensaje mediante la funcioacuten send podemos hacerlo directamente escribiendo en lugar de la variable quealmacena la instancia el nombre de la instancia entre corchetes [ ] A continuacioacuten se muestra un ejemplo
(bind altura_rect1 (send [rect1] get-altura))
En este caso se guardaraacute en la variable altura_rect1 el valor de la altura de la instancia que tiene comonombre rect1
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2959
26 Capiacutetulo 3 CLIPS
3515 Obtenir el nom drsquouna classe
Si tenim una instagravencia drsquouna classe i volem saber el nom de la classe (uacutetil si tenim una bona taxonomiade classes) ho podem fer amb el megravetode (class ltINSTANCIAgt)
Si per exemple imaginem que tenim la classe Actor la qual teacute com subclasses la classe APrincipalASecundari i ACameo Imaginem que estem tractant amb instancies drsquoactors i volem saber si la instanciaque estem tractant es de la classe APrincipal
Ho hauriacuteem de fer de la seguumlent manera
(eq (class instancia) APrincipal)
Fixem-nos que APrincipal eacutes un siacutembol no un String (un truco eacutes fixar-se en que no teacute cometes) Si vol-gueacutessim comparar-ho amb un String (per exemple un String introduiumlt per lrsquousuari) ho podriacuteem transformara un String amb el megravetode str-cat
(eq (str-cat (class instancia)) Principal)
3516 Como convierto un INSTANCE-ADRESS en un INSTANCE-NAME
En alguacuten momento nos podemos encontrar con la situacioacuten de que disponemos de un puntero a unainstancia y necesitamos su nombre o lo contrario En ambos casos podemos usar la funcioacuten instance-nameSu funcionamiento es bidireccional podemos introducirle un instance-name y nos devolveraacute un instance-adress y viceversa
1 (defrule imprimir-nombre2 estlt-(object (is-a Estudiante) (edad 25))3 =gt4 (printout t (instance-name est) crlf)5
)
3517 Com iterar a traveacutes drsquoun multi-slot
El seguumlent tambeacute eacutes vagravelid com exemple de com iterar a traveacutes drsquouna llistaImaginem que tenim una instagravencia de la classe Plat a la varible (plat) la qual teacute un multi-slot drsquoinstagravencies
de la classe Ingredient Imaginem que volem imprimir per pantalla el nom drsquoaquests ingredients (slot nomde la classe Ingredient) Necessitarem iterar sobre la llista drsquoingredients
1 (bind i 1)2 (while (lt= i (length$ (send plat get-ingredients)))3 do4 (bind ingredient (nth$ i (send plat get-ingredients)))5 (printout t (send ingredient get-nom) crlf)6 (bind i (+ i 1))7 )
El megravetode (nth$ ltINDEXgtltLLISTAgt) et retorna lrsquoelement situat a INDEX de LLISTAEl megravetode (length$ ltLLISTAgt) retorna el nuacutemero drsquoelements de LLISTA
3518 Coacutemo modificarinsertarborrar valores en un multislot
Los valores de un multislot se pueden cambiar usando la funcioacuten slot-replace$ La sintaxis es la siguiente
(slot-replace$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt ltvalorgt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3059
35 Las clasesinstancias 27
Donde ltiniciogt y ltfingt son el rango de posiciones del multislot que se quiere modificar y ltvalorgtson los valores que queremos reemplazar Obviamente deberaacute haber tantos valores como posiciones hayamosindicado en el rango
Para insertar nuevos valores podemos usar la funcioacuten slot-insert$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltposgt ltvalorgt)
El valor se inserta delante de la posicioacuten indicada si la posicioacuten es mayor que la longitud del multislot secolocaraacute al final
Para borrar elementos de un multislot podemos usar la funcioacuten slot-delete$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt)
Se borraraacuten los elementos que estaacuten en el rango indicado
3519 Coacutemo recorrer un atributo multievaluado
Supongamos que la variable respuesta tiene una lista de instancias
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 aquiacute hacemos lo que queramos4 )5 )
Loop-for-count funciona como un for primero la variable que haraacute de contador luego el valor de origeny luego el valor final Para controlar el final usamos la funcioacuten que he explicado antes i tomaraacute valoresdesde 1 hasta n asiacute que usando la funcioacuten nth$ obtendremos cada uno de los elementos La variable auxiraacute teniendo cada uno de los valores
3520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz)
Es igual que antes pero con dos bucles
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 (bind aux2 (send aux get-slot_que_queremos))4 (loop-for-count (j 1 (length$ aux2)) do5 (bind aux_final (nth$ j aux2))6 aquiacute ya podemos trabajar con el elemento en concreto7 )8 )
Supongamos que respuesta tiene una lista de instancias con el primer bucle haremos lo mismo que antes ir
iterando por esas instancias Una vez que tenemos cada instancia con aux2 con el segundo bucle iteraremosdentro de sus instancias interiores
Por ejemplo si tenemos varios equipos de fuacutetbol y cada equipo tiene varios jugadores en el primer bucleestamos iterando entre los equipos y en el segundo entre los jugadores de cada equipo en particular
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3159
28 Capiacutetulo 3 CLIPS
3521 Com puc esborrar una instagravencia
Per esborrar una instagravencia (per exemple segons la informacioacute que proporcioni lrsquousuari podem deduir queuna segraverie drsquoinstagravencies eacutes impossible que es facin servir per a la solucioacute) ho podem fer enviant un missatgedelete a la instagravencia eacutes a dir (send ltINSTANCIAgtdelete)
(send inst delete)
Un megravetode que podria ser uacutetil de la cara a la pragravectica podria ser el seguumlent
1 (defrule elimina-instancia2 (declare (salience 10))3 elimina-fact lt- (elimina-inst inst)4 =gt5 (send inst delete)6 (retract elimina-fact)
Imaginem que per exemple que volem eliminar una llista drsquoinstagravencies Per eliminar-les podriacuteem recoacuterrerel llistat marcant les instagravencies que volem esborrar afegint el seguumlent fet
(assert (elimina-instancia inst))
Aixiacute com que elimina-instancia teacute un salience alt esborraria les instagravencies marcades quan tingueacutes ocasioacuteDrsquoaquesta manera ens estalviem el problema de recoacuterrer un llistat drsquoinstagravencies amb un iterador mentre
anem eliminant els elements de la llista cosa que pot donar problemes amb lrsquoiterador
3522 Com imprimir una instagravencia
Per imprimir una classe (uacutetil per exemple per mostrar el resultat final) el millor eacutes definir message-handlersPer exemple imaginem que tenim una classe Plat la qual teacute un slot nom de tipus String Si volgueacutessimimprimir per pantalla un missatge que digueacutes
El nom del plat eacutes ndashltnom del platgtndash
Hauriacuteem de definir un message-handler que simplement imprimiacutes per pantalla el valor de lrsquoslot de laforma
(defmesssage-handler ltCLASSNAMEgt ltMESSAGENAMEgt primary ()ltCODIgt
)
Per el cas de lrsquoexemple
1 (defmessage-handler Plat print primary ()2 (printout t -- selfnom --) )3 )
Per cridar-ho nomeacutes caldragrave enviar-li un missatge a la instagravencia amb el nom del message-handler (enaquest cas print)
(send instancia print)
Un message-handler pot cridar a altres message-handlers amb el que es poden encadenar diverses instagraven-cies Per exemple imaginem que tenim la classe Menuacute la qual teacute un atribut plats que eacutes un llista drsquoinstagravenciesde la classe Plat Dintre del message-handler menuacute podriacuteem iterar a traveacutes de la llista de plats enviant elmissatge print que hem definit anteriorment
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3259
36 Programacioacuten 29
3523 Com es navega entre instagravencies relacionades
Per exemple tinc una instagravencia iA que teacute un slot anomenat slotB que eacutes una instagravencia drsquoun frame B Vullsaber el nom de la instagravencia associada al slotB de iA Ho pots fer aixiacute
(bind B (send iA get-slotB))(bind res (send B get-nom))
Si estagraves dins drsquouna condicioacute ho pots simplificar de la forma seguumlent
(bind res (send iAslotB get-nom)
Els dos punts soacuten equivalents al punt de Java
36 Programacioacuten
361 Com introduir un comentari
Els comentaris a CLIPS va darrere de un com per exemple
Comentari
Tambeacute podem afegir comentaris a les nostres regles deffacts deftemplates etc Generalment van darrereel nom de la estructura per exemple
1 (defrule neteja regla per la qual si la cuina estagrave bruta srsquoafegiragrave una tasca de2 neteja
3 (estat-cuina bruta)4 =gt5 (assert (tasca netejar))6 )
362 Referenciar el valor null a CLIPS
Per referenciar el valor null a clips es fa amb el simbol nil Per exemple si volem saber si una instagravenciainst es null ho podriacuteem fer de la seguumlent manera
(eq inst nil)
363 Formas de recorrer una lista
Para recorrer una lista disponemos de diferentes opciones en este FAQ explicaremos como crear unaestructura tipo ldquoWHILErdquo y tipo ldquoFORrdquo
1 While Esta regla se ejecuta hasta que la expresioacuten a evaluar sea falsa Este tipo de estructura se rigepor seguir la sintaxis while - do y se construiriacutea de la siguiente forma
(while ltexpresioacutengt[do] ltaccioacutengt)
Doacutende dependiendo del valor de ltexpresioacutengt
Valor TRUE Se realizaraacute la accioacuten ltaccioacutengt i se volveraacute a evaluar ltexpresioacutengt
Valor FALSE No se ejecutaraacute la accioacuten ltaccioacutengt
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3359
30 Capiacutetulo 3 CLIPS
2 For Esta regla sirve para ejecutar un bucle N (final - inicio) veces Este tipo de estructura se rige porseguir la sintaxis loop-for-count y se construiriacutea de la siguiente forma
(loop-for-count (ltvargtltiniciogtltfinalgt) [do] ltaccioacutengt)
Doacutende
ltvargt Variable que se usara como iacutendice
ltiniciogt Valor inicial que tendraacute ltvargt
ltfinalgt Ultimo valor que tendraacute la variable ltvargt
ltaccioacutengt Accioacuten que es realizaraacute hasta que ltvargt tenga el valor de ltfingt
364 Formas de elegir una opcioacuten
En este apartado explicaremos como crear una estructura if y una estructura switch
If Este tipo de estructura se rige por seguir la sintaxis if - then - else y se construiriacutea de lasiguiente forma
(if ltexpresioacutengtthen ltaccioacutengt[else ltaccioacuten2gt])
Doacutende dependiendo del valor de ltexpresioacutengt
bull Valor TRUE Se realizaraacute la accioacuten ltaccioacutengtbull Valor FALSE Se realizaraacute la accioacuten ltaccioacuten2gt (en caso de haber)
Switch Este tipo de estructura se rige por seguir la sintaxis switch - opciones y se construiriacutea dela siguiente forma
(switch ltexpresioacuten-testgt(case OPCION1 then ACCION1)(case OPCION2 then ACCION2)
([default] ACCION-DEFAULT)
)
Doacutende dependiendo del valor de ltexpresioacuten-casegt se ejecutaraacute una ltaccioacutengt en particular Si nin-guna ltopcioacutengt es correcta se ejecutara la ltaccioacuten-defaultgt
365 Funciones con la clase String
Habitualmente trabajaremos con Strings o cadena de Strings CLIPS proporciona una serie de herramien-tas para trabajar con esta clase
1 Convertir string a MAYUacuteSCULAS A veces es conveniente tener todos los caracteres en mayuacutesculaspara no tener problemas de comparaciones o simplemente por convenio Para ello CLIPS dispone dela funcioacuten upcase la cual convierte a mayuacutesculas un siacutembolo o string
(upcase ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplos
(upcase Ccedillips es divertido) rarr CcedilLIPS ES DIVERTIDO
(upcase Clips_es_divertido) rarr CLIPS_ES_DIVERTIDO
2 Convertir string a MINUacuteSCULAS la funcioacuten es downcase
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3459
36 Programacioacuten 31
3 Concatenacioacuten de strings Tambieacuten es de gran utilidad poder juntar dos o maacutes paraacutemetros en un solostring Todo paraacutemetro a juntar deben ser de uno de los siguientes tipos symbol String integer floato instance-name
(str-cat parametro1 parametro2 parametroN )
Ejemplo
(str-cat IA nota 10) rarr IAnota10
4 Comparacioacuten de strings Funcioacuten que nos indica si dos strings son iguales
(str-compareltexpresioacuten-simboacutelica-o-de-cadenagtltexpresioacuten-simboacutelica-o-de-cadenagt
)
Esta funcioacuten devuelve
0 Si ambos strings son iguales1 Si el primer string es mayor que el segundo string-1 Si el primer string es menor que el segundo string
5 Longitud de un string Muchas veces es de gran utilidad saber que tamantildeo tiene un string
(str-length ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplo
(str-length Inteligencia Artificial) rarr 23
366 iquestCoacutemo obtener el contenido de una variable en un string
Para conseguir un string a partir de un integer float symbol instance-name debes utilizar el comandostr-cat Si a la funcioacuten le pasamos como paraacutemetros varios elementos los transformaraacute a string y losconcatenaraacute La sintaxis de esta funcioacuten es la siguiente (str-cat elementos) Esta funcioacuten la usaremossobre todo cuando queramos realizar comparaciones entre el contenido de una variable y un string ya quepreviamente necesitaremos usar la funcioacuten str-cat para pasar el contenido de la variable a string y realizarde este modo la comparacioacuten de forma correcta
367 iquestComo se crea una lista
Con create$ Todos los operadores sobre listas llevan el siacutembolo $ al final Igual que con las variables sedebe usar bind siempre que se desee modificar una lista
(bind lista (create$ a b c))
368 iquestComo borro un elemento de una lista
Con delete$Usa la siguiente sintaxis(delete$ ltlistagt ltindice-iniciogt ltindice-finalgt)Se borraraacuten todos los elementos del rango entre las posiciones inicio y final ambas incluidas Tambieacuten exis-
tedelete-member$ (delete-member$ ltlistagt ltelementogt) Borraraacute todas las apariciones del elemento enla lista
(delete$ (create$ a b c d e f) 3 5) minusrarr (a b f)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1359
10 Capiacutetulo 3 CLIPS
(siacutembolo valor1 valor2 valorN)
322 iquestQueacute es un hecho ordenado (order Facts)
Un hecho ordenado tienen formato libre por lo tanto no existe restriccioacuten alguna en el orden de los campos
Los campos de un hecho ordenado pueden ser de cualquier tipo primitivo de datos excepto el primero quedebe ser un siacutembolo Como ejemplo tenemos
1 (hermanos Antonio Javier Carlos)2 (padre Pedro David)
323 iquestQueacute es un hecho no ordenado (deftemplates facts)
A traveacutes de los hechos no ordenados podemos abstraernos de la estructura de un hecho asignado unnombre a cada campo (slots)
1 (deftemplate nombre-template comentario2 (slot nombre-slot (tipo-del-slot))3 (multislot nombre-slot (tipo-del-slot))4 )
Por ejemplo
1 (deftemplate avioacuten2 (slot nombre_avion (type STRING))3 (slot compania (type STRING))
4 (slot numero_plazas (type INTEGER) (default 100))
324 iquestPuedo tener un vector como slot
Si debe declararse como multislot
325 iquestPuedo asignar propiedades a los slots
Siacute las maacutes importantes son
Type El tipo de dato primitivo que contiene (en mayuacutesculas)
Allowed-X Permite especificar un conjunto de valores permitidos Siendo X un tipo de datos primitivo(en minuacutesculas y plural) rarr si el slot toma un valor del tipo X debe pertenecer a los valores permi-tidos X puede ser values especificando entonces todos los valores posibles que puede tomar el slotindependientemente del tipo de dato
Range Especifica un rango para slots numeacutericos
Cardinality Nuacutemeros miacutenimo y maacuteximo de elementos que puede tener un multislot
Default Valor por defecto Si ponemos NONE como valor por defecto significaraacute que no se podraacute crear la
instancia a no ser que se especifique el valor de ese slot
1 (deftemplate estudiante2 (slot edad (type INTEGER) (range 0 99))
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1459
32 Los hechos 11
3 (multislot asignaturas (type STRING) (cardinality 1 5))4 (slot num-carreres (default 1))5 (multislot notas (allowed-strings MH NP))6 )
326 iquestQueacute debo utilizar hechos ordenados o no ordenados
Como se puede intuir si tenemos un conjunto de hechos los cuales conceptualmente pertenecen al mismoaacutembito seraacute una solucioacuten maacutes elegante agruparlos a traveacutes de un deftemplate En caso que tengamos quealguacuten hecho aislado seraacute mas sencillo declararlo como un hecho ordenado
327 Fets o Objectes
Veient la definicioacute de deftemplate podem confondrersquons a lrsquohora de decidir si fer servir fets o fer servirobjectes
Deixant de banda altres diferegravencies ja comentades (les classes suporten jerarquia de classes heregravenciaetc) els objectes es fan servir per representar el coneixement (mitjanccedilant un conjunt drsquoinstagravencies)
Aixiacute que generalment farem servir classes i objectes per representar coneixement mentre que farem servirels fets per portar control sobre lrsquoexecucioacute del problema
Per exemple podriacuteem definir un deftemplate per emmagatzemar un resultat o per poder controlar lrsquoestatde lrsquoexecucioacute
A la pragravectica de Mikeo (penjada a la web de lrsquoassignatura) teniacuteem un deftemplate habitacion-actual
1 (deftemplate habitacion-actual2 (slot habitacion)3 (slot area-restante)4
(slot presupuesto-restante)5 (slot precio-total)6 (slot prioridad-actual)7 )
Amb el qual controlagravevem la construccioacute drsquouna habitacioacute Assignagravevem una instagravencia de la classe habita-cioacute al slot habitacion de habitacion-actual i mitjanccedilant una segraverie de regles que feien unificacioacute ambhabitacion-actual actuagravevem sobre lrsquohabitacioacute drsquouna manera o drsquoun altre
328 Creacioacuten de hechos (assertdeffacts)
Si queremos crear un solo hecho utilizaremos el comando assert Por ejemplo (assert (casa roja))Si por el contrario queremos crear una estructura ordenada de hechos utilizaremos deffacts
(deffacts mishechos (casa roja) (pelota azul))
329 Modificar un fet
Per modificar un fet (per exemple molt uacutetil si estem treballant amb deftemplates) ho podem fer mitjanccedilant(modify ltINSTANCIAgtltFETSgt)
Per exemple si tingueacutessim el deftemplate persona
1 (deftemplate persona2 (slot nom)3 (slot edad)4 (slot dni)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1559
12 Capiacutetulo 3 CLIPS
I hagueacutessim afegit el fet
(assert (persona (nom Pepe)(edad 25)(dni 46974431)))
I el fet
(assert (aniversari 46974431))
Podriacuteem tenir la seguumlent regla
1 (defrule aniv2 aniversari lt- (aniversari dni)3 persona lt- (persona (edat edat)(dni dni))4 =gt5 (retract aniversari)6 (modify persona (edat (+ 1 edat)))7 )
La qual srsquoactivaragrave si hi ha un fet aniversari drsquouna persona Fent servir el dni indicat al fet aniversaribusquem el fet persona que teacute el mateix dni Deixem el valor edat a la variable edat per poder treballaramb ella meacutes endavant
Hem agafat tambeacute la direccioacute del fet aniversari per tal de poder esborrar-lo de la base de fets Aixograve srsquohafet per dues raons
Primer per mantenir meacutes neta la base de fets Segon i meacutes important Com que hem canviat el fet laregla tornaragrave a fer unificacioacute amb el fet (perquegrave ara eacutes diferent) amb la regla aniversari amb el que entrariadintre drsquoun bucle sense fi on srsquoaniria incrementant lrsquoedat de la persona
Un cop hem esborrat el fet aniversari incrementem en 1 el valor del slot edat de la persona fent servirla variable edat que hem declarat a la part esquerre de la regla
El comportament de modify es fer un retract del fet a la base de fets i despreacutes fer un assert amb els nous
valors Si volem canviar mes drsquoun slot del fet es convenient canviar-los tots a la vegada La raoacute es que cadavegada que fem un modify lrsquoapuntador al fet es modifica i lrsquoapuntador que tenim a la variable que hem fetservir ja no es vagravelid
Si no temim mes remei que fer la modificacioacute del fet pas a pas srsquoha de saber que la crida a modify retornalrsquoapuntador al nou fet Si el guardem a altra variable (o a la mateixa) podrem continuar modificant el fetamb la nova referegravencia
3210 Com elimino un fet de la base de fets
Per eliminar un fet de la base de fets ho podem fer amb la paraula clau (retract ltFETgt) on ltFETgt eacutes
un punter al fetPer obtenir aquest fet ho podem fer fent servir ltVARgtlt- ltFETgt a la part esquerre de la reglaPer exemple
1 (defrule accionsvent2 vent lt- (vent tipus)3 =gt4 (switch tipus5 (case poc then (assert (accio persiana0)))6 (case normal then (assert (accio persiana50)))7 (case molt then (assert (accio persiana100)))8 )9 (retract vent)
10 )
Afegiragrave fets per realitzar les accions pertinents i esborraragrave el fet de la base de fets
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1659
33 Variables 13
33 Variables
331 Variables a CLIPS
No cal declarar una variable (ni el seu tipus) nomeacutes cal afegir un interrogant al comenccedilament drsquoun simbol
per indicar que eacutes una variableCLIPS srsquoencarrega del control de tipus depenent del que assignem a la variablePer exemple testvar correspondria a la variable testvar Si per exemple assigneacutessim lrsquoenter 3 a
testvar CLIPS tractaria la variable com una variable entera
332 Com assignar un valor a una variable
Per assignar un valor a una variable es fa servir el megravetode (bind) amb la forma
(bind ltVARIABLEgtltVALORgt)
On ltVALORgt pot ser un valor o un megravetode que retorni un valor Per exemple si volem assignar un 4 a lavariable var
(bind var 4)
O per exemple podriacuteem assignar a la variable var la suma de 2 meacutes 2
(bind var (+ 2 2))
333 iquestCoacutemo declarar variables globales
Para crear una variable global hay que meterla dentro de la construccioacuten defglobal La declaracioacuten de la
variable seguiraacute el modelo nombreVariable = expresioacutenPor ejemplo
(defglobal presupuesto = 0)
Pueden aparecer en la parte izquierda de las reglas si no son utilizadas para asignar un valor y su cambiono activa reglas pero no pueden ser paraacutemetros de funciones ni meacutetodos
334 iquestCoacutemo trabajar con variables sumando restando por ejemplo contadores
La mejor forma es con variables globales se definen asiacute (defglobal x = 0) puede ser el valor quequeramos tanto nuacutemero string Y si queremos sumarle 10 por ejemplo
(bind x (+ x 10))
Las variables locales como por ejemplo x soacutelo tienen valor mientras dura su ejecucioacuten y eso suele ser enesa misma liacutenea o en un bucle Si le damos valor a x y luego preguntamos por ella nos diraacute que no existe
335 Quina diferegravencia hi ha entre les variables del tipus nom_variable i les del tipus $nom_variable
Les primeres contenen un sol valor i les segones en poder contenir meacutes drsquoun (o cap)
336 Quegrave significa lrsquointerrogant () quan va sol
Eacutes una variable anogravenima Pots utilitzar sense posar-hi cap nom si no trsquointeressa el valor en concret Perexemple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1759
14 Capiacutetulo 3 CLIPS
(Primer filtre_preu )
Aquesta condicioacute significa ldquosi el fet (Primer filtre_preu) teacute algun valorrdquo O sigui que si tingueacutessimel fet (Primer filtre_preu ok) es compliria la condicioacute (i si en comptes de ldquookrdquo fos ldquopatatardquo tambeacute escompliria) En canvi si el fet fos uacutenicament (Primer filtre_preu) no es compliria la condicioacute
337 Quegrave significa el dogravelar ($) quan va sol
Eacutes com lrsquointerrogant perograve admet meacutes drsquoun valor Per exemple
(Primer filtre_preu $ ok)
donaragrave cert pels fets de lrsquoestil (Primer filtre_preu patata ok) (Primer filtre_preu hola ok)(Primer filtre_preu patata hola ok) (Primer filtre_preu ok) Eacutes a dir no importa els valors quehi hagi entre filtre_preu i ok si al final hi ha un ok
338 iquestComo puedo ver los hechos presentes en un momento determinado
Abriendo la Facts Window en Window de la barra de menuacute
34 Las reglas
341 iquestCoacutemo construir una regla
Para construir una regla utilizaremos la construccioacuten defrule
Sintaxis
(defrule ltnombre-reglagt [ltcomentariogt][ltdeclaracioacutengt]ltelemento-condicioacutengt Parte izquierda (LHS)
=gtltaccioacutengt) Parte dcha (RHS) de la regla
Una regla consta de un conjunto de condiciones (antecedente) tambieacuten denominados elementos condicio-nales (EC) o parte izquierda (LHS) y de un conjunto de acciones (consecuente) tambieacuten denominado partederecha de la regla (RHS) La regla se activaraacute siempre que se satisfagan todos los EC mediante hechos oinstancias que los cumplan
Si se introduce en la base de reglas una nueva regla con el mismo nombre que el de una existente la nuevaregla reemplazaraacute a la antigua
Si una regla no tiene parte izquierda es decir no tiene elementos condicionales entonces el hecho(initial-fact) actuaraacute como el elemento condicional para ese tipo de reglas y la regla se activaraacute cadavez que se ejecute un comando reset
342 iquestCoacutemo gestionar la parte izquierda (LHS) de una regla
Declarar hechosSi no se especifica ninguna condicioacuten la regla se activaraacute siempre Una condicioacuten puede ser un simple hecho
(Ej vegetariano) o un hecho ordenado con unos valores concretos (Ej (persona (nombre Juan))) Si loque queremos es obtener el valor de un hecho insertaremos una variable en su lugar (Ej (persona (nombre
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1859
34 Las reglas 15
n)) ) Entonces entraraacute en la regla para cada valor posible que pueda asignar a la variable n a partir delos hechos
Si queremos indicar cualquier valor utilizaremos el siacutembolo y para cualquier lista el siacutembolo $ (Ej(evento ) (estilo $) ) Tambieacuten existe la opcioacuten de guardar en una variable una referencia al objetoEllo se consigue poniendo var lt- a su izquierda (Ej p lt- (persona (nombre Juan))) Se puede usarpor ejemplo para pasaacuterselo de paraacutemetro a una funcioacuten llamada en la RHS
Establecer condiciones
Ademaacutes podemos especificar restricciones adicionales sobre los valores que puede tomar un campo de unhecho Existen tres tipos principales de restricciones Conectadas (por orden de precedencia o prioridad)
not (~) Evita que cierto campo cumpla determinada restriccioacuten
and (amp) Combina dos restricciones conjuntivamente
or (|) Combina dos restricciones disjuntivamente
De predicado () Obliga a que cierto campo cumpla determinada condicioacuten (especificada por el predicado)
Por valor devuelto por una funcioacuten = Permite llamar a una funcioacuten y utilizar el valor devuelto pararestringir el valor que pueda tomar un campo de un hecho
Se puede comprobar si se cumple una determinada condicioacuten mediante el constructor test Dentro detest se pueden hacer llamadas a cualquier funcioacuten o predicado ya sea primitiva de CLIPS o definidapor nosotros
Combinar elementos
Los diferentes elementos de la parte izquierda van impliacutecitamente unidos mediante una AND que indicaconjuncioacuten No obstante podemos hacerlo expliacutecitamente mediante (and (cond1) (cond2)) aunque suelen
utilizarse para anidar ANDs dentro de ORsOR Sirve para hacer una disyuncioacuten (or (cond1) (cond2)) Es equivalente a escribir varias reglas en lasque cada una de ellas tenga uno de los componentes del OR en su parte izquierda y la misma parte derecha
NOT Sirve para detectar si no existe un determinado hecho (Ej (not (estilo sibarita)))exists Cuando a un conjunto de elementos se le antecede exists se comprueba que hay al menos un
hecho en la base de hechos que cumpla la condicioacuten (Ej (exists(bebida precio (ltprecio 5))) )forall Permite comprobar si todos los hechos que satisfacen un determinado patroacuten cumplen una serie
de condiciones (Ej (forall(plato (estilo moderno)))
343 iquestCoacutemo obtener la direccioacuten de hechos o instancias situados en LHS
En algunas ocasiones vamos a necesitar realizar alguacuten tipo de accioacuten en la parte derecha de las reglassobre hechos o instancias que cumplan unas determinadas condiciones Pero para ello necesitaremos primerotener acceso a estos elementos para despueacutes poder operar sobre ellos Esto lo conseguiremos guardando ladireccioacuten del elemento en una variable hacieacutendolo del siguiente modo
variable_direccion lt- (elemento)
Pongamos un ejemplo para ver realmente el funcionamiento y uso de esta posibilidad que CLIPS nosofrece
1 (defrule imprime-area2 instancia lt- (object (is-a Rectangulo))3 =gt4 (printout t Area del rectangulo (instance-name instancia)5 (send instancia calcula-area) crlf)6 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1959
16 Capiacutetulo 3 CLIPS
Cuando se ejecuta esta regla se imprimiraacuten las aacutereas de todas las instancias de la clase Rectangulo Enla parte izquierda de la regla lo que hacemos es guardar en la variable instancia la direccioacuten de la instanciade Rectangulo que estamos tratando en ese momento La regla se ejecutaraacute para todas las instanciasalmacenadas en la memoria de trabajo que cumplan la condicioacuten (is-a Rectangulo) es decir para todaslas instancias de la clase Rectangulo En la parte derecha de la regla donde se ejecutan las acciones podemosver que se imprimiraacute para cada instancia lo siguiente Area del rectangulo [nombre_instancia] aacuterea
del rectaacutengulo La funcioacuten instance-name nos devuelve el nombre de la instancia que le pasamos porparaacutemetro Ademaacutes hemos llamado al gestor de mensajes calcula-area para que nos devuelva el area delrectaacutengulo
344 iquestCoacutemo hacer sentencias or en la izquierda de las reglas
Con (or ) Si por ejemplo tenemos dos hechos (a) y (b) y queremos ejecutar la derecha de la reglacuando se cumpla uno de los dos tendremos que hacer (or (a) (b)) Atencioacuten porque la parte derecha seejecutaraacute tantas veces como veces se cumpla cada uno de los hechos si para nosotros existe tanto (a) como(b) la parte derecha se ejecutaraacute dos veces Para que soacutelo se usa una vez podemos hacer combinaciones de
or y and (funciona igual) o usar un patroacuten por ejemplo (persona Juan|Pedro) soacutelo se ejecutariacutea una vez
345 Com afegir una condicioacute a la part esquerre drsquouna regla
A vegades eacutes necessari que una regla srsquoinstanciiuml si es produeix una condicioacute especial (i no un fet) Per feraixoacute farem servir la comanda (test ltCONDICIOgt)
Per exemple imaginem que la nostre base de fets compte amb un fet (preu valor) amb un preudeterminat Imaginem que volem una regla que srsquoinstanciiuml quan aquest valor eacutes meacutes gran que 30
Per fer-ho fent servir tot el que hem explicat
1 (defrule preucar2 (preu preu)3 (test (gt preu 30))4 =gt5 (printout t El preu es mes gran que 30)6 )
Eacutes a dir si el preu eacutes meacutes gran que 30 srsquoimprimiragrave un missatge per pantallaAquestes condicions poden contenir ANDs i ORs de varies condicionsPer exemple
1 (defrule preulimit2 (preu preu)3 factminim lt- (preuminim minim)4 factmax lt- (preumaxim maxim)5 (test (and (gt preu minim) (lt preu maxim) ))6 =gt7 (retract factminim)8 (retract factmax)9 (printout t El preu estagrave dintre del rang)
On comprovarem si el preu estagrave dintre drsquoun rang determinat i en aquest cas esborra els fets que contenen
el magravexim preu i el miacutenim preu i mostra un missatge per pantalla
346 Puede una misma regla ejecutarse maacutes de una vez
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2059
34 Las reglas 17
Es muy importante entender que cada regla se ejecutaraacute una vez por cada combinacioacuten de valores en suLHS
1 (defrule regla2 (color col)3 (peso pes)4 =gt5
Si tengo tres colores y dos pesos asertados la regla se ejecutaraacute 6 veces una con cada combinacioacuten decolor y peso
347 Com puc definir lrsquoordre de les regles
La idea drsquoun sistema basant en regles eacutes no definir un ordre lineal drsquoaquestes (costa deixar de pensar de
forma iterativa)En el cas de necessitar que una regla srsquoexecuti despreacutes drsquouna altre pots fer servir Fets la regla anteriorcrea un fet que la segona regla tindragrave a la part esquerra
1 (defrule pregunta12 =gt3 (assert (pregunta1Feta))4 5 )6
7 (defrule pregunta2
8 (pregunta1Feta)9 =gt
10 11 )
I finalment pots usar la propietat salience Aquesta propietat indica la prioritat drsquoexecucioacute de les regles( les regles amb salience majors srsquoexecutaran abans ) Pot prendre valors positius i negatius entre -10000 y+10000 Per defecte les regles tenen salience 0
1 (defrule pregunta12 (declare (salience 2))3 =gt4 5 )6
7 (defrule pregunta28 (declare (salience 1))9 =gt
10 11 )
El valor indicado en la propiedad salience puede ser el nuacutemero directamente o una expresioacuten por ejemplovariable10 podemos usar variable para elegir que regla se ejecutaraacute
Las prioridades deben ser usadas solo para determinar el orden en el que se disparan algunas reglas sobreotras no para fijar el flujo de control ya que la principal ventaja de un sistema basado en reglas es larepresentacioacuten declarativa del conocimiento y de esta forma abusando de las prioridades conduce a unsistema procedimental
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2159
18 Capiacutetulo 3 CLIPS
348 Com forccedilar que una regla sigui la primera
Per que aquesta regla sigui la primera ha de tenir el salience meacutes gran de totes
1 (defrule presentacio2 (declare (salience 20))3 =gt4 (printout t ------ Benvingut ----- crlf)5 )
349 Vull guardar certs valors que es fan servir durant lrsquoexecucioacute de diferents regles Com hopuc fer
Tens principalment dues alternatives Si el valor eacutes un tipus bagravesic pots fer servir una variable global ambla sintaxi seguumlent
(defglobal nom_variable = valor)
Aquesta sentegravencia no va a dins de cap funcioacute ni regla es posa sola a la part que creguis convenient delcodi Vegem un exemple
(defglobal preu_minim_primer = 1000)
Per fer-la servir es fa exactament de la mateixa manera que amb una variable normal perograve has de posarels dos asteriscs Per exemple
(bind preu_minim_primer curr-preu)
Per altra banda si el valor o valors que vols guardar han de ser instagravencies una bona estrategravegia pot serutilitzar un deftemplate Eacutes uacutetil sobretot per anar guardant solucions temporals o llistes drsquoelements quepoden formar part de la solucioacute
Per utilitzar-ho has de seguir els passos seguumlents
1 Definir el deftemplate
(deftemplate nom_del_deftemplate(multislot nom_multislot)
(slot nom_slot)
)
Amb un exemple es veuragrave meacutes clar
(deftemplate llista-plats(multislot primers)(multislot segons)(multislot postres)
)
2 Inicialitzar el deftemplate
(defrule[condicions vagraveries] La condicioacute base eacutes que llista-plats no srsquoha inicialitzat encara
(not (llista-plats))=gt
llista conteacute els valors de llista-plats (que de moment estan buits)(bind llista (assert (llista-plats)))
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2259
35 Las clasesinstancias 19
3 Assignar-li valors
(bind segons_plats (find-all-instances ((plat Plat)) TRUE)(modify llista (segons segons_plats))
4 Recuperar els valors
(defrule[condicions vagraveries]llista lt- (llista-plats (segons $segons_plats))
=gt
Ara la variable $segons_plats conteacute tots els elements de segons
35 Las clasesinstancias
351 Tengo que representar la jerarquiacutea de un frame iquestEs preferible antildeadir las subclases a laontologiacutea o bien diferenciarlas mediante un slot en la superclase
Las dos formas son vaacutelidas pero es recomendable representarlas en clases separadas cuando se vayan abuscar instancias de ese tipo ya que asiacute no tendremos que hacer un recorrido por todas las de la superclaseNo obstante si soacutelo se trata de una caracteriacutestica puntual del frame y no vamos a hacer buacutesquedas de unaexclusiva subclase entonces seraacute maacutes eficiente antildeadir un slot debido a su mejor accesibilidad
352 iquestQueacute es un objeto
Podriacuteamos decir que un objeto es un hecho no ordenado con herencia
353 iquestPorqueacute usar objetos en contexto de la praacutectica de CLIPS de IA
Como bien sabemos una parte de la praacutectica de SBCrsquos consisten en crear la ontologiacutea Esta ontologiacutease exporta para poder interactuar con CLIPS en formato pins y pont El archivo pont contendraacute ladeclaracioacuten de todas las clases creadas previamente por Protege (defclass ) El archivo pins contendraacute
todas las instancias de las clases declaradas en el archivo pont Como puede intuir el lector se necesitaraacuteinteractuar con los objetos previamente creados por Protegravegegrave
354 Como se definen las clases
Para definir las clases usaremos el constructor defclass
(defclass ltnombregt [ltcomentariogt](is-a ltnombre-de-superclasegt)[(role concrete | abstract)]
[(pattern-match reactive | non-reactive)]ltslotgt definicioacuten de los atributos de la clase
ltdocumentacioacuten-handlergt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2359
20 Capiacutetulo 3 CLIPS
En caso de desear que la nueva clase herede las propiedades de otra ya existente el nombre de esta deberaacuteespecificarse despues de is-a El rol determinaraacute si la clase es concreta (se puede instanciar) o abstracta(destinada a ser superclase) El pattern-match debe declararse como reactivo si se desea que las instanciasde la clase puedan unificar con los elementos objeto de las reglas (siacutembolo lt-) Los slots correspondena los atributos de la clase y los handlers a las funciones de eacutesta Los handlers se pueden declarar en ladeclaracioacuten de la propia clase pero se deben definir externamente Dado que no aporta ninguna ventaja
declararlos es recomendable definirlos directamente Noacutetese que todo aquello que estaacute entre corchetes ([])constituye informacioacuten adicional que no es obligatorio especificar
1 (defclass Persona2 (is-a Ser_Vivo)3 (role concrete)4 (single-slot edad5 (type INTEGER)6 (range 1 99)7 (cardinality 0 1)8 (create-accessor read-write)9 )
10 (multislot amigos11 (type INSTANCE)12 (allowed-classes Persona)13 )14 )
El comportamiento y declaracioacuten de los slots es ideacutentico al de los slots de los hechos ordenados Losatributos de tipo INSTANCE (referencian otras instancias) estan en formato INSTANCE-NAME
355 Com consulto una instagravencia a partir drsquouna regla
Podem fer servir la part esquerre drsquouna regla per trobar instagravencies Lrsquouacutes eacutes molt semblant a trobar elpunter a un fet fent servir
(object [(is-a ltNOM_CLASSEgt)|(name ltNOM_INSTANCIA)|(ltNOM-SLOTgt ltVALORVARIABLE))])
Per exemple si volem que una regla srsquoinstanciiuml si tenim instanciat un plat de la classe Plat podriem ferservir
1 (defrule tenimplat2 plat lt- (object (is-a Plat))3 =gt4 (print t (send plat get-nom) crlf)
La regla imprimiragrave el nom del plat que trobi Eacutes important notar que srsquoactivaragrave per cada instagravencia de platque tinguem a la base de coneixement
Podem consultar els valors de la instancia fent servir condicions a la part esquerre de la regla Per exemplesi nomeacutes volgueacutessim els plats amb un preu meacutes gran que 30
1 (defrule platCar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Srsquoactivaragrave per tots els plats amb un preu major a 30
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2459
35 Las clasesinstancias 21
Srsquoha drsquoanar amb cura per aquest tipus de regla ja que si la base de coneixement eacutes molt amplia pot acabarderivant amb problemes de memograveria
Per exemple si en comptes de preguntar per una instagravencia de Plat pregunteacutessim per dues instancies dePlat
1 (defrule platsCars2 plat1 lt- (object (is-a Plat) (Preu p1))3 plat2 lt- (object (is-a Plat) (Preu p2))4 (test (gt p1 30))5 (test (gt p2 30))6 =gt7 (print t (send plat1 get-nom) i (send plat1 get-nom) soacuten cars8 crlf)9 )
Faria unificacioacute amb totes les combinacions possibles (amb repeticions) de dos plats de tota la base deconeixement Aixograve es podria anar ampliant fins fer-se intractable
Si tenim drsquoalguna manera el nom de la instancia podem fer
1 (defrule platPicant2 (cuina (plat p))3 (object (name p) (picant pi))4 =gt5 (print t picant pi crlf)6 )
Aixoacute es pot servir per crear condicions que facin servir noms drsquoinstancies que tenim almacenats a slotsdrsquoaltres instancies per exemple
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send v get-Preu) crlf)6 )
Aquesta regla imprimiria el preu del vi asociat al plat si es negre
356 Tengo problemas en condiciones de reglas con slots de instancias obtenidos con send
A veces dan problemas las reglas en las que las condiciones sobre los valores de los slots de una instanciase escriben usando mensajes get sobre los atributos de una instancia en lugar de utilizar patrones paraobtenerlos por ejemplo la regla
1 (defrule platcar2 plat lt- (object (is-a Plat) )3 (test (gt (send plat get-Preu) 30))4 =gt5 (print t (send plat get-nom) es car6 crlf)7 )
No funciona correctamente en CLIPS pero la regla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2559
22 Capiacutetulo 3 CLIPS
1 (defrule platcar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Siacute lo haceEn el caso de que el valor del slot sea booleano se puede escribir la regla como
1 (defrule platpicant2 plat lt- (object (is-a Plat) (Picant TRUE))3 =gt4 (print t (send plat get-nom) es picant crlf)
En el caso de que el slot sea a su vez una instancia se puede utilizar para obtener los valores de estainstancia en la condicion como se explica en la pregunta anterior
357 Tengo problemas con instancias obtenidas del slot de otra instancia en el patroacuten de unaregla
Este problema aparece cuando el patron de una regla instancia una variable a un nombre de instancia yesta no esta definida en el modulo de la regla por ejemplo si la regla siguiente pertenece a un modulo queno es el de la instancia
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4
=gt5 (print t preu (send v get-Preu) crlf)6 )
La regla se quejaraacute de que la instancia no existe al enviarle el send ya que solo se busca la instancia dentrodel moacutedulo de la regla y no en los importados Para arreglar esto se puede usar la funcioacuten (instance-address[ltMODULOgt|] ltINSTANCIAgt) que busca la direccion de la instancia en un modulo concreto o en todos losmoacutedulos que se importan () Deberiacuteamos entonces escribir la regla
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send (instance-address v) get-Preu) crlf)6 )
358 iquestCoacutemo realizar una buacutesqueda de instancias que cumplan unas restricciones
CLIPS nos ofrece varias funciones de buacutesqueda de instancias que cumplan unas determinadas restriccionesque a nosotros nos interese
La funcioacuten find-instance Esta funcioacuten devuelve la primera instancia que cumple todas las restric-ciones indicadas
La funcioacuten find-all-instances Esta funcioacuten devuelve todas las instancias que cumplen las restric-ciones indicadas
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2659
35 Las clasesinstancias 23
La sintaxis de ambas funciones es igual exceptuando el nombre de la funcioacuten(find-all-instances (clase_instancias) (restricciones))A continuacioacuten se muestran varios ejemplos
(bind rectangulos (find-all-instances ((inst Rectangulo)) (gtinstaltura 10))) Des-pueacutes de ejecutar esta funcioacuten en la variable rectangulos habraacute una lista con todas las instancias de la
clase Rectangulo cuya altura sea superior a 10(bind rectangulos (find-all-instances ((inst Rectangulo)) (and (gtinstaltura 10) (=instanchura 7)))) Este trozo de coacutedigo hace que en la variable rectangulos se guarde una listade las instancias de la clase Rectangulo que tienen una altura superior a 10 y una anchura igual a 7
Estas funciones que CLIPS nos ofrece tienen otra funcionalidad y es que podemos realizar buacutesquedas deconjuntos de instancias
(bind rectangulos (find-all-instances ((a Rectangulo) (b Rectangulo)) (= aalturabaltura))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas de instancias de laclase Rectangulo que tienen la misma altura
Por uacuteltimo es necesario comentar que se pueden realizar buacutesquedas de conjuntos de instancias que seande distintas clases
(bind figuras (find-all-instances ((rect Rectangulo) (circ Circulo)) (= rectalturacircradio))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas ltrectangulocirculogtque cumplan que la altura del rectaacutengulo sea igual al radio del ciacuterculo
Existen maacutes comandos para obtener instancias pero son menos utilizadas a nivel baacutesico como pueden serany-instancep do-for-instance do-for-all-instances y delayed-do-for-all-instances
359 iquestCoacutemo se interactuacutea con objetos
La interaccioacuten con objetos se efectuacutea mediante lo que se denomina mensaje
(defmessage-handlerltnombre-clasegtltnombre-mensajegt[lttipo-handlergt] [ltcomentariogt]ltparaacutemetrogt [ltparaacutemetro-comodiacutengt])ltaccioacutengt
)
Un gestor de mensajes consta de 7 partes
1 Nombre de clase a la que el gestor estaraacute asociado
2 Nombre del mensaje
3 Tipo de gestor (Nosotros habitualmente usaremos primary que viene por defecto)
4 Comentario (opcional)
5 Lista de paraacutemetros6 Paraacutemetro comodiacuten (para gestionar muacuteltiples paraacutemetros)
7 Secuencia de acciones o expresiones que seraacuten ejecutadas por el gestor
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2759
24 Capiacutetulo 3 CLIPS
Enfocado a la praacutectica de CLIPS la maacutes comuacuten es que queramos interactuar con objetos para
1 Imprimir los objetos Un ejemplo
1 (defmessage-handler avion imprimir-beneficio ()
2 Para implementar funciones calculadas asociadas al objeto Un ejemplo
1 (defmessage-handler avion calcular-beneficio ()2 ( selfplazas-ocupadas selfprecio-billete))3 )
Como se puede observar el paraacutemetro impliacutecito self contiene la instancia activa para este mensaje
3510 iquestComo se interactuacutea con las instancias de los objetos
Podremos interactuar entre las instancias de los objetos mediante la funcioacuten send
(send ltexpresioacuten-de-objetogtltnombre-de-mensajegtltexpresioacutengt)Donde se toman como argumentos el objeto destino del mensaje el mensaje mismo y otros paraacutemetros
que debieran ser pasados a los gestoresParticularmente en el aacutembito de la praacutectica usualmente necesitaremos utilizar el envioacute de mensajes de
tipo get put and delete Estos mensajes tiene la siguiente sintaxis
get-ltnombre-atributogt
put-ltnombre-atributogt
delete
Aquiacute tenemos un ejemplo de como utilizarlo recordando que ponemos entre corchetes la instancia la cualse enviacutea el mensaje
(defclass avion (is-a USER)(role concrete)(slot precio-billete (create-accessor read) (default 34))(slot plazas-ocupadas (create-accessor write) (default 0)))
Clase creada
gt(make-instance a of avion) Creacioacuten de una instancia de avion[a]
gt(send [a] get-precio-billete) Obtencioacuten de un slot34 Resultado obtenidogt(send [a] put-plazas-ocupadas 100) Modificacioacuten de un slotgt(send [a] delete) Eliminacioacuten de la instanciaTrue
3511 Uso de make-instance
Cuando queremos crear una instancia de una clase para ir rellenandola con los resultados o datos quevayamos obteniendo se haria lo siguiente
(bind variable_instancia (make-instance nombre_instancia of nombre_clase))
Una vez creada podemos jugar con dicha instancia en las diferentes reglas siempre que la llamemos enlos activadores
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2859
35 Las clasesinstancias 25
(defrule reglavar_instancia lt- (object (is-a nombre_clase))=gt
)
De esta manera dentro de la regla podemos hacer acciones con la instancia por ejemplo(send var_instancia put-articulo articulo_ejemplo)
3512 Como generar automaacuteticamente nombres de instancia
En ocasiones queremos crear instancias en reglas y queremos que su nombre sea distinto del de otrasque ya tenemos Para ello podemos utilizar las funciones gensym y gensym La primera genera un siacutembolodel estilo genN donde N es un nuacutemero La segunda hace lo mismo pero aseguraacutendose de que ese siacutembolono exista ya Se puede reiniciar el contador que usan estas dos funciones con el operador (setgen ltnumgt)donde ltnumgt es el nuacutemero por el que queremos que empiecen ahora los siacutembolos
Para usar esto para generar el nombre de una instancia podemos hacer
(make-instance (gensym) of ltclasegt)
Cada vez que se ejecute se generaraacute un nombre de instancia nuevoSi creamos instancias de diferentes clases y queremos que las instancias tengan nombres que podamos
identificar podemos concatenar siacutembolos a los siacutembolos generados por gensym por ejemplo
(make-instance (sym-cat pepe- (gensym)) of ltclasegt)
generaraacute una instancia con el nombre pepe-genN
3513 Com fer un getset drsquoun slot drsquouna classe
Per consultar el valor drsquoun slot drsquouna classe ho podem fer enviant-li un missatge de la seguumlent manera
(send ltVARIABLEgt get-ltNOM_ATRIBUTgt)
Per exemple si tenim una instagravencia de la classe Plat ( instancia ) i volem saber el valor del seu slotnom
(send instancia get-nom)
Per assignar un valor a un slot drsquouna drsquoinstagravencia hem drsquoenviar-li un missatge de la seguumlent manera
(send ltVARIABLEgt put-ltNOM_ATRIBUTgt ltVALORgt)On ltVALORgt pot ser un valor o un megravetode que retorni un valor
(send instancia put-nom nom)
3514 iquestCoacutemo acceder a una instancia cuyo nombre conocemos
Si conocemos el nombre de una instancia y necesitamos acceder a ella es decir necesitamos enviarle alguacutenmensaje mediante la funcioacuten send podemos hacerlo directamente escribiendo en lugar de la variable quealmacena la instancia el nombre de la instancia entre corchetes [ ] A continuacioacuten se muestra un ejemplo
(bind altura_rect1 (send [rect1] get-altura))
En este caso se guardaraacute en la variable altura_rect1 el valor de la altura de la instancia que tiene comonombre rect1
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2959
26 Capiacutetulo 3 CLIPS
3515 Obtenir el nom drsquouna classe
Si tenim una instagravencia drsquouna classe i volem saber el nom de la classe (uacutetil si tenim una bona taxonomiade classes) ho podem fer amb el megravetode (class ltINSTANCIAgt)
Si per exemple imaginem que tenim la classe Actor la qual teacute com subclasses la classe APrincipalASecundari i ACameo Imaginem que estem tractant amb instancies drsquoactors i volem saber si la instanciaque estem tractant es de la classe APrincipal
Ho hauriacuteem de fer de la seguumlent manera
(eq (class instancia) APrincipal)
Fixem-nos que APrincipal eacutes un siacutembol no un String (un truco eacutes fixar-se en que no teacute cometes) Si vol-gueacutessim comparar-ho amb un String (per exemple un String introduiumlt per lrsquousuari) ho podriacuteem transformara un String amb el megravetode str-cat
(eq (str-cat (class instancia)) Principal)
3516 Como convierto un INSTANCE-ADRESS en un INSTANCE-NAME
En alguacuten momento nos podemos encontrar con la situacioacuten de que disponemos de un puntero a unainstancia y necesitamos su nombre o lo contrario En ambos casos podemos usar la funcioacuten instance-nameSu funcionamiento es bidireccional podemos introducirle un instance-name y nos devolveraacute un instance-adress y viceversa
1 (defrule imprimir-nombre2 estlt-(object (is-a Estudiante) (edad 25))3 =gt4 (printout t (instance-name est) crlf)5
)
3517 Com iterar a traveacutes drsquoun multi-slot
El seguumlent tambeacute eacutes vagravelid com exemple de com iterar a traveacutes drsquouna llistaImaginem que tenim una instagravencia de la classe Plat a la varible (plat) la qual teacute un multi-slot drsquoinstagravencies
de la classe Ingredient Imaginem que volem imprimir per pantalla el nom drsquoaquests ingredients (slot nomde la classe Ingredient) Necessitarem iterar sobre la llista drsquoingredients
1 (bind i 1)2 (while (lt= i (length$ (send plat get-ingredients)))3 do4 (bind ingredient (nth$ i (send plat get-ingredients)))5 (printout t (send ingredient get-nom) crlf)6 (bind i (+ i 1))7 )
El megravetode (nth$ ltINDEXgtltLLISTAgt) et retorna lrsquoelement situat a INDEX de LLISTAEl megravetode (length$ ltLLISTAgt) retorna el nuacutemero drsquoelements de LLISTA
3518 Coacutemo modificarinsertarborrar valores en un multislot
Los valores de un multislot se pueden cambiar usando la funcioacuten slot-replace$ La sintaxis es la siguiente
(slot-replace$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt ltvalorgt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3059
35 Las clasesinstancias 27
Donde ltiniciogt y ltfingt son el rango de posiciones del multislot que se quiere modificar y ltvalorgtson los valores que queremos reemplazar Obviamente deberaacute haber tantos valores como posiciones hayamosindicado en el rango
Para insertar nuevos valores podemos usar la funcioacuten slot-insert$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltposgt ltvalorgt)
El valor se inserta delante de la posicioacuten indicada si la posicioacuten es mayor que la longitud del multislot secolocaraacute al final
Para borrar elementos de un multislot podemos usar la funcioacuten slot-delete$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt)
Se borraraacuten los elementos que estaacuten en el rango indicado
3519 Coacutemo recorrer un atributo multievaluado
Supongamos que la variable respuesta tiene una lista de instancias
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 aquiacute hacemos lo que queramos4 )5 )
Loop-for-count funciona como un for primero la variable que haraacute de contador luego el valor de origeny luego el valor final Para controlar el final usamos la funcioacuten que he explicado antes i tomaraacute valoresdesde 1 hasta n asiacute que usando la funcioacuten nth$ obtendremos cada uno de los elementos La variable auxiraacute teniendo cada uno de los valores
3520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz)
Es igual que antes pero con dos bucles
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 (bind aux2 (send aux get-slot_que_queremos))4 (loop-for-count (j 1 (length$ aux2)) do5 (bind aux_final (nth$ j aux2))6 aquiacute ya podemos trabajar con el elemento en concreto7 )8 )
Supongamos que respuesta tiene una lista de instancias con el primer bucle haremos lo mismo que antes ir
iterando por esas instancias Una vez que tenemos cada instancia con aux2 con el segundo bucle iteraremosdentro de sus instancias interiores
Por ejemplo si tenemos varios equipos de fuacutetbol y cada equipo tiene varios jugadores en el primer bucleestamos iterando entre los equipos y en el segundo entre los jugadores de cada equipo en particular
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3159
28 Capiacutetulo 3 CLIPS
3521 Com puc esborrar una instagravencia
Per esborrar una instagravencia (per exemple segons la informacioacute que proporcioni lrsquousuari podem deduir queuna segraverie drsquoinstagravencies eacutes impossible que es facin servir per a la solucioacute) ho podem fer enviant un missatgedelete a la instagravencia eacutes a dir (send ltINSTANCIAgtdelete)
(send inst delete)
Un megravetode que podria ser uacutetil de la cara a la pragravectica podria ser el seguumlent
1 (defrule elimina-instancia2 (declare (salience 10))3 elimina-fact lt- (elimina-inst inst)4 =gt5 (send inst delete)6 (retract elimina-fact)
Imaginem que per exemple que volem eliminar una llista drsquoinstagravencies Per eliminar-les podriacuteem recoacuterrerel llistat marcant les instagravencies que volem esborrar afegint el seguumlent fet
(assert (elimina-instancia inst))
Aixiacute com que elimina-instancia teacute un salience alt esborraria les instagravencies marcades quan tingueacutes ocasioacuteDrsquoaquesta manera ens estalviem el problema de recoacuterrer un llistat drsquoinstagravencies amb un iterador mentre
anem eliminant els elements de la llista cosa que pot donar problemes amb lrsquoiterador
3522 Com imprimir una instagravencia
Per imprimir una classe (uacutetil per exemple per mostrar el resultat final) el millor eacutes definir message-handlersPer exemple imaginem que tenim una classe Plat la qual teacute un slot nom de tipus String Si volgueacutessimimprimir per pantalla un missatge que digueacutes
El nom del plat eacutes ndashltnom del platgtndash
Hauriacuteem de definir un message-handler que simplement imprimiacutes per pantalla el valor de lrsquoslot de laforma
(defmesssage-handler ltCLASSNAMEgt ltMESSAGENAMEgt primary ()ltCODIgt
)
Per el cas de lrsquoexemple
1 (defmessage-handler Plat print primary ()2 (printout t -- selfnom --) )3 )
Per cridar-ho nomeacutes caldragrave enviar-li un missatge a la instagravencia amb el nom del message-handler (enaquest cas print)
(send instancia print)
Un message-handler pot cridar a altres message-handlers amb el que es poden encadenar diverses instagraven-cies Per exemple imaginem que tenim la classe Menuacute la qual teacute un atribut plats que eacutes un llista drsquoinstagravenciesde la classe Plat Dintre del message-handler menuacute podriacuteem iterar a traveacutes de la llista de plats enviant elmissatge print que hem definit anteriorment
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3259
36 Programacioacuten 29
3523 Com es navega entre instagravencies relacionades
Per exemple tinc una instagravencia iA que teacute un slot anomenat slotB que eacutes una instagravencia drsquoun frame B Vullsaber el nom de la instagravencia associada al slotB de iA Ho pots fer aixiacute
(bind B (send iA get-slotB))(bind res (send B get-nom))
Si estagraves dins drsquouna condicioacute ho pots simplificar de la forma seguumlent
(bind res (send iAslotB get-nom)
Els dos punts soacuten equivalents al punt de Java
36 Programacioacuten
361 Com introduir un comentari
Els comentaris a CLIPS va darrere de un com per exemple
Comentari
Tambeacute podem afegir comentaris a les nostres regles deffacts deftemplates etc Generalment van darrereel nom de la estructura per exemple
1 (defrule neteja regla per la qual si la cuina estagrave bruta srsquoafegiragrave una tasca de2 neteja
3 (estat-cuina bruta)4 =gt5 (assert (tasca netejar))6 )
362 Referenciar el valor null a CLIPS
Per referenciar el valor null a clips es fa amb el simbol nil Per exemple si volem saber si una instagravenciainst es null ho podriacuteem fer de la seguumlent manera
(eq inst nil)
363 Formas de recorrer una lista
Para recorrer una lista disponemos de diferentes opciones en este FAQ explicaremos como crear unaestructura tipo ldquoWHILErdquo y tipo ldquoFORrdquo
1 While Esta regla se ejecuta hasta que la expresioacuten a evaluar sea falsa Este tipo de estructura se rigepor seguir la sintaxis while - do y se construiriacutea de la siguiente forma
(while ltexpresioacutengt[do] ltaccioacutengt)
Doacutende dependiendo del valor de ltexpresioacutengt
Valor TRUE Se realizaraacute la accioacuten ltaccioacutengt i se volveraacute a evaluar ltexpresioacutengt
Valor FALSE No se ejecutaraacute la accioacuten ltaccioacutengt
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3359
30 Capiacutetulo 3 CLIPS
2 For Esta regla sirve para ejecutar un bucle N (final - inicio) veces Este tipo de estructura se rige porseguir la sintaxis loop-for-count y se construiriacutea de la siguiente forma
(loop-for-count (ltvargtltiniciogtltfinalgt) [do] ltaccioacutengt)
Doacutende
ltvargt Variable que se usara como iacutendice
ltiniciogt Valor inicial que tendraacute ltvargt
ltfinalgt Ultimo valor que tendraacute la variable ltvargt
ltaccioacutengt Accioacuten que es realizaraacute hasta que ltvargt tenga el valor de ltfingt
364 Formas de elegir una opcioacuten
En este apartado explicaremos como crear una estructura if y una estructura switch
If Este tipo de estructura se rige por seguir la sintaxis if - then - else y se construiriacutea de lasiguiente forma
(if ltexpresioacutengtthen ltaccioacutengt[else ltaccioacuten2gt])
Doacutende dependiendo del valor de ltexpresioacutengt
bull Valor TRUE Se realizaraacute la accioacuten ltaccioacutengtbull Valor FALSE Se realizaraacute la accioacuten ltaccioacuten2gt (en caso de haber)
Switch Este tipo de estructura se rige por seguir la sintaxis switch - opciones y se construiriacutea dela siguiente forma
(switch ltexpresioacuten-testgt(case OPCION1 then ACCION1)(case OPCION2 then ACCION2)
([default] ACCION-DEFAULT)
)
Doacutende dependiendo del valor de ltexpresioacuten-casegt se ejecutaraacute una ltaccioacutengt en particular Si nin-guna ltopcioacutengt es correcta se ejecutara la ltaccioacuten-defaultgt
365 Funciones con la clase String
Habitualmente trabajaremos con Strings o cadena de Strings CLIPS proporciona una serie de herramien-tas para trabajar con esta clase
1 Convertir string a MAYUacuteSCULAS A veces es conveniente tener todos los caracteres en mayuacutesculaspara no tener problemas de comparaciones o simplemente por convenio Para ello CLIPS dispone dela funcioacuten upcase la cual convierte a mayuacutesculas un siacutembolo o string
(upcase ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplos
(upcase Ccedillips es divertido) rarr CcedilLIPS ES DIVERTIDO
(upcase Clips_es_divertido) rarr CLIPS_ES_DIVERTIDO
2 Convertir string a MINUacuteSCULAS la funcioacuten es downcase
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3459
36 Programacioacuten 31
3 Concatenacioacuten de strings Tambieacuten es de gran utilidad poder juntar dos o maacutes paraacutemetros en un solostring Todo paraacutemetro a juntar deben ser de uno de los siguientes tipos symbol String integer floato instance-name
(str-cat parametro1 parametro2 parametroN )
Ejemplo
(str-cat IA nota 10) rarr IAnota10
4 Comparacioacuten de strings Funcioacuten que nos indica si dos strings son iguales
(str-compareltexpresioacuten-simboacutelica-o-de-cadenagtltexpresioacuten-simboacutelica-o-de-cadenagt
)
Esta funcioacuten devuelve
0 Si ambos strings son iguales1 Si el primer string es mayor que el segundo string-1 Si el primer string es menor que el segundo string
5 Longitud de un string Muchas veces es de gran utilidad saber que tamantildeo tiene un string
(str-length ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplo
(str-length Inteligencia Artificial) rarr 23
366 iquestCoacutemo obtener el contenido de una variable en un string
Para conseguir un string a partir de un integer float symbol instance-name debes utilizar el comandostr-cat Si a la funcioacuten le pasamos como paraacutemetros varios elementos los transformaraacute a string y losconcatenaraacute La sintaxis de esta funcioacuten es la siguiente (str-cat elementos) Esta funcioacuten la usaremossobre todo cuando queramos realizar comparaciones entre el contenido de una variable y un string ya quepreviamente necesitaremos usar la funcioacuten str-cat para pasar el contenido de la variable a string y realizarde este modo la comparacioacuten de forma correcta
367 iquestComo se crea una lista
Con create$ Todos los operadores sobre listas llevan el siacutembolo $ al final Igual que con las variables sedebe usar bind siempre que se desee modificar una lista
(bind lista (create$ a b c))
368 iquestComo borro un elemento de una lista
Con delete$Usa la siguiente sintaxis(delete$ ltlistagt ltindice-iniciogt ltindice-finalgt)Se borraraacuten todos los elementos del rango entre las posiciones inicio y final ambas incluidas Tambieacuten exis-
tedelete-member$ (delete-member$ ltlistagt ltelementogt) Borraraacute todas las apariciones del elemento enla lista
(delete$ (create$ a b c d e f) 3 5) minusrarr (a b f)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1459
32 Los hechos 11
3 (multislot asignaturas (type STRING) (cardinality 1 5))4 (slot num-carreres (default 1))5 (multislot notas (allowed-strings MH NP))6 )
326 iquestQueacute debo utilizar hechos ordenados o no ordenados
Como se puede intuir si tenemos un conjunto de hechos los cuales conceptualmente pertenecen al mismoaacutembito seraacute una solucioacuten maacutes elegante agruparlos a traveacutes de un deftemplate En caso que tengamos quealguacuten hecho aislado seraacute mas sencillo declararlo como un hecho ordenado
327 Fets o Objectes
Veient la definicioacute de deftemplate podem confondrersquons a lrsquohora de decidir si fer servir fets o fer servirobjectes
Deixant de banda altres diferegravencies ja comentades (les classes suporten jerarquia de classes heregravenciaetc) els objectes es fan servir per representar el coneixement (mitjanccedilant un conjunt drsquoinstagravencies)
Aixiacute que generalment farem servir classes i objectes per representar coneixement mentre que farem servirels fets per portar control sobre lrsquoexecucioacute del problema
Per exemple podriacuteem definir un deftemplate per emmagatzemar un resultat o per poder controlar lrsquoestatde lrsquoexecucioacute
A la pragravectica de Mikeo (penjada a la web de lrsquoassignatura) teniacuteem un deftemplate habitacion-actual
1 (deftemplate habitacion-actual2 (slot habitacion)3 (slot area-restante)4
(slot presupuesto-restante)5 (slot precio-total)6 (slot prioridad-actual)7 )
Amb el qual controlagravevem la construccioacute drsquouna habitacioacute Assignagravevem una instagravencia de la classe habita-cioacute al slot habitacion de habitacion-actual i mitjanccedilant una segraverie de regles que feien unificacioacute ambhabitacion-actual actuagravevem sobre lrsquohabitacioacute drsquouna manera o drsquoun altre
328 Creacioacuten de hechos (assertdeffacts)
Si queremos crear un solo hecho utilizaremos el comando assert Por ejemplo (assert (casa roja))Si por el contrario queremos crear una estructura ordenada de hechos utilizaremos deffacts
(deffacts mishechos (casa roja) (pelota azul))
329 Modificar un fet
Per modificar un fet (per exemple molt uacutetil si estem treballant amb deftemplates) ho podem fer mitjanccedilant(modify ltINSTANCIAgtltFETSgt)
Per exemple si tingueacutessim el deftemplate persona
1 (deftemplate persona2 (slot nom)3 (slot edad)4 (slot dni)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1559
12 Capiacutetulo 3 CLIPS
I hagueacutessim afegit el fet
(assert (persona (nom Pepe)(edad 25)(dni 46974431)))
I el fet
(assert (aniversari 46974431))
Podriacuteem tenir la seguumlent regla
1 (defrule aniv2 aniversari lt- (aniversari dni)3 persona lt- (persona (edat edat)(dni dni))4 =gt5 (retract aniversari)6 (modify persona (edat (+ 1 edat)))7 )
La qual srsquoactivaragrave si hi ha un fet aniversari drsquouna persona Fent servir el dni indicat al fet aniversaribusquem el fet persona que teacute el mateix dni Deixem el valor edat a la variable edat per poder treballaramb ella meacutes endavant
Hem agafat tambeacute la direccioacute del fet aniversari per tal de poder esborrar-lo de la base de fets Aixograve srsquohafet per dues raons
Primer per mantenir meacutes neta la base de fets Segon i meacutes important Com que hem canviat el fet laregla tornaragrave a fer unificacioacute amb el fet (perquegrave ara eacutes diferent) amb la regla aniversari amb el que entrariadintre drsquoun bucle sense fi on srsquoaniria incrementant lrsquoedat de la persona
Un cop hem esborrat el fet aniversari incrementem en 1 el valor del slot edat de la persona fent servirla variable edat que hem declarat a la part esquerre de la regla
El comportament de modify es fer un retract del fet a la base de fets i despreacutes fer un assert amb els nous
valors Si volem canviar mes drsquoun slot del fet es convenient canviar-los tots a la vegada La raoacute es que cadavegada que fem un modify lrsquoapuntador al fet es modifica i lrsquoapuntador que tenim a la variable que hem fetservir ja no es vagravelid
Si no temim mes remei que fer la modificacioacute del fet pas a pas srsquoha de saber que la crida a modify retornalrsquoapuntador al nou fet Si el guardem a altra variable (o a la mateixa) podrem continuar modificant el fetamb la nova referegravencia
3210 Com elimino un fet de la base de fets
Per eliminar un fet de la base de fets ho podem fer amb la paraula clau (retract ltFETgt) on ltFETgt eacutes
un punter al fetPer obtenir aquest fet ho podem fer fent servir ltVARgtlt- ltFETgt a la part esquerre de la reglaPer exemple
1 (defrule accionsvent2 vent lt- (vent tipus)3 =gt4 (switch tipus5 (case poc then (assert (accio persiana0)))6 (case normal then (assert (accio persiana50)))7 (case molt then (assert (accio persiana100)))8 )9 (retract vent)
10 )
Afegiragrave fets per realitzar les accions pertinents i esborraragrave el fet de la base de fets
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1659
33 Variables 13
33 Variables
331 Variables a CLIPS
No cal declarar una variable (ni el seu tipus) nomeacutes cal afegir un interrogant al comenccedilament drsquoun simbol
per indicar que eacutes una variableCLIPS srsquoencarrega del control de tipus depenent del que assignem a la variablePer exemple testvar correspondria a la variable testvar Si per exemple assigneacutessim lrsquoenter 3 a
testvar CLIPS tractaria la variable com una variable entera
332 Com assignar un valor a una variable
Per assignar un valor a una variable es fa servir el megravetode (bind) amb la forma
(bind ltVARIABLEgtltVALORgt)
On ltVALORgt pot ser un valor o un megravetode que retorni un valor Per exemple si volem assignar un 4 a lavariable var
(bind var 4)
O per exemple podriacuteem assignar a la variable var la suma de 2 meacutes 2
(bind var (+ 2 2))
333 iquestCoacutemo declarar variables globales
Para crear una variable global hay que meterla dentro de la construccioacuten defglobal La declaracioacuten de la
variable seguiraacute el modelo nombreVariable = expresioacutenPor ejemplo
(defglobal presupuesto = 0)
Pueden aparecer en la parte izquierda de las reglas si no son utilizadas para asignar un valor y su cambiono activa reglas pero no pueden ser paraacutemetros de funciones ni meacutetodos
334 iquestCoacutemo trabajar con variables sumando restando por ejemplo contadores
La mejor forma es con variables globales se definen asiacute (defglobal x = 0) puede ser el valor quequeramos tanto nuacutemero string Y si queremos sumarle 10 por ejemplo
(bind x (+ x 10))
Las variables locales como por ejemplo x soacutelo tienen valor mientras dura su ejecucioacuten y eso suele ser enesa misma liacutenea o en un bucle Si le damos valor a x y luego preguntamos por ella nos diraacute que no existe
335 Quina diferegravencia hi ha entre les variables del tipus nom_variable i les del tipus $nom_variable
Les primeres contenen un sol valor i les segones en poder contenir meacutes drsquoun (o cap)
336 Quegrave significa lrsquointerrogant () quan va sol
Eacutes una variable anogravenima Pots utilitzar sense posar-hi cap nom si no trsquointeressa el valor en concret Perexemple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1759
14 Capiacutetulo 3 CLIPS
(Primer filtre_preu )
Aquesta condicioacute significa ldquosi el fet (Primer filtre_preu) teacute algun valorrdquo O sigui que si tingueacutessimel fet (Primer filtre_preu ok) es compliria la condicioacute (i si en comptes de ldquookrdquo fos ldquopatatardquo tambeacute escompliria) En canvi si el fet fos uacutenicament (Primer filtre_preu) no es compliria la condicioacute
337 Quegrave significa el dogravelar ($) quan va sol
Eacutes com lrsquointerrogant perograve admet meacutes drsquoun valor Per exemple
(Primer filtre_preu $ ok)
donaragrave cert pels fets de lrsquoestil (Primer filtre_preu patata ok) (Primer filtre_preu hola ok)(Primer filtre_preu patata hola ok) (Primer filtre_preu ok) Eacutes a dir no importa els valors quehi hagi entre filtre_preu i ok si al final hi ha un ok
338 iquestComo puedo ver los hechos presentes en un momento determinado
Abriendo la Facts Window en Window de la barra de menuacute
34 Las reglas
341 iquestCoacutemo construir una regla
Para construir una regla utilizaremos la construccioacuten defrule
Sintaxis
(defrule ltnombre-reglagt [ltcomentariogt][ltdeclaracioacutengt]ltelemento-condicioacutengt Parte izquierda (LHS)
=gtltaccioacutengt) Parte dcha (RHS) de la regla
Una regla consta de un conjunto de condiciones (antecedente) tambieacuten denominados elementos condicio-nales (EC) o parte izquierda (LHS) y de un conjunto de acciones (consecuente) tambieacuten denominado partederecha de la regla (RHS) La regla se activaraacute siempre que se satisfagan todos los EC mediante hechos oinstancias que los cumplan
Si se introduce en la base de reglas una nueva regla con el mismo nombre que el de una existente la nuevaregla reemplazaraacute a la antigua
Si una regla no tiene parte izquierda es decir no tiene elementos condicionales entonces el hecho(initial-fact) actuaraacute como el elemento condicional para ese tipo de reglas y la regla se activaraacute cadavez que se ejecute un comando reset
342 iquestCoacutemo gestionar la parte izquierda (LHS) de una regla
Declarar hechosSi no se especifica ninguna condicioacuten la regla se activaraacute siempre Una condicioacuten puede ser un simple hecho
(Ej vegetariano) o un hecho ordenado con unos valores concretos (Ej (persona (nombre Juan))) Si loque queremos es obtener el valor de un hecho insertaremos una variable en su lugar (Ej (persona (nombre
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1859
34 Las reglas 15
n)) ) Entonces entraraacute en la regla para cada valor posible que pueda asignar a la variable n a partir delos hechos
Si queremos indicar cualquier valor utilizaremos el siacutembolo y para cualquier lista el siacutembolo $ (Ej(evento ) (estilo $) ) Tambieacuten existe la opcioacuten de guardar en una variable una referencia al objetoEllo se consigue poniendo var lt- a su izquierda (Ej p lt- (persona (nombre Juan))) Se puede usarpor ejemplo para pasaacuterselo de paraacutemetro a una funcioacuten llamada en la RHS
Establecer condiciones
Ademaacutes podemos especificar restricciones adicionales sobre los valores que puede tomar un campo de unhecho Existen tres tipos principales de restricciones Conectadas (por orden de precedencia o prioridad)
not (~) Evita que cierto campo cumpla determinada restriccioacuten
and (amp) Combina dos restricciones conjuntivamente
or (|) Combina dos restricciones disjuntivamente
De predicado () Obliga a que cierto campo cumpla determinada condicioacuten (especificada por el predicado)
Por valor devuelto por una funcioacuten = Permite llamar a una funcioacuten y utilizar el valor devuelto pararestringir el valor que pueda tomar un campo de un hecho
Se puede comprobar si se cumple una determinada condicioacuten mediante el constructor test Dentro detest se pueden hacer llamadas a cualquier funcioacuten o predicado ya sea primitiva de CLIPS o definidapor nosotros
Combinar elementos
Los diferentes elementos de la parte izquierda van impliacutecitamente unidos mediante una AND que indicaconjuncioacuten No obstante podemos hacerlo expliacutecitamente mediante (and (cond1) (cond2)) aunque suelen
utilizarse para anidar ANDs dentro de ORsOR Sirve para hacer una disyuncioacuten (or (cond1) (cond2)) Es equivalente a escribir varias reglas en lasque cada una de ellas tenga uno de los componentes del OR en su parte izquierda y la misma parte derecha
NOT Sirve para detectar si no existe un determinado hecho (Ej (not (estilo sibarita)))exists Cuando a un conjunto de elementos se le antecede exists se comprueba que hay al menos un
hecho en la base de hechos que cumpla la condicioacuten (Ej (exists(bebida precio (ltprecio 5))) )forall Permite comprobar si todos los hechos que satisfacen un determinado patroacuten cumplen una serie
de condiciones (Ej (forall(plato (estilo moderno)))
343 iquestCoacutemo obtener la direccioacuten de hechos o instancias situados en LHS
En algunas ocasiones vamos a necesitar realizar alguacuten tipo de accioacuten en la parte derecha de las reglassobre hechos o instancias que cumplan unas determinadas condiciones Pero para ello necesitaremos primerotener acceso a estos elementos para despueacutes poder operar sobre ellos Esto lo conseguiremos guardando ladireccioacuten del elemento en una variable hacieacutendolo del siguiente modo
variable_direccion lt- (elemento)
Pongamos un ejemplo para ver realmente el funcionamiento y uso de esta posibilidad que CLIPS nosofrece
1 (defrule imprime-area2 instancia lt- (object (is-a Rectangulo))3 =gt4 (printout t Area del rectangulo (instance-name instancia)5 (send instancia calcula-area) crlf)6 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1959
16 Capiacutetulo 3 CLIPS
Cuando se ejecuta esta regla se imprimiraacuten las aacutereas de todas las instancias de la clase Rectangulo Enla parte izquierda de la regla lo que hacemos es guardar en la variable instancia la direccioacuten de la instanciade Rectangulo que estamos tratando en ese momento La regla se ejecutaraacute para todas las instanciasalmacenadas en la memoria de trabajo que cumplan la condicioacuten (is-a Rectangulo) es decir para todaslas instancias de la clase Rectangulo En la parte derecha de la regla donde se ejecutan las acciones podemosver que se imprimiraacute para cada instancia lo siguiente Area del rectangulo [nombre_instancia] aacuterea
del rectaacutengulo La funcioacuten instance-name nos devuelve el nombre de la instancia que le pasamos porparaacutemetro Ademaacutes hemos llamado al gestor de mensajes calcula-area para que nos devuelva el area delrectaacutengulo
344 iquestCoacutemo hacer sentencias or en la izquierda de las reglas
Con (or ) Si por ejemplo tenemos dos hechos (a) y (b) y queremos ejecutar la derecha de la reglacuando se cumpla uno de los dos tendremos que hacer (or (a) (b)) Atencioacuten porque la parte derecha seejecutaraacute tantas veces como veces se cumpla cada uno de los hechos si para nosotros existe tanto (a) como(b) la parte derecha se ejecutaraacute dos veces Para que soacutelo se usa una vez podemos hacer combinaciones de
or y and (funciona igual) o usar un patroacuten por ejemplo (persona Juan|Pedro) soacutelo se ejecutariacutea una vez
345 Com afegir una condicioacute a la part esquerre drsquouna regla
A vegades eacutes necessari que una regla srsquoinstanciiuml si es produeix una condicioacute especial (i no un fet) Per feraixoacute farem servir la comanda (test ltCONDICIOgt)
Per exemple imaginem que la nostre base de fets compte amb un fet (preu valor) amb un preudeterminat Imaginem que volem una regla que srsquoinstanciiuml quan aquest valor eacutes meacutes gran que 30
Per fer-ho fent servir tot el que hem explicat
1 (defrule preucar2 (preu preu)3 (test (gt preu 30))4 =gt5 (printout t El preu es mes gran que 30)6 )
Eacutes a dir si el preu eacutes meacutes gran que 30 srsquoimprimiragrave un missatge per pantallaAquestes condicions poden contenir ANDs i ORs de varies condicionsPer exemple
1 (defrule preulimit2 (preu preu)3 factminim lt- (preuminim minim)4 factmax lt- (preumaxim maxim)5 (test (and (gt preu minim) (lt preu maxim) ))6 =gt7 (retract factminim)8 (retract factmax)9 (printout t El preu estagrave dintre del rang)
On comprovarem si el preu estagrave dintre drsquoun rang determinat i en aquest cas esborra els fets que contenen
el magravexim preu i el miacutenim preu i mostra un missatge per pantalla
346 Puede una misma regla ejecutarse maacutes de una vez
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2059
34 Las reglas 17
Es muy importante entender que cada regla se ejecutaraacute una vez por cada combinacioacuten de valores en suLHS
1 (defrule regla2 (color col)3 (peso pes)4 =gt5
Si tengo tres colores y dos pesos asertados la regla se ejecutaraacute 6 veces una con cada combinacioacuten decolor y peso
347 Com puc definir lrsquoordre de les regles
La idea drsquoun sistema basant en regles eacutes no definir un ordre lineal drsquoaquestes (costa deixar de pensar de
forma iterativa)En el cas de necessitar que una regla srsquoexecuti despreacutes drsquouna altre pots fer servir Fets la regla anteriorcrea un fet que la segona regla tindragrave a la part esquerra
1 (defrule pregunta12 =gt3 (assert (pregunta1Feta))4 5 )6
7 (defrule pregunta2
8 (pregunta1Feta)9 =gt
10 11 )
I finalment pots usar la propietat salience Aquesta propietat indica la prioritat drsquoexecucioacute de les regles( les regles amb salience majors srsquoexecutaran abans ) Pot prendre valors positius i negatius entre -10000 y+10000 Per defecte les regles tenen salience 0
1 (defrule pregunta12 (declare (salience 2))3 =gt4 5 )6
7 (defrule pregunta28 (declare (salience 1))9 =gt
10 11 )
El valor indicado en la propiedad salience puede ser el nuacutemero directamente o una expresioacuten por ejemplovariable10 podemos usar variable para elegir que regla se ejecutaraacute
Las prioridades deben ser usadas solo para determinar el orden en el que se disparan algunas reglas sobreotras no para fijar el flujo de control ya que la principal ventaja de un sistema basado en reglas es larepresentacioacuten declarativa del conocimiento y de esta forma abusando de las prioridades conduce a unsistema procedimental
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2159
18 Capiacutetulo 3 CLIPS
348 Com forccedilar que una regla sigui la primera
Per que aquesta regla sigui la primera ha de tenir el salience meacutes gran de totes
1 (defrule presentacio2 (declare (salience 20))3 =gt4 (printout t ------ Benvingut ----- crlf)5 )
349 Vull guardar certs valors que es fan servir durant lrsquoexecucioacute de diferents regles Com hopuc fer
Tens principalment dues alternatives Si el valor eacutes un tipus bagravesic pots fer servir una variable global ambla sintaxi seguumlent
(defglobal nom_variable = valor)
Aquesta sentegravencia no va a dins de cap funcioacute ni regla es posa sola a la part que creguis convenient delcodi Vegem un exemple
(defglobal preu_minim_primer = 1000)
Per fer-la servir es fa exactament de la mateixa manera que amb una variable normal perograve has de posarels dos asteriscs Per exemple
(bind preu_minim_primer curr-preu)
Per altra banda si el valor o valors que vols guardar han de ser instagravencies una bona estrategravegia pot serutilitzar un deftemplate Eacutes uacutetil sobretot per anar guardant solucions temporals o llistes drsquoelements quepoden formar part de la solucioacute
Per utilitzar-ho has de seguir els passos seguumlents
1 Definir el deftemplate
(deftemplate nom_del_deftemplate(multislot nom_multislot)
(slot nom_slot)
)
Amb un exemple es veuragrave meacutes clar
(deftemplate llista-plats(multislot primers)(multislot segons)(multislot postres)
)
2 Inicialitzar el deftemplate
(defrule[condicions vagraveries] La condicioacute base eacutes que llista-plats no srsquoha inicialitzat encara
(not (llista-plats))=gt
llista conteacute els valors de llista-plats (que de moment estan buits)(bind llista (assert (llista-plats)))
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2259
35 Las clasesinstancias 19
3 Assignar-li valors
(bind segons_plats (find-all-instances ((plat Plat)) TRUE)(modify llista (segons segons_plats))
4 Recuperar els valors
(defrule[condicions vagraveries]llista lt- (llista-plats (segons $segons_plats))
=gt
Ara la variable $segons_plats conteacute tots els elements de segons
35 Las clasesinstancias
351 Tengo que representar la jerarquiacutea de un frame iquestEs preferible antildeadir las subclases a laontologiacutea o bien diferenciarlas mediante un slot en la superclase
Las dos formas son vaacutelidas pero es recomendable representarlas en clases separadas cuando se vayan abuscar instancias de ese tipo ya que asiacute no tendremos que hacer un recorrido por todas las de la superclaseNo obstante si soacutelo se trata de una caracteriacutestica puntual del frame y no vamos a hacer buacutesquedas de unaexclusiva subclase entonces seraacute maacutes eficiente antildeadir un slot debido a su mejor accesibilidad
352 iquestQueacute es un objeto
Podriacuteamos decir que un objeto es un hecho no ordenado con herencia
353 iquestPorqueacute usar objetos en contexto de la praacutectica de CLIPS de IA
Como bien sabemos una parte de la praacutectica de SBCrsquos consisten en crear la ontologiacutea Esta ontologiacutease exporta para poder interactuar con CLIPS en formato pins y pont El archivo pont contendraacute ladeclaracioacuten de todas las clases creadas previamente por Protege (defclass ) El archivo pins contendraacute
todas las instancias de las clases declaradas en el archivo pont Como puede intuir el lector se necesitaraacuteinteractuar con los objetos previamente creados por Protegravegegrave
354 Como se definen las clases
Para definir las clases usaremos el constructor defclass
(defclass ltnombregt [ltcomentariogt](is-a ltnombre-de-superclasegt)[(role concrete | abstract)]
[(pattern-match reactive | non-reactive)]ltslotgt definicioacuten de los atributos de la clase
ltdocumentacioacuten-handlergt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2359
20 Capiacutetulo 3 CLIPS
En caso de desear que la nueva clase herede las propiedades de otra ya existente el nombre de esta deberaacuteespecificarse despues de is-a El rol determinaraacute si la clase es concreta (se puede instanciar) o abstracta(destinada a ser superclase) El pattern-match debe declararse como reactivo si se desea que las instanciasde la clase puedan unificar con los elementos objeto de las reglas (siacutembolo lt-) Los slots correspondena los atributos de la clase y los handlers a las funciones de eacutesta Los handlers se pueden declarar en ladeclaracioacuten de la propia clase pero se deben definir externamente Dado que no aporta ninguna ventaja
declararlos es recomendable definirlos directamente Noacutetese que todo aquello que estaacute entre corchetes ([])constituye informacioacuten adicional que no es obligatorio especificar
1 (defclass Persona2 (is-a Ser_Vivo)3 (role concrete)4 (single-slot edad5 (type INTEGER)6 (range 1 99)7 (cardinality 0 1)8 (create-accessor read-write)9 )
10 (multislot amigos11 (type INSTANCE)12 (allowed-classes Persona)13 )14 )
El comportamiento y declaracioacuten de los slots es ideacutentico al de los slots de los hechos ordenados Losatributos de tipo INSTANCE (referencian otras instancias) estan en formato INSTANCE-NAME
355 Com consulto una instagravencia a partir drsquouna regla
Podem fer servir la part esquerre drsquouna regla per trobar instagravencies Lrsquouacutes eacutes molt semblant a trobar elpunter a un fet fent servir
(object [(is-a ltNOM_CLASSEgt)|(name ltNOM_INSTANCIA)|(ltNOM-SLOTgt ltVALORVARIABLE))])
Per exemple si volem que una regla srsquoinstanciiuml si tenim instanciat un plat de la classe Plat podriem ferservir
1 (defrule tenimplat2 plat lt- (object (is-a Plat))3 =gt4 (print t (send plat get-nom) crlf)
La regla imprimiragrave el nom del plat que trobi Eacutes important notar que srsquoactivaragrave per cada instagravencia de platque tinguem a la base de coneixement
Podem consultar els valors de la instancia fent servir condicions a la part esquerre de la regla Per exemplesi nomeacutes volgueacutessim els plats amb un preu meacutes gran que 30
1 (defrule platCar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Srsquoactivaragrave per tots els plats amb un preu major a 30
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2459
35 Las clasesinstancias 21
Srsquoha drsquoanar amb cura per aquest tipus de regla ja que si la base de coneixement eacutes molt amplia pot acabarderivant amb problemes de memograveria
Per exemple si en comptes de preguntar per una instagravencia de Plat pregunteacutessim per dues instancies dePlat
1 (defrule platsCars2 plat1 lt- (object (is-a Plat) (Preu p1))3 plat2 lt- (object (is-a Plat) (Preu p2))4 (test (gt p1 30))5 (test (gt p2 30))6 =gt7 (print t (send plat1 get-nom) i (send plat1 get-nom) soacuten cars8 crlf)9 )
Faria unificacioacute amb totes les combinacions possibles (amb repeticions) de dos plats de tota la base deconeixement Aixograve es podria anar ampliant fins fer-se intractable
Si tenim drsquoalguna manera el nom de la instancia podem fer
1 (defrule platPicant2 (cuina (plat p))3 (object (name p) (picant pi))4 =gt5 (print t picant pi crlf)6 )
Aixoacute es pot servir per crear condicions que facin servir noms drsquoinstancies que tenim almacenats a slotsdrsquoaltres instancies per exemple
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send v get-Preu) crlf)6 )
Aquesta regla imprimiria el preu del vi asociat al plat si es negre
356 Tengo problemas en condiciones de reglas con slots de instancias obtenidos con send
A veces dan problemas las reglas en las que las condiciones sobre los valores de los slots de una instanciase escriben usando mensajes get sobre los atributos de una instancia en lugar de utilizar patrones paraobtenerlos por ejemplo la regla
1 (defrule platcar2 plat lt- (object (is-a Plat) )3 (test (gt (send plat get-Preu) 30))4 =gt5 (print t (send plat get-nom) es car6 crlf)7 )
No funciona correctamente en CLIPS pero la regla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2559
22 Capiacutetulo 3 CLIPS
1 (defrule platcar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Siacute lo haceEn el caso de que el valor del slot sea booleano se puede escribir la regla como
1 (defrule platpicant2 plat lt- (object (is-a Plat) (Picant TRUE))3 =gt4 (print t (send plat get-nom) es picant crlf)
En el caso de que el slot sea a su vez una instancia se puede utilizar para obtener los valores de estainstancia en la condicion como se explica en la pregunta anterior
357 Tengo problemas con instancias obtenidas del slot de otra instancia en el patroacuten de unaregla
Este problema aparece cuando el patron de una regla instancia una variable a un nombre de instancia yesta no esta definida en el modulo de la regla por ejemplo si la regla siguiente pertenece a un modulo queno es el de la instancia
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4
=gt5 (print t preu (send v get-Preu) crlf)6 )
La regla se quejaraacute de que la instancia no existe al enviarle el send ya que solo se busca la instancia dentrodel moacutedulo de la regla y no en los importados Para arreglar esto se puede usar la funcioacuten (instance-address[ltMODULOgt|] ltINSTANCIAgt) que busca la direccion de la instancia en un modulo concreto o en todos losmoacutedulos que se importan () Deberiacuteamos entonces escribir la regla
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send (instance-address v) get-Preu) crlf)6 )
358 iquestCoacutemo realizar una buacutesqueda de instancias que cumplan unas restricciones
CLIPS nos ofrece varias funciones de buacutesqueda de instancias que cumplan unas determinadas restriccionesque a nosotros nos interese
La funcioacuten find-instance Esta funcioacuten devuelve la primera instancia que cumple todas las restric-ciones indicadas
La funcioacuten find-all-instances Esta funcioacuten devuelve todas las instancias que cumplen las restric-ciones indicadas
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2659
35 Las clasesinstancias 23
La sintaxis de ambas funciones es igual exceptuando el nombre de la funcioacuten(find-all-instances (clase_instancias) (restricciones))A continuacioacuten se muestran varios ejemplos
(bind rectangulos (find-all-instances ((inst Rectangulo)) (gtinstaltura 10))) Des-pueacutes de ejecutar esta funcioacuten en la variable rectangulos habraacute una lista con todas las instancias de la
clase Rectangulo cuya altura sea superior a 10(bind rectangulos (find-all-instances ((inst Rectangulo)) (and (gtinstaltura 10) (=instanchura 7)))) Este trozo de coacutedigo hace que en la variable rectangulos se guarde una listade las instancias de la clase Rectangulo que tienen una altura superior a 10 y una anchura igual a 7
Estas funciones que CLIPS nos ofrece tienen otra funcionalidad y es que podemos realizar buacutesquedas deconjuntos de instancias
(bind rectangulos (find-all-instances ((a Rectangulo) (b Rectangulo)) (= aalturabaltura))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas de instancias de laclase Rectangulo que tienen la misma altura
Por uacuteltimo es necesario comentar que se pueden realizar buacutesquedas de conjuntos de instancias que seande distintas clases
(bind figuras (find-all-instances ((rect Rectangulo) (circ Circulo)) (= rectalturacircradio))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas ltrectangulocirculogtque cumplan que la altura del rectaacutengulo sea igual al radio del ciacuterculo
Existen maacutes comandos para obtener instancias pero son menos utilizadas a nivel baacutesico como pueden serany-instancep do-for-instance do-for-all-instances y delayed-do-for-all-instances
359 iquestCoacutemo se interactuacutea con objetos
La interaccioacuten con objetos se efectuacutea mediante lo que se denomina mensaje
(defmessage-handlerltnombre-clasegtltnombre-mensajegt[lttipo-handlergt] [ltcomentariogt]ltparaacutemetrogt [ltparaacutemetro-comodiacutengt])ltaccioacutengt
)
Un gestor de mensajes consta de 7 partes
1 Nombre de clase a la que el gestor estaraacute asociado
2 Nombre del mensaje
3 Tipo de gestor (Nosotros habitualmente usaremos primary que viene por defecto)
4 Comentario (opcional)
5 Lista de paraacutemetros6 Paraacutemetro comodiacuten (para gestionar muacuteltiples paraacutemetros)
7 Secuencia de acciones o expresiones que seraacuten ejecutadas por el gestor
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2759
24 Capiacutetulo 3 CLIPS
Enfocado a la praacutectica de CLIPS la maacutes comuacuten es que queramos interactuar con objetos para
1 Imprimir los objetos Un ejemplo
1 (defmessage-handler avion imprimir-beneficio ()
2 Para implementar funciones calculadas asociadas al objeto Un ejemplo
1 (defmessage-handler avion calcular-beneficio ()2 ( selfplazas-ocupadas selfprecio-billete))3 )
Como se puede observar el paraacutemetro impliacutecito self contiene la instancia activa para este mensaje
3510 iquestComo se interactuacutea con las instancias de los objetos
Podremos interactuar entre las instancias de los objetos mediante la funcioacuten send
(send ltexpresioacuten-de-objetogtltnombre-de-mensajegtltexpresioacutengt)Donde se toman como argumentos el objeto destino del mensaje el mensaje mismo y otros paraacutemetros
que debieran ser pasados a los gestoresParticularmente en el aacutembito de la praacutectica usualmente necesitaremos utilizar el envioacute de mensajes de
tipo get put and delete Estos mensajes tiene la siguiente sintaxis
get-ltnombre-atributogt
put-ltnombre-atributogt
delete
Aquiacute tenemos un ejemplo de como utilizarlo recordando que ponemos entre corchetes la instancia la cualse enviacutea el mensaje
(defclass avion (is-a USER)(role concrete)(slot precio-billete (create-accessor read) (default 34))(slot plazas-ocupadas (create-accessor write) (default 0)))
Clase creada
gt(make-instance a of avion) Creacioacuten de una instancia de avion[a]
gt(send [a] get-precio-billete) Obtencioacuten de un slot34 Resultado obtenidogt(send [a] put-plazas-ocupadas 100) Modificacioacuten de un slotgt(send [a] delete) Eliminacioacuten de la instanciaTrue
3511 Uso de make-instance
Cuando queremos crear una instancia de una clase para ir rellenandola con los resultados o datos quevayamos obteniendo se haria lo siguiente
(bind variable_instancia (make-instance nombre_instancia of nombre_clase))
Una vez creada podemos jugar con dicha instancia en las diferentes reglas siempre que la llamemos enlos activadores
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2859
35 Las clasesinstancias 25
(defrule reglavar_instancia lt- (object (is-a nombre_clase))=gt
)
De esta manera dentro de la regla podemos hacer acciones con la instancia por ejemplo(send var_instancia put-articulo articulo_ejemplo)
3512 Como generar automaacuteticamente nombres de instancia
En ocasiones queremos crear instancias en reglas y queremos que su nombre sea distinto del de otrasque ya tenemos Para ello podemos utilizar las funciones gensym y gensym La primera genera un siacutembolodel estilo genN donde N es un nuacutemero La segunda hace lo mismo pero aseguraacutendose de que ese siacutembolono exista ya Se puede reiniciar el contador que usan estas dos funciones con el operador (setgen ltnumgt)donde ltnumgt es el nuacutemero por el que queremos que empiecen ahora los siacutembolos
Para usar esto para generar el nombre de una instancia podemos hacer
(make-instance (gensym) of ltclasegt)
Cada vez que se ejecute se generaraacute un nombre de instancia nuevoSi creamos instancias de diferentes clases y queremos que las instancias tengan nombres que podamos
identificar podemos concatenar siacutembolos a los siacutembolos generados por gensym por ejemplo
(make-instance (sym-cat pepe- (gensym)) of ltclasegt)
generaraacute una instancia con el nombre pepe-genN
3513 Com fer un getset drsquoun slot drsquouna classe
Per consultar el valor drsquoun slot drsquouna classe ho podem fer enviant-li un missatge de la seguumlent manera
(send ltVARIABLEgt get-ltNOM_ATRIBUTgt)
Per exemple si tenim una instagravencia de la classe Plat ( instancia ) i volem saber el valor del seu slotnom
(send instancia get-nom)
Per assignar un valor a un slot drsquouna drsquoinstagravencia hem drsquoenviar-li un missatge de la seguumlent manera
(send ltVARIABLEgt put-ltNOM_ATRIBUTgt ltVALORgt)On ltVALORgt pot ser un valor o un megravetode que retorni un valor
(send instancia put-nom nom)
3514 iquestCoacutemo acceder a una instancia cuyo nombre conocemos
Si conocemos el nombre de una instancia y necesitamos acceder a ella es decir necesitamos enviarle alguacutenmensaje mediante la funcioacuten send podemos hacerlo directamente escribiendo en lugar de la variable quealmacena la instancia el nombre de la instancia entre corchetes [ ] A continuacioacuten se muestra un ejemplo
(bind altura_rect1 (send [rect1] get-altura))
En este caso se guardaraacute en la variable altura_rect1 el valor de la altura de la instancia que tiene comonombre rect1
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2959
26 Capiacutetulo 3 CLIPS
3515 Obtenir el nom drsquouna classe
Si tenim una instagravencia drsquouna classe i volem saber el nom de la classe (uacutetil si tenim una bona taxonomiade classes) ho podem fer amb el megravetode (class ltINSTANCIAgt)
Si per exemple imaginem que tenim la classe Actor la qual teacute com subclasses la classe APrincipalASecundari i ACameo Imaginem que estem tractant amb instancies drsquoactors i volem saber si la instanciaque estem tractant es de la classe APrincipal
Ho hauriacuteem de fer de la seguumlent manera
(eq (class instancia) APrincipal)
Fixem-nos que APrincipal eacutes un siacutembol no un String (un truco eacutes fixar-se en que no teacute cometes) Si vol-gueacutessim comparar-ho amb un String (per exemple un String introduiumlt per lrsquousuari) ho podriacuteem transformara un String amb el megravetode str-cat
(eq (str-cat (class instancia)) Principal)
3516 Como convierto un INSTANCE-ADRESS en un INSTANCE-NAME
En alguacuten momento nos podemos encontrar con la situacioacuten de que disponemos de un puntero a unainstancia y necesitamos su nombre o lo contrario En ambos casos podemos usar la funcioacuten instance-nameSu funcionamiento es bidireccional podemos introducirle un instance-name y nos devolveraacute un instance-adress y viceversa
1 (defrule imprimir-nombre2 estlt-(object (is-a Estudiante) (edad 25))3 =gt4 (printout t (instance-name est) crlf)5
)
3517 Com iterar a traveacutes drsquoun multi-slot
El seguumlent tambeacute eacutes vagravelid com exemple de com iterar a traveacutes drsquouna llistaImaginem que tenim una instagravencia de la classe Plat a la varible (plat) la qual teacute un multi-slot drsquoinstagravencies
de la classe Ingredient Imaginem que volem imprimir per pantalla el nom drsquoaquests ingredients (slot nomde la classe Ingredient) Necessitarem iterar sobre la llista drsquoingredients
1 (bind i 1)2 (while (lt= i (length$ (send plat get-ingredients)))3 do4 (bind ingredient (nth$ i (send plat get-ingredients)))5 (printout t (send ingredient get-nom) crlf)6 (bind i (+ i 1))7 )
El megravetode (nth$ ltINDEXgtltLLISTAgt) et retorna lrsquoelement situat a INDEX de LLISTAEl megravetode (length$ ltLLISTAgt) retorna el nuacutemero drsquoelements de LLISTA
3518 Coacutemo modificarinsertarborrar valores en un multislot
Los valores de un multislot se pueden cambiar usando la funcioacuten slot-replace$ La sintaxis es la siguiente
(slot-replace$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt ltvalorgt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3059
35 Las clasesinstancias 27
Donde ltiniciogt y ltfingt son el rango de posiciones del multislot que se quiere modificar y ltvalorgtson los valores que queremos reemplazar Obviamente deberaacute haber tantos valores como posiciones hayamosindicado en el rango
Para insertar nuevos valores podemos usar la funcioacuten slot-insert$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltposgt ltvalorgt)
El valor se inserta delante de la posicioacuten indicada si la posicioacuten es mayor que la longitud del multislot secolocaraacute al final
Para borrar elementos de un multislot podemos usar la funcioacuten slot-delete$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt)
Se borraraacuten los elementos que estaacuten en el rango indicado
3519 Coacutemo recorrer un atributo multievaluado
Supongamos que la variable respuesta tiene una lista de instancias
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 aquiacute hacemos lo que queramos4 )5 )
Loop-for-count funciona como un for primero la variable que haraacute de contador luego el valor de origeny luego el valor final Para controlar el final usamos la funcioacuten que he explicado antes i tomaraacute valoresdesde 1 hasta n asiacute que usando la funcioacuten nth$ obtendremos cada uno de los elementos La variable auxiraacute teniendo cada uno de los valores
3520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz)
Es igual que antes pero con dos bucles
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 (bind aux2 (send aux get-slot_que_queremos))4 (loop-for-count (j 1 (length$ aux2)) do5 (bind aux_final (nth$ j aux2))6 aquiacute ya podemos trabajar con el elemento en concreto7 )8 )
Supongamos que respuesta tiene una lista de instancias con el primer bucle haremos lo mismo que antes ir
iterando por esas instancias Una vez que tenemos cada instancia con aux2 con el segundo bucle iteraremosdentro de sus instancias interiores
Por ejemplo si tenemos varios equipos de fuacutetbol y cada equipo tiene varios jugadores en el primer bucleestamos iterando entre los equipos y en el segundo entre los jugadores de cada equipo en particular
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3159
28 Capiacutetulo 3 CLIPS
3521 Com puc esborrar una instagravencia
Per esborrar una instagravencia (per exemple segons la informacioacute que proporcioni lrsquousuari podem deduir queuna segraverie drsquoinstagravencies eacutes impossible que es facin servir per a la solucioacute) ho podem fer enviant un missatgedelete a la instagravencia eacutes a dir (send ltINSTANCIAgtdelete)
(send inst delete)
Un megravetode que podria ser uacutetil de la cara a la pragravectica podria ser el seguumlent
1 (defrule elimina-instancia2 (declare (salience 10))3 elimina-fact lt- (elimina-inst inst)4 =gt5 (send inst delete)6 (retract elimina-fact)
Imaginem que per exemple que volem eliminar una llista drsquoinstagravencies Per eliminar-les podriacuteem recoacuterrerel llistat marcant les instagravencies que volem esborrar afegint el seguumlent fet
(assert (elimina-instancia inst))
Aixiacute com que elimina-instancia teacute un salience alt esborraria les instagravencies marcades quan tingueacutes ocasioacuteDrsquoaquesta manera ens estalviem el problema de recoacuterrer un llistat drsquoinstagravencies amb un iterador mentre
anem eliminant els elements de la llista cosa que pot donar problemes amb lrsquoiterador
3522 Com imprimir una instagravencia
Per imprimir una classe (uacutetil per exemple per mostrar el resultat final) el millor eacutes definir message-handlersPer exemple imaginem que tenim una classe Plat la qual teacute un slot nom de tipus String Si volgueacutessimimprimir per pantalla un missatge que digueacutes
El nom del plat eacutes ndashltnom del platgtndash
Hauriacuteem de definir un message-handler que simplement imprimiacutes per pantalla el valor de lrsquoslot de laforma
(defmesssage-handler ltCLASSNAMEgt ltMESSAGENAMEgt primary ()ltCODIgt
)
Per el cas de lrsquoexemple
1 (defmessage-handler Plat print primary ()2 (printout t -- selfnom --) )3 )
Per cridar-ho nomeacutes caldragrave enviar-li un missatge a la instagravencia amb el nom del message-handler (enaquest cas print)
(send instancia print)
Un message-handler pot cridar a altres message-handlers amb el que es poden encadenar diverses instagraven-cies Per exemple imaginem que tenim la classe Menuacute la qual teacute un atribut plats que eacutes un llista drsquoinstagravenciesde la classe Plat Dintre del message-handler menuacute podriacuteem iterar a traveacutes de la llista de plats enviant elmissatge print que hem definit anteriorment
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3259
36 Programacioacuten 29
3523 Com es navega entre instagravencies relacionades
Per exemple tinc una instagravencia iA que teacute un slot anomenat slotB que eacutes una instagravencia drsquoun frame B Vullsaber el nom de la instagravencia associada al slotB de iA Ho pots fer aixiacute
(bind B (send iA get-slotB))(bind res (send B get-nom))
Si estagraves dins drsquouna condicioacute ho pots simplificar de la forma seguumlent
(bind res (send iAslotB get-nom)
Els dos punts soacuten equivalents al punt de Java
36 Programacioacuten
361 Com introduir un comentari
Els comentaris a CLIPS va darrere de un com per exemple
Comentari
Tambeacute podem afegir comentaris a les nostres regles deffacts deftemplates etc Generalment van darrereel nom de la estructura per exemple
1 (defrule neteja regla per la qual si la cuina estagrave bruta srsquoafegiragrave una tasca de2 neteja
3 (estat-cuina bruta)4 =gt5 (assert (tasca netejar))6 )
362 Referenciar el valor null a CLIPS
Per referenciar el valor null a clips es fa amb el simbol nil Per exemple si volem saber si una instagravenciainst es null ho podriacuteem fer de la seguumlent manera
(eq inst nil)
363 Formas de recorrer una lista
Para recorrer una lista disponemos de diferentes opciones en este FAQ explicaremos como crear unaestructura tipo ldquoWHILErdquo y tipo ldquoFORrdquo
1 While Esta regla se ejecuta hasta que la expresioacuten a evaluar sea falsa Este tipo de estructura se rigepor seguir la sintaxis while - do y se construiriacutea de la siguiente forma
(while ltexpresioacutengt[do] ltaccioacutengt)
Doacutende dependiendo del valor de ltexpresioacutengt
Valor TRUE Se realizaraacute la accioacuten ltaccioacutengt i se volveraacute a evaluar ltexpresioacutengt
Valor FALSE No se ejecutaraacute la accioacuten ltaccioacutengt
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3359
30 Capiacutetulo 3 CLIPS
2 For Esta regla sirve para ejecutar un bucle N (final - inicio) veces Este tipo de estructura se rige porseguir la sintaxis loop-for-count y se construiriacutea de la siguiente forma
(loop-for-count (ltvargtltiniciogtltfinalgt) [do] ltaccioacutengt)
Doacutende
ltvargt Variable que se usara como iacutendice
ltiniciogt Valor inicial que tendraacute ltvargt
ltfinalgt Ultimo valor que tendraacute la variable ltvargt
ltaccioacutengt Accioacuten que es realizaraacute hasta que ltvargt tenga el valor de ltfingt
364 Formas de elegir una opcioacuten
En este apartado explicaremos como crear una estructura if y una estructura switch
If Este tipo de estructura se rige por seguir la sintaxis if - then - else y se construiriacutea de lasiguiente forma
(if ltexpresioacutengtthen ltaccioacutengt[else ltaccioacuten2gt])
Doacutende dependiendo del valor de ltexpresioacutengt
bull Valor TRUE Se realizaraacute la accioacuten ltaccioacutengtbull Valor FALSE Se realizaraacute la accioacuten ltaccioacuten2gt (en caso de haber)
Switch Este tipo de estructura se rige por seguir la sintaxis switch - opciones y se construiriacutea dela siguiente forma
(switch ltexpresioacuten-testgt(case OPCION1 then ACCION1)(case OPCION2 then ACCION2)
([default] ACCION-DEFAULT)
)
Doacutende dependiendo del valor de ltexpresioacuten-casegt se ejecutaraacute una ltaccioacutengt en particular Si nin-guna ltopcioacutengt es correcta se ejecutara la ltaccioacuten-defaultgt
365 Funciones con la clase String
Habitualmente trabajaremos con Strings o cadena de Strings CLIPS proporciona una serie de herramien-tas para trabajar con esta clase
1 Convertir string a MAYUacuteSCULAS A veces es conveniente tener todos los caracteres en mayuacutesculaspara no tener problemas de comparaciones o simplemente por convenio Para ello CLIPS dispone dela funcioacuten upcase la cual convierte a mayuacutesculas un siacutembolo o string
(upcase ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplos
(upcase Ccedillips es divertido) rarr CcedilLIPS ES DIVERTIDO
(upcase Clips_es_divertido) rarr CLIPS_ES_DIVERTIDO
2 Convertir string a MINUacuteSCULAS la funcioacuten es downcase
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3459
36 Programacioacuten 31
3 Concatenacioacuten de strings Tambieacuten es de gran utilidad poder juntar dos o maacutes paraacutemetros en un solostring Todo paraacutemetro a juntar deben ser de uno de los siguientes tipos symbol String integer floato instance-name
(str-cat parametro1 parametro2 parametroN )
Ejemplo
(str-cat IA nota 10) rarr IAnota10
4 Comparacioacuten de strings Funcioacuten que nos indica si dos strings son iguales
(str-compareltexpresioacuten-simboacutelica-o-de-cadenagtltexpresioacuten-simboacutelica-o-de-cadenagt
)
Esta funcioacuten devuelve
0 Si ambos strings son iguales1 Si el primer string es mayor que el segundo string-1 Si el primer string es menor que el segundo string
5 Longitud de un string Muchas veces es de gran utilidad saber que tamantildeo tiene un string
(str-length ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplo
(str-length Inteligencia Artificial) rarr 23
366 iquestCoacutemo obtener el contenido de una variable en un string
Para conseguir un string a partir de un integer float symbol instance-name debes utilizar el comandostr-cat Si a la funcioacuten le pasamos como paraacutemetros varios elementos los transformaraacute a string y losconcatenaraacute La sintaxis de esta funcioacuten es la siguiente (str-cat elementos) Esta funcioacuten la usaremossobre todo cuando queramos realizar comparaciones entre el contenido de una variable y un string ya quepreviamente necesitaremos usar la funcioacuten str-cat para pasar el contenido de la variable a string y realizarde este modo la comparacioacuten de forma correcta
367 iquestComo se crea una lista
Con create$ Todos los operadores sobre listas llevan el siacutembolo $ al final Igual que con las variables sedebe usar bind siempre que se desee modificar una lista
(bind lista (create$ a b c))
368 iquestComo borro un elemento de una lista
Con delete$Usa la siguiente sintaxis(delete$ ltlistagt ltindice-iniciogt ltindice-finalgt)Se borraraacuten todos los elementos del rango entre las posiciones inicio y final ambas incluidas Tambieacuten exis-
tedelete-member$ (delete-member$ ltlistagt ltelementogt) Borraraacute todas las apariciones del elemento enla lista
(delete$ (create$ a b c d e f) 3 5) minusrarr (a b f)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1559
12 Capiacutetulo 3 CLIPS
I hagueacutessim afegit el fet
(assert (persona (nom Pepe)(edad 25)(dni 46974431)))
I el fet
(assert (aniversari 46974431))
Podriacuteem tenir la seguumlent regla
1 (defrule aniv2 aniversari lt- (aniversari dni)3 persona lt- (persona (edat edat)(dni dni))4 =gt5 (retract aniversari)6 (modify persona (edat (+ 1 edat)))7 )
La qual srsquoactivaragrave si hi ha un fet aniversari drsquouna persona Fent servir el dni indicat al fet aniversaribusquem el fet persona que teacute el mateix dni Deixem el valor edat a la variable edat per poder treballaramb ella meacutes endavant
Hem agafat tambeacute la direccioacute del fet aniversari per tal de poder esborrar-lo de la base de fets Aixograve srsquohafet per dues raons
Primer per mantenir meacutes neta la base de fets Segon i meacutes important Com que hem canviat el fet laregla tornaragrave a fer unificacioacute amb el fet (perquegrave ara eacutes diferent) amb la regla aniversari amb el que entrariadintre drsquoun bucle sense fi on srsquoaniria incrementant lrsquoedat de la persona
Un cop hem esborrat el fet aniversari incrementem en 1 el valor del slot edat de la persona fent servirla variable edat que hem declarat a la part esquerre de la regla
El comportament de modify es fer un retract del fet a la base de fets i despreacutes fer un assert amb els nous
valors Si volem canviar mes drsquoun slot del fet es convenient canviar-los tots a la vegada La raoacute es que cadavegada que fem un modify lrsquoapuntador al fet es modifica i lrsquoapuntador que tenim a la variable que hem fetservir ja no es vagravelid
Si no temim mes remei que fer la modificacioacute del fet pas a pas srsquoha de saber que la crida a modify retornalrsquoapuntador al nou fet Si el guardem a altra variable (o a la mateixa) podrem continuar modificant el fetamb la nova referegravencia
3210 Com elimino un fet de la base de fets
Per eliminar un fet de la base de fets ho podem fer amb la paraula clau (retract ltFETgt) on ltFETgt eacutes
un punter al fetPer obtenir aquest fet ho podem fer fent servir ltVARgtlt- ltFETgt a la part esquerre de la reglaPer exemple
1 (defrule accionsvent2 vent lt- (vent tipus)3 =gt4 (switch tipus5 (case poc then (assert (accio persiana0)))6 (case normal then (assert (accio persiana50)))7 (case molt then (assert (accio persiana100)))8 )9 (retract vent)
10 )
Afegiragrave fets per realitzar les accions pertinents i esborraragrave el fet de la base de fets
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1659
33 Variables 13
33 Variables
331 Variables a CLIPS
No cal declarar una variable (ni el seu tipus) nomeacutes cal afegir un interrogant al comenccedilament drsquoun simbol
per indicar que eacutes una variableCLIPS srsquoencarrega del control de tipus depenent del que assignem a la variablePer exemple testvar correspondria a la variable testvar Si per exemple assigneacutessim lrsquoenter 3 a
testvar CLIPS tractaria la variable com una variable entera
332 Com assignar un valor a una variable
Per assignar un valor a una variable es fa servir el megravetode (bind) amb la forma
(bind ltVARIABLEgtltVALORgt)
On ltVALORgt pot ser un valor o un megravetode que retorni un valor Per exemple si volem assignar un 4 a lavariable var
(bind var 4)
O per exemple podriacuteem assignar a la variable var la suma de 2 meacutes 2
(bind var (+ 2 2))
333 iquestCoacutemo declarar variables globales
Para crear una variable global hay que meterla dentro de la construccioacuten defglobal La declaracioacuten de la
variable seguiraacute el modelo nombreVariable = expresioacutenPor ejemplo
(defglobal presupuesto = 0)
Pueden aparecer en la parte izquierda de las reglas si no son utilizadas para asignar un valor y su cambiono activa reglas pero no pueden ser paraacutemetros de funciones ni meacutetodos
334 iquestCoacutemo trabajar con variables sumando restando por ejemplo contadores
La mejor forma es con variables globales se definen asiacute (defglobal x = 0) puede ser el valor quequeramos tanto nuacutemero string Y si queremos sumarle 10 por ejemplo
(bind x (+ x 10))
Las variables locales como por ejemplo x soacutelo tienen valor mientras dura su ejecucioacuten y eso suele ser enesa misma liacutenea o en un bucle Si le damos valor a x y luego preguntamos por ella nos diraacute que no existe
335 Quina diferegravencia hi ha entre les variables del tipus nom_variable i les del tipus $nom_variable
Les primeres contenen un sol valor i les segones en poder contenir meacutes drsquoun (o cap)
336 Quegrave significa lrsquointerrogant () quan va sol
Eacutes una variable anogravenima Pots utilitzar sense posar-hi cap nom si no trsquointeressa el valor en concret Perexemple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1759
14 Capiacutetulo 3 CLIPS
(Primer filtre_preu )
Aquesta condicioacute significa ldquosi el fet (Primer filtre_preu) teacute algun valorrdquo O sigui que si tingueacutessimel fet (Primer filtre_preu ok) es compliria la condicioacute (i si en comptes de ldquookrdquo fos ldquopatatardquo tambeacute escompliria) En canvi si el fet fos uacutenicament (Primer filtre_preu) no es compliria la condicioacute
337 Quegrave significa el dogravelar ($) quan va sol
Eacutes com lrsquointerrogant perograve admet meacutes drsquoun valor Per exemple
(Primer filtre_preu $ ok)
donaragrave cert pels fets de lrsquoestil (Primer filtre_preu patata ok) (Primer filtre_preu hola ok)(Primer filtre_preu patata hola ok) (Primer filtre_preu ok) Eacutes a dir no importa els valors quehi hagi entre filtre_preu i ok si al final hi ha un ok
338 iquestComo puedo ver los hechos presentes en un momento determinado
Abriendo la Facts Window en Window de la barra de menuacute
34 Las reglas
341 iquestCoacutemo construir una regla
Para construir una regla utilizaremos la construccioacuten defrule
Sintaxis
(defrule ltnombre-reglagt [ltcomentariogt][ltdeclaracioacutengt]ltelemento-condicioacutengt Parte izquierda (LHS)
=gtltaccioacutengt) Parte dcha (RHS) de la regla
Una regla consta de un conjunto de condiciones (antecedente) tambieacuten denominados elementos condicio-nales (EC) o parte izquierda (LHS) y de un conjunto de acciones (consecuente) tambieacuten denominado partederecha de la regla (RHS) La regla se activaraacute siempre que se satisfagan todos los EC mediante hechos oinstancias que los cumplan
Si se introduce en la base de reglas una nueva regla con el mismo nombre que el de una existente la nuevaregla reemplazaraacute a la antigua
Si una regla no tiene parte izquierda es decir no tiene elementos condicionales entonces el hecho(initial-fact) actuaraacute como el elemento condicional para ese tipo de reglas y la regla se activaraacute cadavez que se ejecute un comando reset
342 iquestCoacutemo gestionar la parte izquierda (LHS) de una regla
Declarar hechosSi no se especifica ninguna condicioacuten la regla se activaraacute siempre Una condicioacuten puede ser un simple hecho
(Ej vegetariano) o un hecho ordenado con unos valores concretos (Ej (persona (nombre Juan))) Si loque queremos es obtener el valor de un hecho insertaremos una variable en su lugar (Ej (persona (nombre
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1859
34 Las reglas 15
n)) ) Entonces entraraacute en la regla para cada valor posible que pueda asignar a la variable n a partir delos hechos
Si queremos indicar cualquier valor utilizaremos el siacutembolo y para cualquier lista el siacutembolo $ (Ej(evento ) (estilo $) ) Tambieacuten existe la opcioacuten de guardar en una variable una referencia al objetoEllo se consigue poniendo var lt- a su izquierda (Ej p lt- (persona (nombre Juan))) Se puede usarpor ejemplo para pasaacuterselo de paraacutemetro a una funcioacuten llamada en la RHS
Establecer condiciones
Ademaacutes podemos especificar restricciones adicionales sobre los valores que puede tomar un campo de unhecho Existen tres tipos principales de restricciones Conectadas (por orden de precedencia o prioridad)
not (~) Evita que cierto campo cumpla determinada restriccioacuten
and (amp) Combina dos restricciones conjuntivamente
or (|) Combina dos restricciones disjuntivamente
De predicado () Obliga a que cierto campo cumpla determinada condicioacuten (especificada por el predicado)
Por valor devuelto por una funcioacuten = Permite llamar a una funcioacuten y utilizar el valor devuelto pararestringir el valor que pueda tomar un campo de un hecho
Se puede comprobar si se cumple una determinada condicioacuten mediante el constructor test Dentro detest se pueden hacer llamadas a cualquier funcioacuten o predicado ya sea primitiva de CLIPS o definidapor nosotros
Combinar elementos
Los diferentes elementos de la parte izquierda van impliacutecitamente unidos mediante una AND que indicaconjuncioacuten No obstante podemos hacerlo expliacutecitamente mediante (and (cond1) (cond2)) aunque suelen
utilizarse para anidar ANDs dentro de ORsOR Sirve para hacer una disyuncioacuten (or (cond1) (cond2)) Es equivalente a escribir varias reglas en lasque cada una de ellas tenga uno de los componentes del OR en su parte izquierda y la misma parte derecha
NOT Sirve para detectar si no existe un determinado hecho (Ej (not (estilo sibarita)))exists Cuando a un conjunto de elementos se le antecede exists se comprueba que hay al menos un
hecho en la base de hechos que cumpla la condicioacuten (Ej (exists(bebida precio (ltprecio 5))) )forall Permite comprobar si todos los hechos que satisfacen un determinado patroacuten cumplen una serie
de condiciones (Ej (forall(plato (estilo moderno)))
343 iquestCoacutemo obtener la direccioacuten de hechos o instancias situados en LHS
En algunas ocasiones vamos a necesitar realizar alguacuten tipo de accioacuten en la parte derecha de las reglassobre hechos o instancias que cumplan unas determinadas condiciones Pero para ello necesitaremos primerotener acceso a estos elementos para despueacutes poder operar sobre ellos Esto lo conseguiremos guardando ladireccioacuten del elemento en una variable hacieacutendolo del siguiente modo
variable_direccion lt- (elemento)
Pongamos un ejemplo para ver realmente el funcionamiento y uso de esta posibilidad que CLIPS nosofrece
1 (defrule imprime-area2 instancia lt- (object (is-a Rectangulo))3 =gt4 (printout t Area del rectangulo (instance-name instancia)5 (send instancia calcula-area) crlf)6 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1959
16 Capiacutetulo 3 CLIPS
Cuando se ejecuta esta regla se imprimiraacuten las aacutereas de todas las instancias de la clase Rectangulo Enla parte izquierda de la regla lo que hacemos es guardar en la variable instancia la direccioacuten de la instanciade Rectangulo que estamos tratando en ese momento La regla se ejecutaraacute para todas las instanciasalmacenadas en la memoria de trabajo que cumplan la condicioacuten (is-a Rectangulo) es decir para todaslas instancias de la clase Rectangulo En la parte derecha de la regla donde se ejecutan las acciones podemosver que se imprimiraacute para cada instancia lo siguiente Area del rectangulo [nombre_instancia] aacuterea
del rectaacutengulo La funcioacuten instance-name nos devuelve el nombre de la instancia que le pasamos porparaacutemetro Ademaacutes hemos llamado al gestor de mensajes calcula-area para que nos devuelva el area delrectaacutengulo
344 iquestCoacutemo hacer sentencias or en la izquierda de las reglas
Con (or ) Si por ejemplo tenemos dos hechos (a) y (b) y queremos ejecutar la derecha de la reglacuando se cumpla uno de los dos tendremos que hacer (or (a) (b)) Atencioacuten porque la parte derecha seejecutaraacute tantas veces como veces se cumpla cada uno de los hechos si para nosotros existe tanto (a) como(b) la parte derecha se ejecutaraacute dos veces Para que soacutelo se usa una vez podemos hacer combinaciones de
or y and (funciona igual) o usar un patroacuten por ejemplo (persona Juan|Pedro) soacutelo se ejecutariacutea una vez
345 Com afegir una condicioacute a la part esquerre drsquouna regla
A vegades eacutes necessari que una regla srsquoinstanciiuml si es produeix una condicioacute especial (i no un fet) Per feraixoacute farem servir la comanda (test ltCONDICIOgt)
Per exemple imaginem que la nostre base de fets compte amb un fet (preu valor) amb un preudeterminat Imaginem que volem una regla que srsquoinstanciiuml quan aquest valor eacutes meacutes gran que 30
Per fer-ho fent servir tot el que hem explicat
1 (defrule preucar2 (preu preu)3 (test (gt preu 30))4 =gt5 (printout t El preu es mes gran que 30)6 )
Eacutes a dir si el preu eacutes meacutes gran que 30 srsquoimprimiragrave un missatge per pantallaAquestes condicions poden contenir ANDs i ORs de varies condicionsPer exemple
1 (defrule preulimit2 (preu preu)3 factminim lt- (preuminim minim)4 factmax lt- (preumaxim maxim)5 (test (and (gt preu minim) (lt preu maxim) ))6 =gt7 (retract factminim)8 (retract factmax)9 (printout t El preu estagrave dintre del rang)
On comprovarem si el preu estagrave dintre drsquoun rang determinat i en aquest cas esborra els fets que contenen
el magravexim preu i el miacutenim preu i mostra un missatge per pantalla
346 Puede una misma regla ejecutarse maacutes de una vez
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2059
34 Las reglas 17
Es muy importante entender que cada regla se ejecutaraacute una vez por cada combinacioacuten de valores en suLHS
1 (defrule regla2 (color col)3 (peso pes)4 =gt5
Si tengo tres colores y dos pesos asertados la regla se ejecutaraacute 6 veces una con cada combinacioacuten decolor y peso
347 Com puc definir lrsquoordre de les regles
La idea drsquoun sistema basant en regles eacutes no definir un ordre lineal drsquoaquestes (costa deixar de pensar de
forma iterativa)En el cas de necessitar que una regla srsquoexecuti despreacutes drsquouna altre pots fer servir Fets la regla anteriorcrea un fet que la segona regla tindragrave a la part esquerra
1 (defrule pregunta12 =gt3 (assert (pregunta1Feta))4 5 )6
7 (defrule pregunta2
8 (pregunta1Feta)9 =gt
10 11 )
I finalment pots usar la propietat salience Aquesta propietat indica la prioritat drsquoexecucioacute de les regles( les regles amb salience majors srsquoexecutaran abans ) Pot prendre valors positius i negatius entre -10000 y+10000 Per defecte les regles tenen salience 0
1 (defrule pregunta12 (declare (salience 2))3 =gt4 5 )6
7 (defrule pregunta28 (declare (salience 1))9 =gt
10 11 )
El valor indicado en la propiedad salience puede ser el nuacutemero directamente o una expresioacuten por ejemplovariable10 podemos usar variable para elegir que regla se ejecutaraacute
Las prioridades deben ser usadas solo para determinar el orden en el que se disparan algunas reglas sobreotras no para fijar el flujo de control ya que la principal ventaja de un sistema basado en reglas es larepresentacioacuten declarativa del conocimiento y de esta forma abusando de las prioridades conduce a unsistema procedimental
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2159
18 Capiacutetulo 3 CLIPS
348 Com forccedilar que una regla sigui la primera
Per que aquesta regla sigui la primera ha de tenir el salience meacutes gran de totes
1 (defrule presentacio2 (declare (salience 20))3 =gt4 (printout t ------ Benvingut ----- crlf)5 )
349 Vull guardar certs valors que es fan servir durant lrsquoexecucioacute de diferents regles Com hopuc fer
Tens principalment dues alternatives Si el valor eacutes un tipus bagravesic pots fer servir una variable global ambla sintaxi seguumlent
(defglobal nom_variable = valor)
Aquesta sentegravencia no va a dins de cap funcioacute ni regla es posa sola a la part que creguis convenient delcodi Vegem un exemple
(defglobal preu_minim_primer = 1000)
Per fer-la servir es fa exactament de la mateixa manera que amb una variable normal perograve has de posarels dos asteriscs Per exemple
(bind preu_minim_primer curr-preu)
Per altra banda si el valor o valors que vols guardar han de ser instagravencies una bona estrategravegia pot serutilitzar un deftemplate Eacutes uacutetil sobretot per anar guardant solucions temporals o llistes drsquoelements quepoden formar part de la solucioacute
Per utilitzar-ho has de seguir els passos seguumlents
1 Definir el deftemplate
(deftemplate nom_del_deftemplate(multislot nom_multislot)
(slot nom_slot)
)
Amb un exemple es veuragrave meacutes clar
(deftemplate llista-plats(multislot primers)(multislot segons)(multislot postres)
)
2 Inicialitzar el deftemplate
(defrule[condicions vagraveries] La condicioacute base eacutes que llista-plats no srsquoha inicialitzat encara
(not (llista-plats))=gt
llista conteacute els valors de llista-plats (que de moment estan buits)(bind llista (assert (llista-plats)))
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2259
35 Las clasesinstancias 19
3 Assignar-li valors
(bind segons_plats (find-all-instances ((plat Plat)) TRUE)(modify llista (segons segons_plats))
4 Recuperar els valors
(defrule[condicions vagraveries]llista lt- (llista-plats (segons $segons_plats))
=gt
Ara la variable $segons_plats conteacute tots els elements de segons
35 Las clasesinstancias
351 Tengo que representar la jerarquiacutea de un frame iquestEs preferible antildeadir las subclases a laontologiacutea o bien diferenciarlas mediante un slot en la superclase
Las dos formas son vaacutelidas pero es recomendable representarlas en clases separadas cuando se vayan abuscar instancias de ese tipo ya que asiacute no tendremos que hacer un recorrido por todas las de la superclaseNo obstante si soacutelo se trata de una caracteriacutestica puntual del frame y no vamos a hacer buacutesquedas de unaexclusiva subclase entonces seraacute maacutes eficiente antildeadir un slot debido a su mejor accesibilidad
352 iquestQueacute es un objeto
Podriacuteamos decir que un objeto es un hecho no ordenado con herencia
353 iquestPorqueacute usar objetos en contexto de la praacutectica de CLIPS de IA
Como bien sabemos una parte de la praacutectica de SBCrsquos consisten en crear la ontologiacutea Esta ontologiacutease exporta para poder interactuar con CLIPS en formato pins y pont El archivo pont contendraacute ladeclaracioacuten de todas las clases creadas previamente por Protege (defclass ) El archivo pins contendraacute
todas las instancias de las clases declaradas en el archivo pont Como puede intuir el lector se necesitaraacuteinteractuar con los objetos previamente creados por Protegravegegrave
354 Como se definen las clases
Para definir las clases usaremos el constructor defclass
(defclass ltnombregt [ltcomentariogt](is-a ltnombre-de-superclasegt)[(role concrete | abstract)]
[(pattern-match reactive | non-reactive)]ltslotgt definicioacuten de los atributos de la clase
ltdocumentacioacuten-handlergt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2359
20 Capiacutetulo 3 CLIPS
En caso de desear que la nueva clase herede las propiedades de otra ya existente el nombre de esta deberaacuteespecificarse despues de is-a El rol determinaraacute si la clase es concreta (se puede instanciar) o abstracta(destinada a ser superclase) El pattern-match debe declararse como reactivo si se desea que las instanciasde la clase puedan unificar con los elementos objeto de las reglas (siacutembolo lt-) Los slots correspondena los atributos de la clase y los handlers a las funciones de eacutesta Los handlers se pueden declarar en ladeclaracioacuten de la propia clase pero se deben definir externamente Dado que no aporta ninguna ventaja
declararlos es recomendable definirlos directamente Noacutetese que todo aquello que estaacute entre corchetes ([])constituye informacioacuten adicional que no es obligatorio especificar
1 (defclass Persona2 (is-a Ser_Vivo)3 (role concrete)4 (single-slot edad5 (type INTEGER)6 (range 1 99)7 (cardinality 0 1)8 (create-accessor read-write)9 )
10 (multislot amigos11 (type INSTANCE)12 (allowed-classes Persona)13 )14 )
El comportamiento y declaracioacuten de los slots es ideacutentico al de los slots de los hechos ordenados Losatributos de tipo INSTANCE (referencian otras instancias) estan en formato INSTANCE-NAME
355 Com consulto una instagravencia a partir drsquouna regla
Podem fer servir la part esquerre drsquouna regla per trobar instagravencies Lrsquouacutes eacutes molt semblant a trobar elpunter a un fet fent servir
(object [(is-a ltNOM_CLASSEgt)|(name ltNOM_INSTANCIA)|(ltNOM-SLOTgt ltVALORVARIABLE))])
Per exemple si volem que una regla srsquoinstanciiuml si tenim instanciat un plat de la classe Plat podriem ferservir
1 (defrule tenimplat2 plat lt- (object (is-a Plat))3 =gt4 (print t (send plat get-nom) crlf)
La regla imprimiragrave el nom del plat que trobi Eacutes important notar que srsquoactivaragrave per cada instagravencia de platque tinguem a la base de coneixement
Podem consultar els valors de la instancia fent servir condicions a la part esquerre de la regla Per exemplesi nomeacutes volgueacutessim els plats amb un preu meacutes gran que 30
1 (defrule platCar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Srsquoactivaragrave per tots els plats amb un preu major a 30
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2459
35 Las clasesinstancias 21
Srsquoha drsquoanar amb cura per aquest tipus de regla ja que si la base de coneixement eacutes molt amplia pot acabarderivant amb problemes de memograveria
Per exemple si en comptes de preguntar per una instagravencia de Plat pregunteacutessim per dues instancies dePlat
1 (defrule platsCars2 plat1 lt- (object (is-a Plat) (Preu p1))3 plat2 lt- (object (is-a Plat) (Preu p2))4 (test (gt p1 30))5 (test (gt p2 30))6 =gt7 (print t (send plat1 get-nom) i (send plat1 get-nom) soacuten cars8 crlf)9 )
Faria unificacioacute amb totes les combinacions possibles (amb repeticions) de dos plats de tota la base deconeixement Aixograve es podria anar ampliant fins fer-se intractable
Si tenim drsquoalguna manera el nom de la instancia podem fer
1 (defrule platPicant2 (cuina (plat p))3 (object (name p) (picant pi))4 =gt5 (print t picant pi crlf)6 )
Aixoacute es pot servir per crear condicions que facin servir noms drsquoinstancies que tenim almacenats a slotsdrsquoaltres instancies per exemple
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send v get-Preu) crlf)6 )
Aquesta regla imprimiria el preu del vi asociat al plat si es negre
356 Tengo problemas en condiciones de reglas con slots de instancias obtenidos con send
A veces dan problemas las reglas en las que las condiciones sobre los valores de los slots de una instanciase escriben usando mensajes get sobre los atributos de una instancia en lugar de utilizar patrones paraobtenerlos por ejemplo la regla
1 (defrule platcar2 plat lt- (object (is-a Plat) )3 (test (gt (send plat get-Preu) 30))4 =gt5 (print t (send plat get-nom) es car6 crlf)7 )
No funciona correctamente en CLIPS pero la regla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2559
22 Capiacutetulo 3 CLIPS
1 (defrule platcar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Siacute lo haceEn el caso de que el valor del slot sea booleano se puede escribir la regla como
1 (defrule platpicant2 plat lt- (object (is-a Plat) (Picant TRUE))3 =gt4 (print t (send plat get-nom) es picant crlf)
En el caso de que el slot sea a su vez una instancia se puede utilizar para obtener los valores de estainstancia en la condicion como se explica en la pregunta anterior
357 Tengo problemas con instancias obtenidas del slot de otra instancia en el patroacuten de unaregla
Este problema aparece cuando el patron de una regla instancia una variable a un nombre de instancia yesta no esta definida en el modulo de la regla por ejemplo si la regla siguiente pertenece a un modulo queno es el de la instancia
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4
=gt5 (print t preu (send v get-Preu) crlf)6 )
La regla se quejaraacute de que la instancia no existe al enviarle el send ya que solo se busca la instancia dentrodel moacutedulo de la regla y no en los importados Para arreglar esto se puede usar la funcioacuten (instance-address[ltMODULOgt|] ltINSTANCIAgt) que busca la direccion de la instancia en un modulo concreto o en todos losmoacutedulos que se importan () Deberiacuteamos entonces escribir la regla
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send (instance-address v) get-Preu) crlf)6 )
358 iquestCoacutemo realizar una buacutesqueda de instancias que cumplan unas restricciones
CLIPS nos ofrece varias funciones de buacutesqueda de instancias que cumplan unas determinadas restriccionesque a nosotros nos interese
La funcioacuten find-instance Esta funcioacuten devuelve la primera instancia que cumple todas las restric-ciones indicadas
La funcioacuten find-all-instances Esta funcioacuten devuelve todas las instancias que cumplen las restric-ciones indicadas
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2659
35 Las clasesinstancias 23
La sintaxis de ambas funciones es igual exceptuando el nombre de la funcioacuten(find-all-instances (clase_instancias) (restricciones))A continuacioacuten se muestran varios ejemplos
(bind rectangulos (find-all-instances ((inst Rectangulo)) (gtinstaltura 10))) Des-pueacutes de ejecutar esta funcioacuten en la variable rectangulos habraacute una lista con todas las instancias de la
clase Rectangulo cuya altura sea superior a 10(bind rectangulos (find-all-instances ((inst Rectangulo)) (and (gtinstaltura 10) (=instanchura 7)))) Este trozo de coacutedigo hace que en la variable rectangulos se guarde una listade las instancias de la clase Rectangulo que tienen una altura superior a 10 y una anchura igual a 7
Estas funciones que CLIPS nos ofrece tienen otra funcionalidad y es que podemos realizar buacutesquedas deconjuntos de instancias
(bind rectangulos (find-all-instances ((a Rectangulo) (b Rectangulo)) (= aalturabaltura))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas de instancias de laclase Rectangulo que tienen la misma altura
Por uacuteltimo es necesario comentar que se pueden realizar buacutesquedas de conjuntos de instancias que seande distintas clases
(bind figuras (find-all-instances ((rect Rectangulo) (circ Circulo)) (= rectalturacircradio))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas ltrectangulocirculogtque cumplan que la altura del rectaacutengulo sea igual al radio del ciacuterculo
Existen maacutes comandos para obtener instancias pero son menos utilizadas a nivel baacutesico como pueden serany-instancep do-for-instance do-for-all-instances y delayed-do-for-all-instances
359 iquestCoacutemo se interactuacutea con objetos
La interaccioacuten con objetos se efectuacutea mediante lo que se denomina mensaje
(defmessage-handlerltnombre-clasegtltnombre-mensajegt[lttipo-handlergt] [ltcomentariogt]ltparaacutemetrogt [ltparaacutemetro-comodiacutengt])ltaccioacutengt
)
Un gestor de mensajes consta de 7 partes
1 Nombre de clase a la que el gestor estaraacute asociado
2 Nombre del mensaje
3 Tipo de gestor (Nosotros habitualmente usaremos primary que viene por defecto)
4 Comentario (opcional)
5 Lista de paraacutemetros6 Paraacutemetro comodiacuten (para gestionar muacuteltiples paraacutemetros)
7 Secuencia de acciones o expresiones que seraacuten ejecutadas por el gestor
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2759
24 Capiacutetulo 3 CLIPS
Enfocado a la praacutectica de CLIPS la maacutes comuacuten es que queramos interactuar con objetos para
1 Imprimir los objetos Un ejemplo
1 (defmessage-handler avion imprimir-beneficio ()
2 Para implementar funciones calculadas asociadas al objeto Un ejemplo
1 (defmessage-handler avion calcular-beneficio ()2 ( selfplazas-ocupadas selfprecio-billete))3 )
Como se puede observar el paraacutemetro impliacutecito self contiene la instancia activa para este mensaje
3510 iquestComo se interactuacutea con las instancias de los objetos
Podremos interactuar entre las instancias de los objetos mediante la funcioacuten send
(send ltexpresioacuten-de-objetogtltnombre-de-mensajegtltexpresioacutengt)Donde se toman como argumentos el objeto destino del mensaje el mensaje mismo y otros paraacutemetros
que debieran ser pasados a los gestoresParticularmente en el aacutembito de la praacutectica usualmente necesitaremos utilizar el envioacute de mensajes de
tipo get put and delete Estos mensajes tiene la siguiente sintaxis
get-ltnombre-atributogt
put-ltnombre-atributogt
delete
Aquiacute tenemos un ejemplo de como utilizarlo recordando que ponemos entre corchetes la instancia la cualse enviacutea el mensaje
(defclass avion (is-a USER)(role concrete)(slot precio-billete (create-accessor read) (default 34))(slot plazas-ocupadas (create-accessor write) (default 0)))
Clase creada
gt(make-instance a of avion) Creacioacuten de una instancia de avion[a]
gt(send [a] get-precio-billete) Obtencioacuten de un slot34 Resultado obtenidogt(send [a] put-plazas-ocupadas 100) Modificacioacuten de un slotgt(send [a] delete) Eliminacioacuten de la instanciaTrue
3511 Uso de make-instance
Cuando queremos crear una instancia de una clase para ir rellenandola con los resultados o datos quevayamos obteniendo se haria lo siguiente
(bind variable_instancia (make-instance nombre_instancia of nombre_clase))
Una vez creada podemos jugar con dicha instancia en las diferentes reglas siempre que la llamemos enlos activadores
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2859
35 Las clasesinstancias 25
(defrule reglavar_instancia lt- (object (is-a nombre_clase))=gt
)
De esta manera dentro de la regla podemos hacer acciones con la instancia por ejemplo(send var_instancia put-articulo articulo_ejemplo)
3512 Como generar automaacuteticamente nombres de instancia
En ocasiones queremos crear instancias en reglas y queremos que su nombre sea distinto del de otrasque ya tenemos Para ello podemos utilizar las funciones gensym y gensym La primera genera un siacutembolodel estilo genN donde N es un nuacutemero La segunda hace lo mismo pero aseguraacutendose de que ese siacutembolono exista ya Se puede reiniciar el contador que usan estas dos funciones con el operador (setgen ltnumgt)donde ltnumgt es el nuacutemero por el que queremos que empiecen ahora los siacutembolos
Para usar esto para generar el nombre de una instancia podemos hacer
(make-instance (gensym) of ltclasegt)
Cada vez que se ejecute se generaraacute un nombre de instancia nuevoSi creamos instancias de diferentes clases y queremos que las instancias tengan nombres que podamos
identificar podemos concatenar siacutembolos a los siacutembolos generados por gensym por ejemplo
(make-instance (sym-cat pepe- (gensym)) of ltclasegt)
generaraacute una instancia con el nombre pepe-genN
3513 Com fer un getset drsquoun slot drsquouna classe
Per consultar el valor drsquoun slot drsquouna classe ho podem fer enviant-li un missatge de la seguumlent manera
(send ltVARIABLEgt get-ltNOM_ATRIBUTgt)
Per exemple si tenim una instagravencia de la classe Plat ( instancia ) i volem saber el valor del seu slotnom
(send instancia get-nom)
Per assignar un valor a un slot drsquouna drsquoinstagravencia hem drsquoenviar-li un missatge de la seguumlent manera
(send ltVARIABLEgt put-ltNOM_ATRIBUTgt ltVALORgt)On ltVALORgt pot ser un valor o un megravetode que retorni un valor
(send instancia put-nom nom)
3514 iquestCoacutemo acceder a una instancia cuyo nombre conocemos
Si conocemos el nombre de una instancia y necesitamos acceder a ella es decir necesitamos enviarle alguacutenmensaje mediante la funcioacuten send podemos hacerlo directamente escribiendo en lugar de la variable quealmacena la instancia el nombre de la instancia entre corchetes [ ] A continuacioacuten se muestra un ejemplo
(bind altura_rect1 (send [rect1] get-altura))
En este caso se guardaraacute en la variable altura_rect1 el valor de la altura de la instancia que tiene comonombre rect1
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2959
26 Capiacutetulo 3 CLIPS
3515 Obtenir el nom drsquouna classe
Si tenim una instagravencia drsquouna classe i volem saber el nom de la classe (uacutetil si tenim una bona taxonomiade classes) ho podem fer amb el megravetode (class ltINSTANCIAgt)
Si per exemple imaginem que tenim la classe Actor la qual teacute com subclasses la classe APrincipalASecundari i ACameo Imaginem que estem tractant amb instancies drsquoactors i volem saber si la instanciaque estem tractant es de la classe APrincipal
Ho hauriacuteem de fer de la seguumlent manera
(eq (class instancia) APrincipal)
Fixem-nos que APrincipal eacutes un siacutembol no un String (un truco eacutes fixar-se en que no teacute cometes) Si vol-gueacutessim comparar-ho amb un String (per exemple un String introduiumlt per lrsquousuari) ho podriacuteem transformara un String amb el megravetode str-cat
(eq (str-cat (class instancia)) Principal)
3516 Como convierto un INSTANCE-ADRESS en un INSTANCE-NAME
En alguacuten momento nos podemos encontrar con la situacioacuten de que disponemos de un puntero a unainstancia y necesitamos su nombre o lo contrario En ambos casos podemos usar la funcioacuten instance-nameSu funcionamiento es bidireccional podemos introducirle un instance-name y nos devolveraacute un instance-adress y viceversa
1 (defrule imprimir-nombre2 estlt-(object (is-a Estudiante) (edad 25))3 =gt4 (printout t (instance-name est) crlf)5
)
3517 Com iterar a traveacutes drsquoun multi-slot
El seguumlent tambeacute eacutes vagravelid com exemple de com iterar a traveacutes drsquouna llistaImaginem que tenim una instagravencia de la classe Plat a la varible (plat) la qual teacute un multi-slot drsquoinstagravencies
de la classe Ingredient Imaginem que volem imprimir per pantalla el nom drsquoaquests ingredients (slot nomde la classe Ingredient) Necessitarem iterar sobre la llista drsquoingredients
1 (bind i 1)2 (while (lt= i (length$ (send plat get-ingredients)))3 do4 (bind ingredient (nth$ i (send plat get-ingredients)))5 (printout t (send ingredient get-nom) crlf)6 (bind i (+ i 1))7 )
El megravetode (nth$ ltINDEXgtltLLISTAgt) et retorna lrsquoelement situat a INDEX de LLISTAEl megravetode (length$ ltLLISTAgt) retorna el nuacutemero drsquoelements de LLISTA
3518 Coacutemo modificarinsertarborrar valores en un multislot
Los valores de un multislot se pueden cambiar usando la funcioacuten slot-replace$ La sintaxis es la siguiente
(slot-replace$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt ltvalorgt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3059
35 Las clasesinstancias 27
Donde ltiniciogt y ltfingt son el rango de posiciones del multislot que se quiere modificar y ltvalorgtson los valores que queremos reemplazar Obviamente deberaacute haber tantos valores como posiciones hayamosindicado en el rango
Para insertar nuevos valores podemos usar la funcioacuten slot-insert$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltposgt ltvalorgt)
El valor se inserta delante de la posicioacuten indicada si la posicioacuten es mayor que la longitud del multislot secolocaraacute al final
Para borrar elementos de un multislot podemos usar la funcioacuten slot-delete$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt)
Se borraraacuten los elementos que estaacuten en el rango indicado
3519 Coacutemo recorrer un atributo multievaluado
Supongamos que la variable respuesta tiene una lista de instancias
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 aquiacute hacemos lo que queramos4 )5 )
Loop-for-count funciona como un for primero la variable que haraacute de contador luego el valor de origeny luego el valor final Para controlar el final usamos la funcioacuten que he explicado antes i tomaraacute valoresdesde 1 hasta n asiacute que usando la funcioacuten nth$ obtendremos cada uno de los elementos La variable auxiraacute teniendo cada uno de los valores
3520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz)
Es igual que antes pero con dos bucles
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 (bind aux2 (send aux get-slot_que_queremos))4 (loop-for-count (j 1 (length$ aux2)) do5 (bind aux_final (nth$ j aux2))6 aquiacute ya podemos trabajar con el elemento en concreto7 )8 )
Supongamos que respuesta tiene una lista de instancias con el primer bucle haremos lo mismo que antes ir
iterando por esas instancias Una vez que tenemos cada instancia con aux2 con el segundo bucle iteraremosdentro de sus instancias interiores
Por ejemplo si tenemos varios equipos de fuacutetbol y cada equipo tiene varios jugadores en el primer bucleestamos iterando entre los equipos y en el segundo entre los jugadores de cada equipo en particular
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3159
28 Capiacutetulo 3 CLIPS
3521 Com puc esborrar una instagravencia
Per esborrar una instagravencia (per exemple segons la informacioacute que proporcioni lrsquousuari podem deduir queuna segraverie drsquoinstagravencies eacutes impossible que es facin servir per a la solucioacute) ho podem fer enviant un missatgedelete a la instagravencia eacutes a dir (send ltINSTANCIAgtdelete)
(send inst delete)
Un megravetode que podria ser uacutetil de la cara a la pragravectica podria ser el seguumlent
1 (defrule elimina-instancia2 (declare (salience 10))3 elimina-fact lt- (elimina-inst inst)4 =gt5 (send inst delete)6 (retract elimina-fact)
Imaginem que per exemple que volem eliminar una llista drsquoinstagravencies Per eliminar-les podriacuteem recoacuterrerel llistat marcant les instagravencies que volem esborrar afegint el seguumlent fet
(assert (elimina-instancia inst))
Aixiacute com que elimina-instancia teacute un salience alt esborraria les instagravencies marcades quan tingueacutes ocasioacuteDrsquoaquesta manera ens estalviem el problema de recoacuterrer un llistat drsquoinstagravencies amb un iterador mentre
anem eliminant els elements de la llista cosa que pot donar problemes amb lrsquoiterador
3522 Com imprimir una instagravencia
Per imprimir una classe (uacutetil per exemple per mostrar el resultat final) el millor eacutes definir message-handlersPer exemple imaginem que tenim una classe Plat la qual teacute un slot nom de tipus String Si volgueacutessimimprimir per pantalla un missatge que digueacutes
El nom del plat eacutes ndashltnom del platgtndash
Hauriacuteem de definir un message-handler que simplement imprimiacutes per pantalla el valor de lrsquoslot de laforma
(defmesssage-handler ltCLASSNAMEgt ltMESSAGENAMEgt primary ()ltCODIgt
)
Per el cas de lrsquoexemple
1 (defmessage-handler Plat print primary ()2 (printout t -- selfnom --) )3 )
Per cridar-ho nomeacutes caldragrave enviar-li un missatge a la instagravencia amb el nom del message-handler (enaquest cas print)
(send instancia print)
Un message-handler pot cridar a altres message-handlers amb el que es poden encadenar diverses instagraven-cies Per exemple imaginem que tenim la classe Menuacute la qual teacute un atribut plats que eacutes un llista drsquoinstagravenciesde la classe Plat Dintre del message-handler menuacute podriacuteem iterar a traveacutes de la llista de plats enviant elmissatge print que hem definit anteriorment
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3259
36 Programacioacuten 29
3523 Com es navega entre instagravencies relacionades
Per exemple tinc una instagravencia iA que teacute un slot anomenat slotB que eacutes una instagravencia drsquoun frame B Vullsaber el nom de la instagravencia associada al slotB de iA Ho pots fer aixiacute
(bind B (send iA get-slotB))(bind res (send B get-nom))
Si estagraves dins drsquouna condicioacute ho pots simplificar de la forma seguumlent
(bind res (send iAslotB get-nom)
Els dos punts soacuten equivalents al punt de Java
36 Programacioacuten
361 Com introduir un comentari
Els comentaris a CLIPS va darrere de un com per exemple
Comentari
Tambeacute podem afegir comentaris a les nostres regles deffacts deftemplates etc Generalment van darrereel nom de la estructura per exemple
1 (defrule neteja regla per la qual si la cuina estagrave bruta srsquoafegiragrave una tasca de2 neteja
3 (estat-cuina bruta)4 =gt5 (assert (tasca netejar))6 )
362 Referenciar el valor null a CLIPS
Per referenciar el valor null a clips es fa amb el simbol nil Per exemple si volem saber si una instagravenciainst es null ho podriacuteem fer de la seguumlent manera
(eq inst nil)
363 Formas de recorrer una lista
Para recorrer una lista disponemos de diferentes opciones en este FAQ explicaremos como crear unaestructura tipo ldquoWHILErdquo y tipo ldquoFORrdquo
1 While Esta regla se ejecuta hasta que la expresioacuten a evaluar sea falsa Este tipo de estructura se rigepor seguir la sintaxis while - do y se construiriacutea de la siguiente forma
(while ltexpresioacutengt[do] ltaccioacutengt)
Doacutende dependiendo del valor de ltexpresioacutengt
Valor TRUE Se realizaraacute la accioacuten ltaccioacutengt i se volveraacute a evaluar ltexpresioacutengt
Valor FALSE No se ejecutaraacute la accioacuten ltaccioacutengt
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3359
30 Capiacutetulo 3 CLIPS
2 For Esta regla sirve para ejecutar un bucle N (final - inicio) veces Este tipo de estructura se rige porseguir la sintaxis loop-for-count y se construiriacutea de la siguiente forma
(loop-for-count (ltvargtltiniciogtltfinalgt) [do] ltaccioacutengt)
Doacutende
ltvargt Variable que se usara como iacutendice
ltiniciogt Valor inicial que tendraacute ltvargt
ltfinalgt Ultimo valor que tendraacute la variable ltvargt
ltaccioacutengt Accioacuten que es realizaraacute hasta que ltvargt tenga el valor de ltfingt
364 Formas de elegir una opcioacuten
En este apartado explicaremos como crear una estructura if y una estructura switch
If Este tipo de estructura se rige por seguir la sintaxis if - then - else y se construiriacutea de lasiguiente forma
(if ltexpresioacutengtthen ltaccioacutengt[else ltaccioacuten2gt])
Doacutende dependiendo del valor de ltexpresioacutengt
bull Valor TRUE Se realizaraacute la accioacuten ltaccioacutengtbull Valor FALSE Se realizaraacute la accioacuten ltaccioacuten2gt (en caso de haber)
Switch Este tipo de estructura se rige por seguir la sintaxis switch - opciones y se construiriacutea dela siguiente forma
(switch ltexpresioacuten-testgt(case OPCION1 then ACCION1)(case OPCION2 then ACCION2)
([default] ACCION-DEFAULT)
)
Doacutende dependiendo del valor de ltexpresioacuten-casegt se ejecutaraacute una ltaccioacutengt en particular Si nin-guna ltopcioacutengt es correcta se ejecutara la ltaccioacuten-defaultgt
365 Funciones con la clase String
Habitualmente trabajaremos con Strings o cadena de Strings CLIPS proporciona una serie de herramien-tas para trabajar con esta clase
1 Convertir string a MAYUacuteSCULAS A veces es conveniente tener todos los caracteres en mayuacutesculaspara no tener problemas de comparaciones o simplemente por convenio Para ello CLIPS dispone dela funcioacuten upcase la cual convierte a mayuacutesculas un siacutembolo o string
(upcase ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplos
(upcase Ccedillips es divertido) rarr CcedilLIPS ES DIVERTIDO
(upcase Clips_es_divertido) rarr CLIPS_ES_DIVERTIDO
2 Convertir string a MINUacuteSCULAS la funcioacuten es downcase
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3459
36 Programacioacuten 31
3 Concatenacioacuten de strings Tambieacuten es de gran utilidad poder juntar dos o maacutes paraacutemetros en un solostring Todo paraacutemetro a juntar deben ser de uno de los siguientes tipos symbol String integer floato instance-name
(str-cat parametro1 parametro2 parametroN )
Ejemplo
(str-cat IA nota 10) rarr IAnota10
4 Comparacioacuten de strings Funcioacuten que nos indica si dos strings son iguales
(str-compareltexpresioacuten-simboacutelica-o-de-cadenagtltexpresioacuten-simboacutelica-o-de-cadenagt
)
Esta funcioacuten devuelve
0 Si ambos strings son iguales1 Si el primer string es mayor que el segundo string-1 Si el primer string es menor que el segundo string
5 Longitud de un string Muchas veces es de gran utilidad saber que tamantildeo tiene un string
(str-length ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplo
(str-length Inteligencia Artificial) rarr 23
366 iquestCoacutemo obtener el contenido de una variable en un string
Para conseguir un string a partir de un integer float symbol instance-name debes utilizar el comandostr-cat Si a la funcioacuten le pasamos como paraacutemetros varios elementos los transformaraacute a string y losconcatenaraacute La sintaxis de esta funcioacuten es la siguiente (str-cat elementos) Esta funcioacuten la usaremossobre todo cuando queramos realizar comparaciones entre el contenido de una variable y un string ya quepreviamente necesitaremos usar la funcioacuten str-cat para pasar el contenido de la variable a string y realizarde este modo la comparacioacuten de forma correcta
367 iquestComo se crea una lista
Con create$ Todos los operadores sobre listas llevan el siacutembolo $ al final Igual que con las variables sedebe usar bind siempre que se desee modificar una lista
(bind lista (create$ a b c))
368 iquestComo borro un elemento de una lista
Con delete$Usa la siguiente sintaxis(delete$ ltlistagt ltindice-iniciogt ltindice-finalgt)Se borraraacuten todos los elementos del rango entre las posiciones inicio y final ambas incluidas Tambieacuten exis-
tedelete-member$ (delete-member$ ltlistagt ltelementogt) Borraraacute todas las apariciones del elemento enla lista
(delete$ (create$ a b c d e f) 3 5) minusrarr (a b f)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1659
33 Variables 13
33 Variables
331 Variables a CLIPS
No cal declarar una variable (ni el seu tipus) nomeacutes cal afegir un interrogant al comenccedilament drsquoun simbol
per indicar que eacutes una variableCLIPS srsquoencarrega del control de tipus depenent del que assignem a la variablePer exemple testvar correspondria a la variable testvar Si per exemple assigneacutessim lrsquoenter 3 a
testvar CLIPS tractaria la variable com una variable entera
332 Com assignar un valor a una variable
Per assignar un valor a una variable es fa servir el megravetode (bind) amb la forma
(bind ltVARIABLEgtltVALORgt)
On ltVALORgt pot ser un valor o un megravetode que retorni un valor Per exemple si volem assignar un 4 a lavariable var
(bind var 4)
O per exemple podriacuteem assignar a la variable var la suma de 2 meacutes 2
(bind var (+ 2 2))
333 iquestCoacutemo declarar variables globales
Para crear una variable global hay que meterla dentro de la construccioacuten defglobal La declaracioacuten de la
variable seguiraacute el modelo nombreVariable = expresioacutenPor ejemplo
(defglobal presupuesto = 0)
Pueden aparecer en la parte izquierda de las reglas si no son utilizadas para asignar un valor y su cambiono activa reglas pero no pueden ser paraacutemetros de funciones ni meacutetodos
334 iquestCoacutemo trabajar con variables sumando restando por ejemplo contadores
La mejor forma es con variables globales se definen asiacute (defglobal x = 0) puede ser el valor quequeramos tanto nuacutemero string Y si queremos sumarle 10 por ejemplo
(bind x (+ x 10))
Las variables locales como por ejemplo x soacutelo tienen valor mientras dura su ejecucioacuten y eso suele ser enesa misma liacutenea o en un bucle Si le damos valor a x y luego preguntamos por ella nos diraacute que no existe
335 Quina diferegravencia hi ha entre les variables del tipus nom_variable i les del tipus $nom_variable
Les primeres contenen un sol valor i les segones en poder contenir meacutes drsquoun (o cap)
336 Quegrave significa lrsquointerrogant () quan va sol
Eacutes una variable anogravenima Pots utilitzar sense posar-hi cap nom si no trsquointeressa el valor en concret Perexemple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1759
14 Capiacutetulo 3 CLIPS
(Primer filtre_preu )
Aquesta condicioacute significa ldquosi el fet (Primer filtre_preu) teacute algun valorrdquo O sigui que si tingueacutessimel fet (Primer filtre_preu ok) es compliria la condicioacute (i si en comptes de ldquookrdquo fos ldquopatatardquo tambeacute escompliria) En canvi si el fet fos uacutenicament (Primer filtre_preu) no es compliria la condicioacute
337 Quegrave significa el dogravelar ($) quan va sol
Eacutes com lrsquointerrogant perograve admet meacutes drsquoun valor Per exemple
(Primer filtre_preu $ ok)
donaragrave cert pels fets de lrsquoestil (Primer filtre_preu patata ok) (Primer filtre_preu hola ok)(Primer filtre_preu patata hola ok) (Primer filtre_preu ok) Eacutes a dir no importa els valors quehi hagi entre filtre_preu i ok si al final hi ha un ok
338 iquestComo puedo ver los hechos presentes en un momento determinado
Abriendo la Facts Window en Window de la barra de menuacute
34 Las reglas
341 iquestCoacutemo construir una regla
Para construir una regla utilizaremos la construccioacuten defrule
Sintaxis
(defrule ltnombre-reglagt [ltcomentariogt][ltdeclaracioacutengt]ltelemento-condicioacutengt Parte izquierda (LHS)
=gtltaccioacutengt) Parte dcha (RHS) de la regla
Una regla consta de un conjunto de condiciones (antecedente) tambieacuten denominados elementos condicio-nales (EC) o parte izquierda (LHS) y de un conjunto de acciones (consecuente) tambieacuten denominado partederecha de la regla (RHS) La regla se activaraacute siempre que se satisfagan todos los EC mediante hechos oinstancias que los cumplan
Si se introduce en la base de reglas una nueva regla con el mismo nombre que el de una existente la nuevaregla reemplazaraacute a la antigua
Si una regla no tiene parte izquierda es decir no tiene elementos condicionales entonces el hecho(initial-fact) actuaraacute como el elemento condicional para ese tipo de reglas y la regla se activaraacute cadavez que se ejecute un comando reset
342 iquestCoacutemo gestionar la parte izquierda (LHS) de una regla
Declarar hechosSi no se especifica ninguna condicioacuten la regla se activaraacute siempre Una condicioacuten puede ser un simple hecho
(Ej vegetariano) o un hecho ordenado con unos valores concretos (Ej (persona (nombre Juan))) Si loque queremos es obtener el valor de un hecho insertaremos una variable en su lugar (Ej (persona (nombre
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1859
34 Las reglas 15
n)) ) Entonces entraraacute en la regla para cada valor posible que pueda asignar a la variable n a partir delos hechos
Si queremos indicar cualquier valor utilizaremos el siacutembolo y para cualquier lista el siacutembolo $ (Ej(evento ) (estilo $) ) Tambieacuten existe la opcioacuten de guardar en una variable una referencia al objetoEllo se consigue poniendo var lt- a su izquierda (Ej p lt- (persona (nombre Juan))) Se puede usarpor ejemplo para pasaacuterselo de paraacutemetro a una funcioacuten llamada en la RHS
Establecer condiciones
Ademaacutes podemos especificar restricciones adicionales sobre los valores que puede tomar un campo de unhecho Existen tres tipos principales de restricciones Conectadas (por orden de precedencia o prioridad)
not (~) Evita que cierto campo cumpla determinada restriccioacuten
and (amp) Combina dos restricciones conjuntivamente
or (|) Combina dos restricciones disjuntivamente
De predicado () Obliga a que cierto campo cumpla determinada condicioacuten (especificada por el predicado)
Por valor devuelto por una funcioacuten = Permite llamar a una funcioacuten y utilizar el valor devuelto pararestringir el valor que pueda tomar un campo de un hecho
Se puede comprobar si se cumple una determinada condicioacuten mediante el constructor test Dentro detest se pueden hacer llamadas a cualquier funcioacuten o predicado ya sea primitiva de CLIPS o definidapor nosotros
Combinar elementos
Los diferentes elementos de la parte izquierda van impliacutecitamente unidos mediante una AND que indicaconjuncioacuten No obstante podemos hacerlo expliacutecitamente mediante (and (cond1) (cond2)) aunque suelen
utilizarse para anidar ANDs dentro de ORsOR Sirve para hacer una disyuncioacuten (or (cond1) (cond2)) Es equivalente a escribir varias reglas en lasque cada una de ellas tenga uno de los componentes del OR en su parte izquierda y la misma parte derecha
NOT Sirve para detectar si no existe un determinado hecho (Ej (not (estilo sibarita)))exists Cuando a un conjunto de elementos se le antecede exists se comprueba que hay al menos un
hecho en la base de hechos que cumpla la condicioacuten (Ej (exists(bebida precio (ltprecio 5))) )forall Permite comprobar si todos los hechos que satisfacen un determinado patroacuten cumplen una serie
de condiciones (Ej (forall(plato (estilo moderno)))
343 iquestCoacutemo obtener la direccioacuten de hechos o instancias situados en LHS
En algunas ocasiones vamos a necesitar realizar alguacuten tipo de accioacuten en la parte derecha de las reglassobre hechos o instancias que cumplan unas determinadas condiciones Pero para ello necesitaremos primerotener acceso a estos elementos para despueacutes poder operar sobre ellos Esto lo conseguiremos guardando ladireccioacuten del elemento en una variable hacieacutendolo del siguiente modo
variable_direccion lt- (elemento)
Pongamos un ejemplo para ver realmente el funcionamiento y uso de esta posibilidad que CLIPS nosofrece
1 (defrule imprime-area2 instancia lt- (object (is-a Rectangulo))3 =gt4 (printout t Area del rectangulo (instance-name instancia)5 (send instancia calcula-area) crlf)6 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1959
16 Capiacutetulo 3 CLIPS
Cuando se ejecuta esta regla se imprimiraacuten las aacutereas de todas las instancias de la clase Rectangulo Enla parte izquierda de la regla lo que hacemos es guardar en la variable instancia la direccioacuten de la instanciade Rectangulo que estamos tratando en ese momento La regla se ejecutaraacute para todas las instanciasalmacenadas en la memoria de trabajo que cumplan la condicioacuten (is-a Rectangulo) es decir para todaslas instancias de la clase Rectangulo En la parte derecha de la regla donde se ejecutan las acciones podemosver que se imprimiraacute para cada instancia lo siguiente Area del rectangulo [nombre_instancia] aacuterea
del rectaacutengulo La funcioacuten instance-name nos devuelve el nombre de la instancia que le pasamos porparaacutemetro Ademaacutes hemos llamado al gestor de mensajes calcula-area para que nos devuelva el area delrectaacutengulo
344 iquestCoacutemo hacer sentencias or en la izquierda de las reglas
Con (or ) Si por ejemplo tenemos dos hechos (a) y (b) y queremos ejecutar la derecha de la reglacuando se cumpla uno de los dos tendremos que hacer (or (a) (b)) Atencioacuten porque la parte derecha seejecutaraacute tantas veces como veces se cumpla cada uno de los hechos si para nosotros existe tanto (a) como(b) la parte derecha se ejecutaraacute dos veces Para que soacutelo se usa una vez podemos hacer combinaciones de
or y and (funciona igual) o usar un patroacuten por ejemplo (persona Juan|Pedro) soacutelo se ejecutariacutea una vez
345 Com afegir una condicioacute a la part esquerre drsquouna regla
A vegades eacutes necessari que una regla srsquoinstanciiuml si es produeix una condicioacute especial (i no un fet) Per feraixoacute farem servir la comanda (test ltCONDICIOgt)
Per exemple imaginem que la nostre base de fets compte amb un fet (preu valor) amb un preudeterminat Imaginem que volem una regla que srsquoinstanciiuml quan aquest valor eacutes meacutes gran que 30
Per fer-ho fent servir tot el que hem explicat
1 (defrule preucar2 (preu preu)3 (test (gt preu 30))4 =gt5 (printout t El preu es mes gran que 30)6 )
Eacutes a dir si el preu eacutes meacutes gran que 30 srsquoimprimiragrave un missatge per pantallaAquestes condicions poden contenir ANDs i ORs de varies condicionsPer exemple
1 (defrule preulimit2 (preu preu)3 factminim lt- (preuminim minim)4 factmax lt- (preumaxim maxim)5 (test (and (gt preu minim) (lt preu maxim) ))6 =gt7 (retract factminim)8 (retract factmax)9 (printout t El preu estagrave dintre del rang)
On comprovarem si el preu estagrave dintre drsquoun rang determinat i en aquest cas esborra els fets que contenen
el magravexim preu i el miacutenim preu i mostra un missatge per pantalla
346 Puede una misma regla ejecutarse maacutes de una vez
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2059
34 Las reglas 17
Es muy importante entender que cada regla se ejecutaraacute una vez por cada combinacioacuten de valores en suLHS
1 (defrule regla2 (color col)3 (peso pes)4 =gt5
Si tengo tres colores y dos pesos asertados la regla se ejecutaraacute 6 veces una con cada combinacioacuten decolor y peso
347 Com puc definir lrsquoordre de les regles
La idea drsquoun sistema basant en regles eacutes no definir un ordre lineal drsquoaquestes (costa deixar de pensar de
forma iterativa)En el cas de necessitar que una regla srsquoexecuti despreacutes drsquouna altre pots fer servir Fets la regla anteriorcrea un fet que la segona regla tindragrave a la part esquerra
1 (defrule pregunta12 =gt3 (assert (pregunta1Feta))4 5 )6
7 (defrule pregunta2
8 (pregunta1Feta)9 =gt
10 11 )
I finalment pots usar la propietat salience Aquesta propietat indica la prioritat drsquoexecucioacute de les regles( les regles amb salience majors srsquoexecutaran abans ) Pot prendre valors positius i negatius entre -10000 y+10000 Per defecte les regles tenen salience 0
1 (defrule pregunta12 (declare (salience 2))3 =gt4 5 )6
7 (defrule pregunta28 (declare (salience 1))9 =gt
10 11 )
El valor indicado en la propiedad salience puede ser el nuacutemero directamente o una expresioacuten por ejemplovariable10 podemos usar variable para elegir que regla se ejecutaraacute
Las prioridades deben ser usadas solo para determinar el orden en el que se disparan algunas reglas sobreotras no para fijar el flujo de control ya que la principal ventaja de un sistema basado en reglas es larepresentacioacuten declarativa del conocimiento y de esta forma abusando de las prioridades conduce a unsistema procedimental
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2159
18 Capiacutetulo 3 CLIPS
348 Com forccedilar que una regla sigui la primera
Per que aquesta regla sigui la primera ha de tenir el salience meacutes gran de totes
1 (defrule presentacio2 (declare (salience 20))3 =gt4 (printout t ------ Benvingut ----- crlf)5 )
349 Vull guardar certs valors que es fan servir durant lrsquoexecucioacute de diferents regles Com hopuc fer
Tens principalment dues alternatives Si el valor eacutes un tipus bagravesic pots fer servir una variable global ambla sintaxi seguumlent
(defglobal nom_variable = valor)
Aquesta sentegravencia no va a dins de cap funcioacute ni regla es posa sola a la part que creguis convenient delcodi Vegem un exemple
(defglobal preu_minim_primer = 1000)
Per fer-la servir es fa exactament de la mateixa manera que amb una variable normal perograve has de posarels dos asteriscs Per exemple
(bind preu_minim_primer curr-preu)
Per altra banda si el valor o valors que vols guardar han de ser instagravencies una bona estrategravegia pot serutilitzar un deftemplate Eacutes uacutetil sobretot per anar guardant solucions temporals o llistes drsquoelements quepoden formar part de la solucioacute
Per utilitzar-ho has de seguir els passos seguumlents
1 Definir el deftemplate
(deftemplate nom_del_deftemplate(multislot nom_multislot)
(slot nom_slot)
)
Amb un exemple es veuragrave meacutes clar
(deftemplate llista-plats(multislot primers)(multislot segons)(multislot postres)
)
2 Inicialitzar el deftemplate
(defrule[condicions vagraveries] La condicioacute base eacutes que llista-plats no srsquoha inicialitzat encara
(not (llista-plats))=gt
llista conteacute els valors de llista-plats (que de moment estan buits)(bind llista (assert (llista-plats)))
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2259
35 Las clasesinstancias 19
3 Assignar-li valors
(bind segons_plats (find-all-instances ((plat Plat)) TRUE)(modify llista (segons segons_plats))
4 Recuperar els valors
(defrule[condicions vagraveries]llista lt- (llista-plats (segons $segons_plats))
=gt
Ara la variable $segons_plats conteacute tots els elements de segons
35 Las clasesinstancias
351 Tengo que representar la jerarquiacutea de un frame iquestEs preferible antildeadir las subclases a laontologiacutea o bien diferenciarlas mediante un slot en la superclase
Las dos formas son vaacutelidas pero es recomendable representarlas en clases separadas cuando se vayan abuscar instancias de ese tipo ya que asiacute no tendremos que hacer un recorrido por todas las de la superclaseNo obstante si soacutelo se trata de una caracteriacutestica puntual del frame y no vamos a hacer buacutesquedas de unaexclusiva subclase entonces seraacute maacutes eficiente antildeadir un slot debido a su mejor accesibilidad
352 iquestQueacute es un objeto
Podriacuteamos decir que un objeto es un hecho no ordenado con herencia
353 iquestPorqueacute usar objetos en contexto de la praacutectica de CLIPS de IA
Como bien sabemos una parte de la praacutectica de SBCrsquos consisten en crear la ontologiacutea Esta ontologiacutease exporta para poder interactuar con CLIPS en formato pins y pont El archivo pont contendraacute ladeclaracioacuten de todas las clases creadas previamente por Protege (defclass ) El archivo pins contendraacute
todas las instancias de las clases declaradas en el archivo pont Como puede intuir el lector se necesitaraacuteinteractuar con los objetos previamente creados por Protegravegegrave
354 Como se definen las clases
Para definir las clases usaremos el constructor defclass
(defclass ltnombregt [ltcomentariogt](is-a ltnombre-de-superclasegt)[(role concrete | abstract)]
[(pattern-match reactive | non-reactive)]ltslotgt definicioacuten de los atributos de la clase
ltdocumentacioacuten-handlergt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2359
20 Capiacutetulo 3 CLIPS
En caso de desear que la nueva clase herede las propiedades de otra ya existente el nombre de esta deberaacuteespecificarse despues de is-a El rol determinaraacute si la clase es concreta (se puede instanciar) o abstracta(destinada a ser superclase) El pattern-match debe declararse como reactivo si se desea que las instanciasde la clase puedan unificar con los elementos objeto de las reglas (siacutembolo lt-) Los slots correspondena los atributos de la clase y los handlers a las funciones de eacutesta Los handlers se pueden declarar en ladeclaracioacuten de la propia clase pero se deben definir externamente Dado que no aporta ninguna ventaja
declararlos es recomendable definirlos directamente Noacutetese que todo aquello que estaacute entre corchetes ([])constituye informacioacuten adicional que no es obligatorio especificar
1 (defclass Persona2 (is-a Ser_Vivo)3 (role concrete)4 (single-slot edad5 (type INTEGER)6 (range 1 99)7 (cardinality 0 1)8 (create-accessor read-write)9 )
10 (multislot amigos11 (type INSTANCE)12 (allowed-classes Persona)13 )14 )
El comportamiento y declaracioacuten de los slots es ideacutentico al de los slots de los hechos ordenados Losatributos de tipo INSTANCE (referencian otras instancias) estan en formato INSTANCE-NAME
355 Com consulto una instagravencia a partir drsquouna regla
Podem fer servir la part esquerre drsquouna regla per trobar instagravencies Lrsquouacutes eacutes molt semblant a trobar elpunter a un fet fent servir
(object [(is-a ltNOM_CLASSEgt)|(name ltNOM_INSTANCIA)|(ltNOM-SLOTgt ltVALORVARIABLE))])
Per exemple si volem que una regla srsquoinstanciiuml si tenim instanciat un plat de la classe Plat podriem ferservir
1 (defrule tenimplat2 plat lt- (object (is-a Plat))3 =gt4 (print t (send plat get-nom) crlf)
La regla imprimiragrave el nom del plat que trobi Eacutes important notar que srsquoactivaragrave per cada instagravencia de platque tinguem a la base de coneixement
Podem consultar els valors de la instancia fent servir condicions a la part esquerre de la regla Per exemplesi nomeacutes volgueacutessim els plats amb un preu meacutes gran que 30
1 (defrule platCar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Srsquoactivaragrave per tots els plats amb un preu major a 30
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2459
35 Las clasesinstancias 21
Srsquoha drsquoanar amb cura per aquest tipus de regla ja que si la base de coneixement eacutes molt amplia pot acabarderivant amb problemes de memograveria
Per exemple si en comptes de preguntar per una instagravencia de Plat pregunteacutessim per dues instancies dePlat
1 (defrule platsCars2 plat1 lt- (object (is-a Plat) (Preu p1))3 plat2 lt- (object (is-a Plat) (Preu p2))4 (test (gt p1 30))5 (test (gt p2 30))6 =gt7 (print t (send plat1 get-nom) i (send plat1 get-nom) soacuten cars8 crlf)9 )
Faria unificacioacute amb totes les combinacions possibles (amb repeticions) de dos plats de tota la base deconeixement Aixograve es podria anar ampliant fins fer-se intractable
Si tenim drsquoalguna manera el nom de la instancia podem fer
1 (defrule platPicant2 (cuina (plat p))3 (object (name p) (picant pi))4 =gt5 (print t picant pi crlf)6 )
Aixoacute es pot servir per crear condicions que facin servir noms drsquoinstancies que tenim almacenats a slotsdrsquoaltres instancies per exemple
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send v get-Preu) crlf)6 )
Aquesta regla imprimiria el preu del vi asociat al plat si es negre
356 Tengo problemas en condiciones de reglas con slots de instancias obtenidos con send
A veces dan problemas las reglas en las que las condiciones sobre los valores de los slots de una instanciase escriben usando mensajes get sobre los atributos de una instancia en lugar de utilizar patrones paraobtenerlos por ejemplo la regla
1 (defrule platcar2 plat lt- (object (is-a Plat) )3 (test (gt (send plat get-Preu) 30))4 =gt5 (print t (send plat get-nom) es car6 crlf)7 )
No funciona correctamente en CLIPS pero la regla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2559
22 Capiacutetulo 3 CLIPS
1 (defrule platcar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Siacute lo haceEn el caso de que el valor del slot sea booleano se puede escribir la regla como
1 (defrule platpicant2 plat lt- (object (is-a Plat) (Picant TRUE))3 =gt4 (print t (send plat get-nom) es picant crlf)
En el caso de que el slot sea a su vez una instancia se puede utilizar para obtener los valores de estainstancia en la condicion como se explica en la pregunta anterior
357 Tengo problemas con instancias obtenidas del slot de otra instancia en el patroacuten de unaregla
Este problema aparece cuando el patron de una regla instancia una variable a un nombre de instancia yesta no esta definida en el modulo de la regla por ejemplo si la regla siguiente pertenece a un modulo queno es el de la instancia
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4
=gt5 (print t preu (send v get-Preu) crlf)6 )
La regla se quejaraacute de que la instancia no existe al enviarle el send ya que solo se busca la instancia dentrodel moacutedulo de la regla y no en los importados Para arreglar esto se puede usar la funcioacuten (instance-address[ltMODULOgt|] ltINSTANCIAgt) que busca la direccion de la instancia en un modulo concreto o en todos losmoacutedulos que se importan () Deberiacuteamos entonces escribir la regla
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send (instance-address v) get-Preu) crlf)6 )
358 iquestCoacutemo realizar una buacutesqueda de instancias que cumplan unas restricciones
CLIPS nos ofrece varias funciones de buacutesqueda de instancias que cumplan unas determinadas restriccionesque a nosotros nos interese
La funcioacuten find-instance Esta funcioacuten devuelve la primera instancia que cumple todas las restric-ciones indicadas
La funcioacuten find-all-instances Esta funcioacuten devuelve todas las instancias que cumplen las restric-ciones indicadas
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2659
35 Las clasesinstancias 23
La sintaxis de ambas funciones es igual exceptuando el nombre de la funcioacuten(find-all-instances (clase_instancias) (restricciones))A continuacioacuten se muestran varios ejemplos
(bind rectangulos (find-all-instances ((inst Rectangulo)) (gtinstaltura 10))) Des-pueacutes de ejecutar esta funcioacuten en la variable rectangulos habraacute una lista con todas las instancias de la
clase Rectangulo cuya altura sea superior a 10(bind rectangulos (find-all-instances ((inst Rectangulo)) (and (gtinstaltura 10) (=instanchura 7)))) Este trozo de coacutedigo hace que en la variable rectangulos se guarde una listade las instancias de la clase Rectangulo que tienen una altura superior a 10 y una anchura igual a 7
Estas funciones que CLIPS nos ofrece tienen otra funcionalidad y es que podemos realizar buacutesquedas deconjuntos de instancias
(bind rectangulos (find-all-instances ((a Rectangulo) (b Rectangulo)) (= aalturabaltura))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas de instancias de laclase Rectangulo que tienen la misma altura
Por uacuteltimo es necesario comentar que se pueden realizar buacutesquedas de conjuntos de instancias que seande distintas clases
(bind figuras (find-all-instances ((rect Rectangulo) (circ Circulo)) (= rectalturacircradio))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas ltrectangulocirculogtque cumplan que la altura del rectaacutengulo sea igual al radio del ciacuterculo
Existen maacutes comandos para obtener instancias pero son menos utilizadas a nivel baacutesico como pueden serany-instancep do-for-instance do-for-all-instances y delayed-do-for-all-instances
359 iquestCoacutemo se interactuacutea con objetos
La interaccioacuten con objetos se efectuacutea mediante lo que se denomina mensaje
(defmessage-handlerltnombre-clasegtltnombre-mensajegt[lttipo-handlergt] [ltcomentariogt]ltparaacutemetrogt [ltparaacutemetro-comodiacutengt])ltaccioacutengt
)
Un gestor de mensajes consta de 7 partes
1 Nombre de clase a la que el gestor estaraacute asociado
2 Nombre del mensaje
3 Tipo de gestor (Nosotros habitualmente usaremos primary que viene por defecto)
4 Comentario (opcional)
5 Lista de paraacutemetros6 Paraacutemetro comodiacuten (para gestionar muacuteltiples paraacutemetros)
7 Secuencia de acciones o expresiones que seraacuten ejecutadas por el gestor
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2759
24 Capiacutetulo 3 CLIPS
Enfocado a la praacutectica de CLIPS la maacutes comuacuten es que queramos interactuar con objetos para
1 Imprimir los objetos Un ejemplo
1 (defmessage-handler avion imprimir-beneficio ()
2 Para implementar funciones calculadas asociadas al objeto Un ejemplo
1 (defmessage-handler avion calcular-beneficio ()2 ( selfplazas-ocupadas selfprecio-billete))3 )
Como se puede observar el paraacutemetro impliacutecito self contiene la instancia activa para este mensaje
3510 iquestComo se interactuacutea con las instancias de los objetos
Podremos interactuar entre las instancias de los objetos mediante la funcioacuten send
(send ltexpresioacuten-de-objetogtltnombre-de-mensajegtltexpresioacutengt)Donde se toman como argumentos el objeto destino del mensaje el mensaje mismo y otros paraacutemetros
que debieran ser pasados a los gestoresParticularmente en el aacutembito de la praacutectica usualmente necesitaremos utilizar el envioacute de mensajes de
tipo get put and delete Estos mensajes tiene la siguiente sintaxis
get-ltnombre-atributogt
put-ltnombre-atributogt
delete
Aquiacute tenemos un ejemplo de como utilizarlo recordando que ponemos entre corchetes la instancia la cualse enviacutea el mensaje
(defclass avion (is-a USER)(role concrete)(slot precio-billete (create-accessor read) (default 34))(slot plazas-ocupadas (create-accessor write) (default 0)))
Clase creada
gt(make-instance a of avion) Creacioacuten de una instancia de avion[a]
gt(send [a] get-precio-billete) Obtencioacuten de un slot34 Resultado obtenidogt(send [a] put-plazas-ocupadas 100) Modificacioacuten de un slotgt(send [a] delete) Eliminacioacuten de la instanciaTrue
3511 Uso de make-instance
Cuando queremos crear una instancia de una clase para ir rellenandola con los resultados o datos quevayamos obteniendo se haria lo siguiente
(bind variable_instancia (make-instance nombre_instancia of nombre_clase))
Una vez creada podemos jugar con dicha instancia en las diferentes reglas siempre que la llamemos enlos activadores
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2859
35 Las clasesinstancias 25
(defrule reglavar_instancia lt- (object (is-a nombre_clase))=gt
)
De esta manera dentro de la regla podemos hacer acciones con la instancia por ejemplo(send var_instancia put-articulo articulo_ejemplo)
3512 Como generar automaacuteticamente nombres de instancia
En ocasiones queremos crear instancias en reglas y queremos que su nombre sea distinto del de otrasque ya tenemos Para ello podemos utilizar las funciones gensym y gensym La primera genera un siacutembolodel estilo genN donde N es un nuacutemero La segunda hace lo mismo pero aseguraacutendose de que ese siacutembolono exista ya Se puede reiniciar el contador que usan estas dos funciones con el operador (setgen ltnumgt)donde ltnumgt es el nuacutemero por el que queremos que empiecen ahora los siacutembolos
Para usar esto para generar el nombre de una instancia podemos hacer
(make-instance (gensym) of ltclasegt)
Cada vez que se ejecute se generaraacute un nombre de instancia nuevoSi creamos instancias de diferentes clases y queremos que las instancias tengan nombres que podamos
identificar podemos concatenar siacutembolos a los siacutembolos generados por gensym por ejemplo
(make-instance (sym-cat pepe- (gensym)) of ltclasegt)
generaraacute una instancia con el nombre pepe-genN
3513 Com fer un getset drsquoun slot drsquouna classe
Per consultar el valor drsquoun slot drsquouna classe ho podem fer enviant-li un missatge de la seguumlent manera
(send ltVARIABLEgt get-ltNOM_ATRIBUTgt)
Per exemple si tenim una instagravencia de la classe Plat ( instancia ) i volem saber el valor del seu slotnom
(send instancia get-nom)
Per assignar un valor a un slot drsquouna drsquoinstagravencia hem drsquoenviar-li un missatge de la seguumlent manera
(send ltVARIABLEgt put-ltNOM_ATRIBUTgt ltVALORgt)On ltVALORgt pot ser un valor o un megravetode que retorni un valor
(send instancia put-nom nom)
3514 iquestCoacutemo acceder a una instancia cuyo nombre conocemos
Si conocemos el nombre de una instancia y necesitamos acceder a ella es decir necesitamos enviarle alguacutenmensaje mediante la funcioacuten send podemos hacerlo directamente escribiendo en lugar de la variable quealmacena la instancia el nombre de la instancia entre corchetes [ ] A continuacioacuten se muestra un ejemplo
(bind altura_rect1 (send [rect1] get-altura))
En este caso se guardaraacute en la variable altura_rect1 el valor de la altura de la instancia que tiene comonombre rect1
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2959
26 Capiacutetulo 3 CLIPS
3515 Obtenir el nom drsquouna classe
Si tenim una instagravencia drsquouna classe i volem saber el nom de la classe (uacutetil si tenim una bona taxonomiade classes) ho podem fer amb el megravetode (class ltINSTANCIAgt)
Si per exemple imaginem que tenim la classe Actor la qual teacute com subclasses la classe APrincipalASecundari i ACameo Imaginem que estem tractant amb instancies drsquoactors i volem saber si la instanciaque estem tractant es de la classe APrincipal
Ho hauriacuteem de fer de la seguumlent manera
(eq (class instancia) APrincipal)
Fixem-nos que APrincipal eacutes un siacutembol no un String (un truco eacutes fixar-se en que no teacute cometes) Si vol-gueacutessim comparar-ho amb un String (per exemple un String introduiumlt per lrsquousuari) ho podriacuteem transformara un String amb el megravetode str-cat
(eq (str-cat (class instancia)) Principal)
3516 Como convierto un INSTANCE-ADRESS en un INSTANCE-NAME
En alguacuten momento nos podemos encontrar con la situacioacuten de que disponemos de un puntero a unainstancia y necesitamos su nombre o lo contrario En ambos casos podemos usar la funcioacuten instance-nameSu funcionamiento es bidireccional podemos introducirle un instance-name y nos devolveraacute un instance-adress y viceversa
1 (defrule imprimir-nombre2 estlt-(object (is-a Estudiante) (edad 25))3 =gt4 (printout t (instance-name est) crlf)5
)
3517 Com iterar a traveacutes drsquoun multi-slot
El seguumlent tambeacute eacutes vagravelid com exemple de com iterar a traveacutes drsquouna llistaImaginem que tenim una instagravencia de la classe Plat a la varible (plat) la qual teacute un multi-slot drsquoinstagravencies
de la classe Ingredient Imaginem que volem imprimir per pantalla el nom drsquoaquests ingredients (slot nomde la classe Ingredient) Necessitarem iterar sobre la llista drsquoingredients
1 (bind i 1)2 (while (lt= i (length$ (send plat get-ingredients)))3 do4 (bind ingredient (nth$ i (send plat get-ingredients)))5 (printout t (send ingredient get-nom) crlf)6 (bind i (+ i 1))7 )
El megravetode (nth$ ltINDEXgtltLLISTAgt) et retorna lrsquoelement situat a INDEX de LLISTAEl megravetode (length$ ltLLISTAgt) retorna el nuacutemero drsquoelements de LLISTA
3518 Coacutemo modificarinsertarborrar valores en un multislot
Los valores de un multislot se pueden cambiar usando la funcioacuten slot-replace$ La sintaxis es la siguiente
(slot-replace$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt ltvalorgt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3059
35 Las clasesinstancias 27
Donde ltiniciogt y ltfingt son el rango de posiciones del multislot que se quiere modificar y ltvalorgtson los valores que queremos reemplazar Obviamente deberaacute haber tantos valores como posiciones hayamosindicado en el rango
Para insertar nuevos valores podemos usar la funcioacuten slot-insert$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltposgt ltvalorgt)
El valor se inserta delante de la posicioacuten indicada si la posicioacuten es mayor que la longitud del multislot secolocaraacute al final
Para borrar elementos de un multislot podemos usar la funcioacuten slot-delete$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt)
Se borraraacuten los elementos que estaacuten en el rango indicado
3519 Coacutemo recorrer un atributo multievaluado
Supongamos que la variable respuesta tiene una lista de instancias
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 aquiacute hacemos lo que queramos4 )5 )
Loop-for-count funciona como un for primero la variable que haraacute de contador luego el valor de origeny luego el valor final Para controlar el final usamos la funcioacuten que he explicado antes i tomaraacute valoresdesde 1 hasta n asiacute que usando la funcioacuten nth$ obtendremos cada uno de los elementos La variable auxiraacute teniendo cada uno de los valores
3520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz)
Es igual que antes pero con dos bucles
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 (bind aux2 (send aux get-slot_que_queremos))4 (loop-for-count (j 1 (length$ aux2)) do5 (bind aux_final (nth$ j aux2))6 aquiacute ya podemos trabajar con el elemento en concreto7 )8 )
Supongamos que respuesta tiene una lista de instancias con el primer bucle haremos lo mismo que antes ir
iterando por esas instancias Una vez que tenemos cada instancia con aux2 con el segundo bucle iteraremosdentro de sus instancias interiores
Por ejemplo si tenemos varios equipos de fuacutetbol y cada equipo tiene varios jugadores en el primer bucleestamos iterando entre los equipos y en el segundo entre los jugadores de cada equipo en particular
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3159
28 Capiacutetulo 3 CLIPS
3521 Com puc esborrar una instagravencia
Per esborrar una instagravencia (per exemple segons la informacioacute que proporcioni lrsquousuari podem deduir queuna segraverie drsquoinstagravencies eacutes impossible que es facin servir per a la solucioacute) ho podem fer enviant un missatgedelete a la instagravencia eacutes a dir (send ltINSTANCIAgtdelete)
(send inst delete)
Un megravetode que podria ser uacutetil de la cara a la pragravectica podria ser el seguumlent
1 (defrule elimina-instancia2 (declare (salience 10))3 elimina-fact lt- (elimina-inst inst)4 =gt5 (send inst delete)6 (retract elimina-fact)
Imaginem que per exemple que volem eliminar una llista drsquoinstagravencies Per eliminar-les podriacuteem recoacuterrerel llistat marcant les instagravencies que volem esborrar afegint el seguumlent fet
(assert (elimina-instancia inst))
Aixiacute com que elimina-instancia teacute un salience alt esborraria les instagravencies marcades quan tingueacutes ocasioacuteDrsquoaquesta manera ens estalviem el problema de recoacuterrer un llistat drsquoinstagravencies amb un iterador mentre
anem eliminant els elements de la llista cosa que pot donar problemes amb lrsquoiterador
3522 Com imprimir una instagravencia
Per imprimir una classe (uacutetil per exemple per mostrar el resultat final) el millor eacutes definir message-handlersPer exemple imaginem que tenim una classe Plat la qual teacute un slot nom de tipus String Si volgueacutessimimprimir per pantalla un missatge que digueacutes
El nom del plat eacutes ndashltnom del platgtndash
Hauriacuteem de definir un message-handler que simplement imprimiacutes per pantalla el valor de lrsquoslot de laforma
(defmesssage-handler ltCLASSNAMEgt ltMESSAGENAMEgt primary ()ltCODIgt
)
Per el cas de lrsquoexemple
1 (defmessage-handler Plat print primary ()2 (printout t -- selfnom --) )3 )
Per cridar-ho nomeacutes caldragrave enviar-li un missatge a la instagravencia amb el nom del message-handler (enaquest cas print)
(send instancia print)
Un message-handler pot cridar a altres message-handlers amb el que es poden encadenar diverses instagraven-cies Per exemple imaginem que tenim la classe Menuacute la qual teacute un atribut plats que eacutes un llista drsquoinstagravenciesde la classe Plat Dintre del message-handler menuacute podriacuteem iterar a traveacutes de la llista de plats enviant elmissatge print que hem definit anteriorment
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3259
36 Programacioacuten 29
3523 Com es navega entre instagravencies relacionades
Per exemple tinc una instagravencia iA que teacute un slot anomenat slotB que eacutes una instagravencia drsquoun frame B Vullsaber el nom de la instagravencia associada al slotB de iA Ho pots fer aixiacute
(bind B (send iA get-slotB))(bind res (send B get-nom))
Si estagraves dins drsquouna condicioacute ho pots simplificar de la forma seguumlent
(bind res (send iAslotB get-nom)
Els dos punts soacuten equivalents al punt de Java
36 Programacioacuten
361 Com introduir un comentari
Els comentaris a CLIPS va darrere de un com per exemple
Comentari
Tambeacute podem afegir comentaris a les nostres regles deffacts deftemplates etc Generalment van darrereel nom de la estructura per exemple
1 (defrule neteja regla per la qual si la cuina estagrave bruta srsquoafegiragrave una tasca de2 neteja
3 (estat-cuina bruta)4 =gt5 (assert (tasca netejar))6 )
362 Referenciar el valor null a CLIPS
Per referenciar el valor null a clips es fa amb el simbol nil Per exemple si volem saber si una instagravenciainst es null ho podriacuteem fer de la seguumlent manera
(eq inst nil)
363 Formas de recorrer una lista
Para recorrer una lista disponemos de diferentes opciones en este FAQ explicaremos como crear unaestructura tipo ldquoWHILErdquo y tipo ldquoFORrdquo
1 While Esta regla se ejecuta hasta que la expresioacuten a evaluar sea falsa Este tipo de estructura se rigepor seguir la sintaxis while - do y se construiriacutea de la siguiente forma
(while ltexpresioacutengt[do] ltaccioacutengt)
Doacutende dependiendo del valor de ltexpresioacutengt
Valor TRUE Se realizaraacute la accioacuten ltaccioacutengt i se volveraacute a evaluar ltexpresioacutengt
Valor FALSE No se ejecutaraacute la accioacuten ltaccioacutengt
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3359
30 Capiacutetulo 3 CLIPS
2 For Esta regla sirve para ejecutar un bucle N (final - inicio) veces Este tipo de estructura se rige porseguir la sintaxis loop-for-count y se construiriacutea de la siguiente forma
(loop-for-count (ltvargtltiniciogtltfinalgt) [do] ltaccioacutengt)
Doacutende
ltvargt Variable que se usara como iacutendice
ltiniciogt Valor inicial que tendraacute ltvargt
ltfinalgt Ultimo valor que tendraacute la variable ltvargt
ltaccioacutengt Accioacuten que es realizaraacute hasta que ltvargt tenga el valor de ltfingt
364 Formas de elegir una opcioacuten
En este apartado explicaremos como crear una estructura if y una estructura switch
If Este tipo de estructura se rige por seguir la sintaxis if - then - else y se construiriacutea de lasiguiente forma
(if ltexpresioacutengtthen ltaccioacutengt[else ltaccioacuten2gt])
Doacutende dependiendo del valor de ltexpresioacutengt
bull Valor TRUE Se realizaraacute la accioacuten ltaccioacutengtbull Valor FALSE Se realizaraacute la accioacuten ltaccioacuten2gt (en caso de haber)
Switch Este tipo de estructura se rige por seguir la sintaxis switch - opciones y se construiriacutea dela siguiente forma
(switch ltexpresioacuten-testgt(case OPCION1 then ACCION1)(case OPCION2 then ACCION2)
([default] ACCION-DEFAULT)
)
Doacutende dependiendo del valor de ltexpresioacuten-casegt se ejecutaraacute una ltaccioacutengt en particular Si nin-guna ltopcioacutengt es correcta se ejecutara la ltaccioacuten-defaultgt
365 Funciones con la clase String
Habitualmente trabajaremos con Strings o cadena de Strings CLIPS proporciona una serie de herramien-tas para trabajar con esta clase
1 Convertir string a MAYUacuteSCULAS A veces es conveniente tener todos los caracteres en mayuacutesculaspara no tener problemas de comparaciones o simplemente por convenio Para ello CLIPS dispone dela funcioacuten upcase la cual convierte a mayuacutesculas un siacutembolo o string
(upcase ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplos
(upcase Ccedillips es divertido) rarr CcedilLIPS ES DIVERTIDO
(upcase Clips_es_divertido) rarr CLIPS_ES_DIVERTIDO
2 Convertir string a MINUacuteSCULAS la funcioacuten es downcase
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3459
36 Programacioacuten 31
3 Concatenacioacuten de strings Tambieacuten es de gran utilidad poder juntar dos o maacutes paraacutemetros en un solostring Todo paraacutemetro a juntar deben ser de uno de los siguientes tipos symbol String integer floato instance-name
(str-cat parametro1 parametro2 parametroN )
Ejemplo
(str-cat IA nota 10) rarr IAnota10
4 Comparacioacuten de strings Funcioacuten que nos indica si dos strings son iguales
(str-compareltexpresioacuten-simboacutelica-o-de-cadenagtltexpresioacuten-simboacutelica-o-de-cadenagt
)
Esta funcioacuten devuelve
0 Si ambos strings son iguales1 Si el primer string es mayor que el segundo string-1 Si el primer string es menor que el segundo string
5 Longitud de un string Muchas veces es de gran utilidad saber que tamantildeo tiene un string
(str-length ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplo
(str-length Inteligencia Artificial) rarr 23
366 iquestCoacutemo obtener el contenido de una variable en un string
Para conseguir un string a partir de un integer float symbol instance-name debes utilizar el comandostr-cat Si a la funcioacuten le pasamos como paraacutemetros varios elementos los transformaraacute a string y losconcatenaraacute La sintaxis de esta funcioacuten es la siguiente (str-cat elementos) Esta funcioacuten la usaremossobre todo cuando queramos realizar comparaciones entre el contenido de una variable y un string ya quepreviamente necesitaremos usar la funcioacuten str-cat para pasar el contenido de la variable a string y realizarde este modo la comparacioacuten de forma correcta
367 iquestComo se crea una lista
Con create$ Todos los operadores sobre listas llevan el siacutembolo $ al final Igual que con las variables sedebe usar bind siempre que se desee modificar una lista
(bind lista (create$ a b c))
368 iquestComo borro un elemento de una lista
Con delete$Usa la siguiente sintaxis(delete$ ltlistagt ltindice-iniciogt ltindice-finalgt)Se borraraacuten todos los elementos del rango entre las posiciones inicio y final ambas incluidas Tambieacuten exis-
tedelete-member$ (delete-member$ ltlistagt ltelementogt) Borraraacute todas las apariciones del elemento enla lista
(delete$ (create$ a b c d e f) 3 5) minusrarr (a b f)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1759
14 Capiacutetulo 3 CLIPS
(Primer filtre_preu )
Aquesta condicioacute significa ldquosi el fet (Primer filtre_preu) teacute algun valorrdquo O sigui que si tingueacutessimel fet (Primer filtre_preu ok) es compliria la condicioacute (i si en comptes de ldquookrdquo fos ldquopatatardquo tambeacute escompliria) En canvi si el fet fos uacutenicament (Primer filtre_preu) no es compliria la condicioacute
337 Quegrave significa el dogravelar ($) quan va sol
Eacutes com lrsquointerrogant perograve admet meacutes drsquoun valor Per exemple
(Primer filtre_preu $ ok)
donaragrave cert pels fets de lrsquoestil (Primer filtre_preu patata ok) (Primer filtre_preu hola ok)(Primer filtre_preu patata hola ok) (Primer filtre_preu ok) Eacutes a dir no importa els valors quehi hagi entre filtre_preu i ok si al final hi ha un ok
338 iquestComo puedo ver los hechos presentes en un momento determinado
Abriendo la Facts Window en Window de la barra de menuacute
34 Las reglas
341 iquestCoacutemo construir una regla
Para construir una regla utilizaremos la construccioacuten defrule
Sintaxis
(defrule ltnombre-reglagt [ltcomentariogt][ltdeclaracioacutengt]ltelemento-condicioacutengt Parte izquierda (LHS)
=gtltaccioacutengt) Parte dcha (RHS) de la regla
Una regla consta de un conjunto de condiciones (antecedente) tambieacuten denominados elementos condicio-nales (EC) o parte izquierda (LHS) y de un conjunto de acciones (consecuente) tambieacuten denominado partederecha de la regla (RHS) La regla se activaraacute siempre que se satisfagan todos los EC mediante hechos oinstancias que los cumplan
Si se introduce en la base de reglas una nueva regla con el mismo nombre que el de una existente la nuevaregla reemplazaraacute a la antigua
Si una regla no tiene parte izquierda es decir no tiene elementos condicionales entonces el hecho(initial-fact) actuaraacute como el elemento condicional para ese tipo de reglas y la regla se activaraacute cadavez que se ejecute un comando reset
342 iquestCoacutemo gestionar la parte izquierda (LHS) de una regla
Declarar hechosSi no se especifica ninguna condicioacuten la regla se activaraacute siempre Una condicioacuten puede ser un simple hecho
(Ej vegetariano) o un hecho ordenado con unos valores concretos (Ej (persona (nombre Juan))) Si loque queremos es obtener el valor de un hecho insertaremos una variable en su lugar (Ej (persona (nombre
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1859
34 Las reglas 15
n)) ) Entonces entraraacute en la regla para cada valor posible que pueda asignar a la variable n a partir delos hechos
Si queremos indicar cualquier valor utilizaremos el siacutembolo y para cualquier lista el siacutembolo $ (Ej(evento ) (estilo $) ) Tambieacuten existe la opcioacuten de guardar en una variable una referencia al objetoEllo se consigue poniendo var lt- a su izquierda (Ej p lt- (persona (nombre Juan))) Se puede usarpor ejemplo para pasaacuterselo de paraacutemetro a una funcioacuten llamada en la RHS
Establecer condiciones
Ademaacutes podemos especificar restricciones adicionales sobre los valores que puede tomar un campo de unhecho Existen tres tipos principales de restricciones Conectadas (por orden de precedencia o prioridad)
not (~) Evita que cierto campo cumpla determinada restriccioacuten
and (amp) Combina dos restricciones conjuntivamente
or (|) Combina dos restricciones disjuntivamente
De predicado () Obliga a que cierto campo cumpla determinada condicioacuten (especificada por el predicado)
Por valor devuelto por una funcioacuten = Permite llamar a una funcioacuten y utilizar el valor devuelto pararestringir el valor que pueda tomar un campo de un hecho
Se puede comprobar si se cumple una determinada condicioacuten mediante el constructor test Dentro detest se pueden hacer llamadas a cualquier funcioacuten o predicado ya sea primitiva de CLIPS o definidapor nosotros
Combinar elementos
Los diferentes elementos de la parte izquierda van impliacutecitamente unidos mediante una AND que indicaconjuncioacuten No obstante podemos hacerlo expliacutecitamente mediante (and (cond1) (cond2)) aunque suelen
utilizarse para anidar ANDs dentro de ORsOR Sirve para hacer una disyuncioacuten (or (cond1) (cond2)) Es equivalente a escribir varias reglas en lasque cada una de ellas tenga uno de los componentes del OR en su parte izquierda y la misma parte derecha
NOT Sirve para detectar si no existe un determinado hecho (Ej (not (estilo sibarita)))exists Cuando a un conjunto de elementos se le antecede exists se comprueba que hay al menos un
hecho en la base de hechos que cumpla la condicioacuten (Ej (exists(bebida precio (ltprecio 5))) )forall Permite comprobar si todos los hechos que satisfacen un determinado patroacuten cumplen una serie
de condiciones (Ej (forall(plato (estilo moderno)))
343 iquestCoacutemo obtener la direccioacuten de hechos o instancias situados en LHS
En algunas ocasiones vamos a necesitar realizar alguacuten tipo de accioacuten en la parte derecha de las reglassobre hechos o instancias que cumplan unas determinadas condiciones Pero para ello necesitaremos primerotener acceso a estos elementos para despueacutes poder operar sobre ellos Esto lo conseguiremos guardando ladireccioacuten del elemento en una variable hacieacutendolo del siguiente modo
variable_direccion lt- (elemento)
Pongamos un ejemplo para ver realmente el funcionamiento y uso de esta posibilidad que CLIPS nosofrece
1 (defrule imprime-area2 instancia lt- (object (is-a Rectangulo))3 =gt4 (printout t Area del rectangulo (instance-name instancia)5 (send instancia calcula-area) crlf)6 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1959
16 Capiacutetulo 3 CLIPS
Cuando se ejecuta esta regla se imprimiraacuten las aacutereas de todas las instancias de la clase Rectangulo Enla parte izquierda de la regla lo que hacemos es guardar en la variable instancia la direccioacuten de la instanciade Rectangulo que estamos tratando en ese momento La regla se ejecutaraacute para todas las instanciasalmacenadas en la memoria de trabajo que cumplan la condicioacuten (is-a Rectangulo) es decir para todaslas instancias de la clase Rectangulo En la parte derecha de la regla donde se ejecutan las acciones podemosver que se imprimiraacute para cada instancia lo siguiente Area del rectangulo [nombre_instancia] aacuterea
del rectaacutengulo La funcioacuten instance-name nos devuelve el nombre de la instancia que le pasamos porparaacutemetro Ademaacutes hemos llamado al gestor de mensajes calcula-area para que nos devuelva el area delrectaacutengulo
344 iquestCoacutemo hacer sentencias or en la izquierda de las reglas
Con (or ) Si por ejemplo tenemos dos hechos (a) y (b) y queremos ejecutar la derecha de la reglacuando se cumpla uno de los dos tendremos que hacer (or (a) (b)) Atencioacuten porque la parte derecha seejecutaraacute tantas veces como veces se cumpla cada uno de los hechos si para nosotros existe tanto (a) como(b) la parte derecha se ejecutaraacute dos veces Para que soacutelo se usa una vez podemos hacer combinaciones de
or y and (funciona igual) o usar un patroacuten por ejemplo (persona Juan|Pedro) soacutelo se ejecutariacutea una vez
345 Com afegir una condicioacute a la part esquerre drsquouna regla
A vegades eacutes necessari que una regla srsquoinstanciiuml si es produeix una condicioacute especial (i no un fet) Per feraixoacute farem servir la comanda (test ltCONDICIOgt)
Per exemple imaginem que la nostre base de fets compte amb un fet (preu valor) amb un preudeterminat Imaginem que volem una regla que srsquoinstanciiuml quan aquest valor eacutes meacutes gran que 30
Per fer-ho fent servir tot el que hem explicat
1 (defrule preucar2 (preu preu)3 (test (gt preu 30))4 =gt5 (printout t El preu es mes gran que 30)6 )
Eacutes a dir si el preu eacutes meacutes gran que 30 srsquoimprimiragrave un missatge per pantallaAquestes condicions poden contenir ANDs i ORs de varies condicionsPer exemple
1 (defrule preulimit2 (preu preu)3 factminim lt- (preuminim minim)4 factmax lt- (preumaxim maxim)5 (test (and (gt preu minim) (lt preu maxim) ))6 =gt7 (retract factminim)8 (retract factmax)9 (printout t El preu estagrave dintre del rang)
On comprovarem si el preu estagrave dintre drsquoun rang determinat i en aquest cas esborra els fets que contenen
el magravexim preu i el miacutenim preu i mostra un missatge per pantalla
346 Puede una misma regla ejecutarse maacutes de una vez
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2059
34 Las reglas 17
Es muy importante entender que cada regla se ejecutaraacute una vez por cada combinacioacuten de valores en suLHS
1 (defrule regla2 (color col)3 (peso pes)4 =gt5
Si tengo tres colores y dos pesos asertados la regla se ejecutaraacute 6 veces una con cada combinacioacuten decolor y peso
347 Com puc definir lrsquoordre de les regles
La idea drsquoun sistema basant en regles eacutes no definir un ordre lineal drsquoaquestes (costa deixar de pensar de
forma iterativa)En el cas de necessitar que una regla srsquoexecuti despreacutes drsquouna altre pots fer servir Fets la regla anteriorcrea un fet que la segona regla tindragrave a la part esquerra
1 (defrule pregunta12 =gt3 (assert (pregunta1Feta))4 5 )6
7 (defrule pregunta2
8 (pregunta1Feta)9 =gt
10 11 )
I finalment pots usar la propietat salience Aquesta propietat indica la prioritat drsquoexecucioacute de les regles( les regles amb salience majors srsquoexecutaran abans ) Pot prendre valors positius i negatius entre -10000 y+10000 Per defecte les regles tenen salience 0
1 (defrule pregunta12 (declare (salience 2))3 =gt4 5 )6
7 (defrule pregunta28 (declare (salience 1))9 =gt
10 11 )
El valor indicado en la propiedad salience puede ser el nuacutemero directamente o una expresioacuten por ejemplovariable10 podemos usar variable para elegir que regla se ejecutaraacute
Las prioridades deben ser usadas solo para determinar el orden en el que se disparan algunas reglas sobreotras no para fijar el flujo de control ya que la principal ventaja de un sistema basado en reglas es larepresentacioacuten declarativa del conocimiento y de esta forma abusando de las prioridades conduce a unsistema procedimental
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2159
18 Capiacutetulo 3 CLIPS
348 Com forccedilar que una regla sigui la primera
Per que aquesta regla sigui la primera ha de tenir el salience meacutes gran de totes
1 (defrule presentacio2 (declare (salience 20))3 =gt4 (printout t ------ Benvingut ----- crlf)5 )
349 Vull guardar certs valors que es fan servir durant lrsquoexecucioacute de diferents regles Com hopuc fer
Tens principalment dues alternatives Si el valor eacutes un tipus bagravesic pots fer servir una variable global ambla sintaxi seguumlent
(defglobal nom_variable = valor)
Aquesta sentegravencia no va a dins de cap funcioacute ni regla es posa sola a la part que creguis convenient delcodi Vegem un exemple
(defglobal preu_minim_primer = 1000)
Per fer-la servir es fa exactament de la mateixa manera que amb una variable normal perograve has de posarels dos asteriscs Per exemple
(bind preu_minim_primer curr-preu)
Per altra banda si el valor o valors que vols guardar han de ser instagravencies una bona estrategravegia pot serutilitzar un deftemplate Eacutes uacutetil sobretot per anar guardant solucions temporals o llistes drsquoelements quepoden formar part de la solucioacute
Per utilitzar-ho has de seguir els passos seguumlents
1 Definir el deftemplate
(deftemplate nom_del_deftemplate(multislot nom_multislot)
(slot nom_slot)
)
Amb un exemple es veuragrave meacutes clar
(deftemplate llista-plats(multislot primers)(multislot segons)(multislot postres)
)
2 Inicialitzar el deftemplate
(defrule[condicions vagraveries] La condicioacute base eacutes que llista-plats no srsquoha inicialitzat encara
(not (llista-plats))=gt
llista conteacute els valors de llista-plats (que de moment estan buits)(bind llista (assert (llista-plats)))
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2259
35 Las clasesinstancias 19
3 Assignar-li valors
(bind segons_plats (find-all-instances ((plat Plat)) TRUE)(modify llista (segons segons_plats))
4 Recuperar els valors
(defrule[condicions vagraveries]llista lt- (llista-plats (segons $segons_plats))
=gt
Ara la variable $segons_plats conteacute tots els elements de segons
35 Las clasesinstancias
351 Tengo que representar la jerarquiacutea de un frame iquestEs preferible antildeadir las subclases a laontologiacutea o bien diferenciarlas mediante un slot en la superclase
Las dos formas son vaacutelidas pero es recomendable representarlas en clases separadas cuando se vayan abuscar instancias de ese tipo ya que asiacute no tendremos que hacer un recorrido por todas las de la superclaseNo obstante si soacutelo se trata de una caracteriacutestica puntual del frame y no vamos a hacer buacutesquedas de unaexclusiva subclase entonces seraacute maacutes eficiente antildeadir un slot debido a su mejor accesibilidad
352 iquestQueacute es un objeto
Podriacuteamos decir que un objeto es un hecho no ordenado con herencia
353 iquestPorqueacute usar objetos en contexto de la praacutectica de CLIPS de IA
Como bien sabemos una parte de la praacutectica de SBCrsquos consisten en crear la ontologiacutea Esta ontologiacutease exporta para poder interactuar con CLIPS en formato pins y pont El archivo pont contendraacute ladeclaracioacuten de todas las clases creadas previamente por Protege (defclass ) El archivo pins contendraacute
todas las instancias de las clases declaradas en el archivo pont Como puede intuir el lector se necesitaraacuteinteractuar con los objetos previamente creados por Protegravegegrave
354 Como se definen las clases
Para definir las clases usaremos el constructor defclass
(defclass ltnombregt [ltcomentariogt](is-a ltnombre-de-superclasegt)[(role concrete | abstract)]
[(pattern-match reactive | non-reactive)]ltslotgt definicioacuten de los atributos de la clase
ltdocumentacioacuten-handlergt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2359
20 Capiacutetulo 3 CLIPS
En caso de desear que la nueva clase herede las propiedades de otra ya existente el nombre de esta deberaacuteespecificarse despues de is-a El rol determinaraacute si la clase es concreta (se puede instanciar) o abstracta(destinada a ser superclase) El pattern-match debe declararse como reactivo si se desea que las instanciasde la clase puedan unificar con los elementos objeto de las reglas (siacutembolo lt-) Los slots correspondena los atributos de la clase y los handlers a las funciones de eacutesta Los handlers se pueden declarar en ladeclaracioacuten de la propia clase pero se deben definir externamente Dado que no aporta ninguna ventaja
declararlos es recomendable definirlos directamente Noacutetese que todo aquello que estaacute entre corchetes ([])constituye informacioacuten adicional que no es obligatorio especificar
1 (defclass Persona2 (is-a Ser_Vivo)3 (role concrete)4 (single-slot edad5 (type INTEGER)6 (range 1 99)7 (cardinality 0 1)8 (create-accessor read-write)9 )
10 (multislot amigos11 (type INSTANCE)12 (allowed-classes Persona)13 )14 )
El comportamiento y declaracioacuten de los slots es ideacutentico al de los slots de los hechos ordenados Losatributos de tipo INSTANCE (referencian otras instancias) estan en formato INSTANCE-NAME
355 Com consulto una instagravencia a partir drsquouna regla
Podem fer servir la part esquerre drsquouna regla per trobar instagravencies Lrsquouacutes eacutes molt semblant a trobar elpunter a un fet fent servir
(object [(is-a ltNOM_CLASSEgt)|(name ltNOM_INSTANCIA)|(ltNOM-SLOTgt ltVALORVARIABLE))])
Per exemple si volem que una regla srsquoinstanciiuml si tenim instanciat un plat de la classe Plat podriem ferservir
1 (defrule tenimplat2 plat lt- (object (is-a Plat))3 =gt4 (print t (send plat get-nom) crlf)
La regla imprimiragrave el nom del plat que trobi Eacutes important notar que srsquoactivaragrave per cada instagravencia de platque tinguem a la base de coneixement
Podem consultar els valors de la instancia fent servir condicions a la part esquerre de la regla Per exemplesi nomeacutes volgueacutessim els plats amb un preu meacutes gran que 30
1 (defrule platCar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Srsquoactivaragrave per tots els plats amb un preu major a 30
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2459
35 Las clasesinstancias 21
Srsquoha drsquoanar amb cura per aquest tipus de regla ja que si la base de coneixement eacutes molt amplia pot acabarderivant amb problemes de memograveria
Per exemple si en comptes de preguntar per una instagravencia de Plat pregunteacutessim per dues instancies dePlat
1 (defrule platsCars2 plat1 lt- (object (is-a Plat) (Preu p1))3 plat2 lt- (object (is-a Plat) (Preu p2))4 (test (gt p1 30))5 (test (gt p2 30))6 =gt7 (print t (send plat1 get-nom) i (send plat1 get-nom) soacuten cars8 crlf)9 )
Faria unificacioacute amb totes les combinacions possibles (amb repeticions) de dos plats de tota la base deconeixement Aixograve es podria anar ampliant fins fer-se intractable
Si tenim drsquoalguna manera el nom de la instancia podem fer
1 (defrule platPicant2 (cuina (plat p))3 (object (name p) (picant pi))4 =gt5 (print t picant pi crlf)6 )
Aixoacute es pot servir per crear condicions que facin servir noms drsquoinstancies que tenim almacenats a slotsdrsquoaltres instancies per exemple
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send v get-Preu) crlf)6 )
Aquesta regla imprimiria el preu del vi asociat al plat si es negre
356 Tengo problemas en condiciones de reglas con slots de instancias obtenidos con send
A veces dan problemas las reglas en las que las condiciones sobre los valores de los slots de una instanciase escriben usando mensajes get sobre los atributos de una instancia en lugar de utilizar patrones paraobtenerlos por ejemplo la regla
1 (defrule platcar2 plat lt- (object (is-a Plat) )3 (test (gt (send plat get-Preu) 30))4 =gt5 (print t (send plat get-nom) es car6 crlf)7 )
No funciona correctamente en CLIPS pero la regla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2559
22 Capiacutetulo 3 CLIPS
1 (defrule platcar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Siacute lo haceEn el caso de que el valor del slot sea booleano se puede escribir la regla como
1 (defrule platpicant2 plat lt- (object (is-a Plat) (Picant TRUE))3 =gt4 (print t (send plat get-nom) es picant crlf)
En el caso de que el slot sea a su vez una instancia se puede utilizar para obtener los valores de estainstancia en la condicion como se explica en la pregunta anterior
357 Tengo problemas con instancias obtenidas del slot de otra instancia en el patroacuten de unaregla
Este problema aparece cuando el patron de una regla instancia una variable a un nombre de instancia yesta no esta definida en el modulo de la regla por ejemplo si la regla siguiente pertenece a un modulo queno es el de la instancia
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4
=gt5 (print t preu (send v get-Preu) crlf)6 )
La regla se quejaraacute de que la instancia no existe al enviarle el send ya que solo se busca la instancia dentrodel moacutedulo de la regla y no en los importados Para arreglar esto se puede usar la funcioacuten (instance-address[ltMODULOgt|] ltINSTANCIAgt) que busca la direccion de la instancia en un modulo concreto o en todos losmoacutedulos que se importan () Deberiacuteamos entonces escribir la regla
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send (instance-address v) get-Preu) crlf)6 )
358 iquestCoacutemo realizar una buacutesqueda de instancias que cumplan unas restricciones
CLIPS nos ofrece varias funciones de buacutesqueda de instancias que cumplan unas determinadas restriccionesque a nosotros nos interese
La funcioacuten find-instance Esta funcioacuten devuelve la primera instancia que cumple todas las restric-ciones indicadas
La funcioacuten find-all-instances Esta funcioacuten devuelve todas las instancias que cumplen las restric-ciones indicadas
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2659
35 Las clasesinstancias 23
La sintaxis de ambas funciones es igual exceptuando el nombre de la funcioacuten(find-all-instances (clase_instancias) (restricciones))A continuacioacuten se muestran varios ejemplos
(bind rectangulos (find-all-instances ((inst Rectangulo)) (gtinstaltura 10))) Des-pueacutes de ejecutar esta funcioacuten en la variable rectangulos habraacute una lista con todas las instancias de la
clase Rectangulo cuya altura sea superior a 10(bind rectangulos (find-all-instances ((inst Rectangulo)) (and (gtinstaltura 10) (=instanchura 7)))) Este trozo de coacutedigo hace que en la variable rectangulos se guarde una listade las instancias de la clase Rectangulo que tienen una altura superior a 10 y una anchura igual a 7
Estas funciones que CLIPS nos ofrece tienen otra funcionalidad y es que podemos realizar buacutesquedas deconjuntos de instancias
(bind rectangulos (find-all-instances ((a Rectangulo) (b Rectangulo)) (= aalturabaltura))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas de instancias de laclase Rectangulo que tienen la misma altura
Por uacuteltimo es necesario comentar que se pueden realizar buacutesquedas de conjuntos de instancias que seande distintas clases
(bind figuras (find-all-instances ((rect Rectangulo) (circ Circulo)) (= rectalturacircradio))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas ltrectangulocirculogtque cumplan que la altura del rectaacutengulo sea igual al radio del ciacuterculo
Existen maacutes comandos para obtener instancias pero son menos utilizadas a nivel baacutesico como pueden serany-instancep do-for-instance do-for-all-instances y delayed-do-for-all-instances
359 iquestCoacutemo se interactuacutea con objetos
La interaccioacuten con objetos se efectuacutea mediante lo que se denomina mensaje
(defmessage-handlerltnombre-clasegtltnombre-mensajegt[lttipo-handlergt] [ltcomentariogt]ltparaacutemetrogt [ltparaacutemetro-comodiacutengt])ltaccioacutengt
)
Un gestor de mensajes consta de 7 partes
1 Nombre de clase a la que el gestor estaraacute asociado
2 Nombre del mensaje
3 Tipo de gestor (Nosotros habitualmente usaremos primary que viene por defecto)
4 Comentario (opcional)
5 Lista de paraacutemetros6 Paraacutemetro comodiacuten (para gestionar muacuteltiples paraacutemetros)
7 Secuencia de acciones o expresiones que seraacuten ejecutadas por el gestor
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2759
24 Capiacutetulo 3 CLIPS
Enfocado a la praacutectica de CLIPS la maacutes comuacuten es que queramos interactuar con objetos para
1 Imprimir los objetos Un ejemplo
1 (defmessage-handler avion imprimir-beneficio ()
2 Para implementar funciones calculadas asociadas al objeto Un ejemplo
1 (defmessage-handler avion calcular-beneficio ()2 ( selfplazas-ocupadas selfprecio-billete))3 )
Como se puede observar el paraacutemetro impliacutecito self contiene la instancia activa para este mensaje
3510 iquestComo se interactuacutea con las instancias de los objetos
Podremos interactuar entre las instancias de los objetos mediante la funcioacuten send
(send ltexpresioacuten-de-objetogtltnombre-de-mensajegtltexpresioacutengt)Donde se toman como argumentos el objeto destino del mensaje el mensaje mismo y otros paraacutemetros
que debieran ser pasados a los gestoresParticularmente en el aacutembito de la praacutectica usualmente necesitaremos utilizar el envioacute de mensajes de
tipo get put and delete Estos mensajes tiene la siguiente sintaxis
get-ltnombre-atributogt
put-ltnombre-atributogt
delete
Aquiacute tenemos un ejemplo de como utilizarlo recordando que ponemos entre corchetes la instancia la cualse enviacutea el mensaje
(defclass avion (is-a USER)(role concrete)(slot precio-billete (create-accessor read) (default 34))(slot plazas-ocupadas (create-accessor write) (default 0)))
Clase creada
gt(make-instance a of avion) Creacioacuten de una instancia de avion[a]
gt(send [a] get-precio-billete) Obtencioacuten de un slot34 Resultado obtenidogt(send [a] put-plazas-ocupadas 100) Modificacioacuten de un slotgt(send [a] delete) Eliminacioacuten de la instanciaTrue
3511 Uso de make-instance
Cuando queremos crear una instancia de una clase para ir rellenandola con los resultados o datos quevayamos obteniendo se haria lo siguiente
(bind variable_instancia (make-instance nombre_instancia of nombre_clase))
Una vez creada podemos jugar con dicha instancia en las diferentes reglas siempre que la llamemos enlos activadores
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2859
35 Las clasesinstancias 25
(defrule reglavar_instancia lt- (object (is-a nombre_clase))=gt
)
De esta manera dentro de la regla podemos hacer acciones con la instancia por ejemplo(send var_instancia put-articulo articulo_ejemplo)
3512 Como generar automaacuteticamente nombres de instancia
En ocasiones queremos crear instancias en reglas y queremos que su nombre sea distinto del de otrasque ya tenemos Para ello podemos utilizar las funciones gensym y gensym La primera genera un siacutembolodel estilo genN donde N es un nuacutemero La segunda hace lo mismo pero aseguraacutendose de que ese siacutembolono exista ya Se puede reiniciar el contador que usan estas dos funciones con el operador (setgen ltnumgt)donde ltnumgt es el nuacutemero por el que queremos que empiecen ahora los siacutembolos
Para usar esto para generar el nombre de una instancia podemos hacer
(make-instance (gensym) of ltclasegt)
Cada vez que se ejecute se generaraacute un nombre de instancia nuevoSi creamos instancias de diferentes clases y queremos que las instancias tengan nombres que podamos
identificar podemos concatenar siacutembolos a los siacutembolos generados por gensym por ejemplo
(make-instance (sym-cat pepe- (gensym)) of ltclasegt)
generaraacute una instancia con el nombre pepe-genN
3513 Com fer un getset drsquoun slot drsquouna classe
Per consultar el valor drsquoun slot drsquouna classe ho podem fer enviant-li un missatge de la seguumlent manera
(send ltVARIABLEgt get-ltNOM_ATRIBUTgt)
Per exemple si tenim una instagravencia de la classe Plat ( instancia ) i volem saber el valor del seu slotnom
(send instancia get-nom)
Per assignar un valor a un slot drsquouna drsquoinstagravencia hem drsquoenviar-li un missatge de la seguumlent manera
(send ltVARIABLEgt put-ltNOM_ATRIBUTgt ltVALORgt)On ltVALORgt pot ser un valor o un megravetode que retorni un valor
(send instancia put-nom nom)
3514 iquestCoacutemo acceder a una instancia cuyo nombre conocemos
Si conocemos el nombre de una instancia y necesitamos acceder a ella es decir necesitamos enviarle alguacutenmensaje mediante la funcioacuten send podemos hacerlo directamente escribiendo en lugar de la variable quealmacena la instancia el nombre de la instancia entre corchetes [ ] A continuacioacuten se muestra un ejemplo
(bind altura_rect1 (send [rect1] get-altura))
En este caso se guardaraacute en la variable altura_rect1 el valor de la altura de la instancia que tiene comonombre rect1
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2959
26 Capiacutetulo 3 CLIPS
3515 Obtenir el nom drsquouna classe
Si tenim una instagravencia drsquouna classe i volem saber el nom de la classe (uacutetil si tenim una bona taxonomiade classes) ho podem fer amb el megravetode (class ltINSTANCIAgt)
Si per exemple imaginem que tenim la classe Actor la qual teacute com subclasses la classe APrincipalASecundari i ACameo Imaginem que estem tractant amb instancies drsquoactors i volem saber si la instanciaque estem tractant es de la classe APrincipal
Ho hauriacuteem de fer de la seguumlent manera
(eq (class instancia) APrincipal)
Fixem-nos que APrincipal eacutes un siacutembol no un String (un truco eacutes fixar-se en que no teacute cometes) Si vol-gueacutessim comparar-ho amb un String (per exemple un String introduiumlt per lrsquousuari) ho podriacuteem transformara un String amb el megravetode str-cat
(eq (str-cat (class instancia)) Principal)
3516 Como convierto un INSTANCE-ADRESS en un INSTANCE-NAME
En alguacuten momento nos podemos encontrar con la situacioacuten de que disponemos de un puntero a unainstancia y necesitamos su nombre o lo contrario En ambos casos podemos usar la funcioacuten instance-nameSu funcionamiento es bidireccional podemos introducirle un instance-name y nos devolveraacute un instance-adress y viceversa
1 (defrule imprimir-nombre2 estlt-(object (is-a Estudiante) (edad 25))3 =gt4 (printout t (instance-name est) crlf)5
)
3517 Com iterar a traveacutes drsquoun multi-slot
El seguumlent tambeacute eacutes vagravelid com exemple de com iterar a traveacutes drsquouna llistaImaginem que tenim una instagravencia de la classe Plat a la varible (plat) la qual teacute un multi-slot drsquoinstagravencies
de la classe Ingredient Imaginem que volem imprimir per pantalla el nom drsquoaquests ingredients (slot nomde la classe Ingredient) Necessitarem iterar sobre la llista drsquoingredients
1 (bind i 1)2 (while (lt= i (length$ (send plat get-ingredients)))3 do4 (bind ingredient (nth$ i (send plat get-ingredients)))5 (printout t (send ingredient get-nom) crlf)6 (bind i (+ i 1))7 )
El megravetode (nth$ ltINDEXgtltLLISTAgt) et retorna lrsquoelement situat a INDEX de LLISTAEl megravetode (length$ ltLLISTAgt) retorna el nuacutemero drsquoelements de LLISTA
3518 Coacutemo modificarinsertarborrar valores en un multislot
Los valores de un multislot se pueden cambiar usando la funcioacuten slot-replace$ La sintaxis es la siguiente
(slot-replace$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt ltvalorgt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3059
35 Las clasesinstancias 27
Donde ltiniciogt y ltfingt son el rango de posiciones del multislot que se quiere modificar y ltvalorgtson los valores que queremos reemplazar Obviamente deberaacute haber tantos valores como posiciones hayamosindicado en el rango
Para insertar nuevos valores podemos usar la funcioacuten slot-insert$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltposgt ltvalorgt)
El valor se inserta delante de la posicioacuten indicada si la posicioacuten es mayor que la longitud del multislot secolocaraacute al final
Para borrar elementos de un multislot podemos usar la funcioacuten slot-delete$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt)
Se borraraacuten los elementos que estaacuten en el rango indicado
3519 Coacutemo recorrer un atributo multievaluado
Supongamos que la variable respuesta tiene una lista de instancias
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 aquiacute hacemos lo que queramos4 )5 )
Loop-for-count funciona como un for primero la variable que haraacute de contador luego el valor de origeny luego el valor final Para controlar el final usamos la funcioacuten que he explicado antes i tomaraacute valoresdesde 1 hasta n asiacute que usando la funcioacuten nth$ obtendremos cada uno de los elementos La variable auxiraacute teniendo cada uno de los valores
3520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz)
Es igual que antes pero con dos bucles
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 (bind aux2 (send aux get-slot_que_queremos))4 (loop-for-count (j 1 (length$ aux2)) do5 (bind aux_final (nth$ j aux2))6 aquiacute ya podemos trabajar con el elemento en concreto7 )8 )
Supongamos que respuesta tiene una lista de instancias con el primer bucle haremos lo mismo que antes ir
iterando por esas instancias Una vez que tenemos cada instancia con aux2 con el segundo bucle iteraremosdentro de sus instancias interiores
Por ejemplo si tenemos varios equipos de fuacutetbol y cada equipo tiene varios jugadores en el primer bucleestamos iterando entre los equipos y en el segundo entre los jugadores de cada equipo en particular
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3159
28 Capiacutetulo 3 CLIPS
3521 Com puc esborrar una instagravencia
Per esborrar una instagravencia (per exemple segons la informacioacute que proporcioni lrsquousuari podem deduir queuna segraverie drsquoinstagravencies eacutes impossible que es facin servir per a la solucioacute) ho podem fer enviant un missatgedelete a la instagravencia eacutes a dir (send ltINSTANCIAgtdelete)
(send inst delete)
Un megravetode que podria ser uacutetil de la cara a la pragravectica podria ser el seguumlent
1 (defrule elimina-instancia2 (declare (salience 10))3 elimina-fact lt- (elimina-inst inst)4 =gt5 (send inst delete)6 (retract elimina-fact)
Imaginem que per exemple que volem eliminar una llista drsquoinstagravencies Per eliminar-les podriacuteem recoacuterrerel llistat marcant les instagravencies que volem esborrar afegint el seguumlent fet
(assert (elimina-instancia inst))
Aixiacute com que elimina-instancia teacute un salience alt esborraria les instagravencies marcades quan tingueacutes ocasioacuteDrsquoaquesta manera ens estalviem el problema de recoacuterrer un llistat drsquoinstagravencies amb un iterador mentre
anem eliminant els elements de la llista cosa que pot donar problemes amb lrsquoiterador
3522 Com imprimir una instagravencia
Per imprimir una classe (uacutetil per exemple per mostrar el resultat final) el millor eacutes definir message-handlersPer exemple imaginem que tenim una classe Plat la qual teacute un slot nom de tipus String Si volgueacutessimimprimir per pantalla un missatge que digueacutes
El nom del plat eacutes ndashltnom del platgtndash
Hauriacuteem de definir un message-handler que simplement imprimiacutes per pantalla el valor de lrsquoslot de laforma
(defmesssage-handler ltCLASSNAMEgt ltMESSAGENAMEgt primary ()ltCODIgt
)
Per el cas de lrsquoexemple
1 (defmessage-handler Plat print primary ()2 (printout t -- selfnom --) )3 )
Per cridar-ho nomeacutes caldragrave enviar-li un missatge a la instagravencia amb el nom del message-handler (enaquest cas print)
(send instancia print)
Un message-handler pot cridar a altres message-handlers amb el que es poden encadenar diverses instagraven-cies Per exemple imaginem que tenim la classe Menuacute la qual teacute un atribut plats que eacutes un llista drsquoinstagravenciesde la classe Plat Dintre del message-handler menuacute podriacuteem iterar a traveacutes de la llista de plats enviant elmissatge print que hem definit anteriorment
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3259
36 Programacioacuten 29
3523 Com es navega entre instagravencies relacionades
Per exemple tinc una instagravencia iA que teacute un slot anomenat slotB que eacutes una instagravencia drsquoun frame B Vullsaber el nom de la instagravencia associada al slotB de iA Ho pots fer aixiacute
(bind B (send iA get-slotB))(bind res (send B get-nom))
Si estagraves dins drsquouna condicioacute ho pots simplificar de la forma seguumlent
(bind res (send iAslotB get-nom)
Els dos punts soacuten equivalents al punt de Java
36 Programacioacuten
361 Com introduir un comentari
Els comentaris a CLIPS va darrere de un com per exemple
Comentari
Tambeacute podem afegir comentaris a les nostres regles deffacts deftemplates etc Generalment van darrereel nom de la estructura per exemple
1 (defrule neteja regla per la qual si la cuina estagrave bruta srsquoafegiragrave una tasca de2 neteja
3 (estat-cuina bruta)4 =gt5 (assert (tasca netejar))6 )
362 Referenciar el valor null a CLIPS
Per referenciar el valor null a clips es fa amb el simbol nil Per exemple si volem saber si una instagravenciainst es null ho podriacuteem fer de la seguumlent manera
(eq inst nil)
363 Formas de recorrer una lista
Para recorrer una lista disponemos de diferentes opciones en este FAQ explicaremos como crear unaestructura tipo ldquoWHILErdquo y tipo ldquoFORrdquo
1 While Esta regla se ejecuta hasta que la expresioacuten a evaluar sea falsa Este tipo de estructura se rigepor seguir la sintaxis while - do y se construiriacutea de la siguiente forma
(while ltexpresioacutengt[do] ltaccioacutengt)
Doacutende dependiendo del valor de ltexpresioacutengt
Valor TRUE Se realizaraacute la accioacuten ltaccioacutengt i se volveraacute a evaluar ltexpresioacutengt
Valor FALSE No se ejecutaraacute la accioacuten ltaccioacutengt
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3359
30 Capiacutetulo 3 CLIPS
2 For Esta regla sirve para ejecutar un bucle N (final - inicio) veces Este tipo de estructura se rige porseguir la sintaxis loop-for-count y se construiriacutea de la siguiente forma
(loop-for-count (ltvargtltiniciogtltfinalgt) [do] ltaccioacutengt)
Doacutende
ltvargt Variable que se usara como iacutendice
ltiniciogt Valor inicial que tendraacute ltvargt
ltfinalgt Ultimo valor que tendraacute la variable ltvargt
ltaccioacutengt Accioacuten que es realizaraacute hasta que ltvargt tenga el valor de ltfingt
364 Formas de elegir una opcioacuten
En este apartado explicaremos como crear una estructura if y una estructura switch
If Este tipo de estructura se rige por seguir la sintaxis if - then - else y se construiriacutea de lasiguiente forma
(if ltexpresioacutengtthen ltaccioacutengt[else ltaccioacuten2gt])
Doacutende dependiendo del valor de ltexpresioacutengt
bull Valor TRUE Se realizaraacute la accioacuten ltaccioacutengtbull Valor FALSE Se realizaraacute la accioacuten ltaccioacuten2gt (en caso de haber)
Switch Este tipo de estructura se rige por seguir la sintaxis switch - opciones y se construiriacutea dela siguiente forma
(switch ltexpresioacuten-testgt(case OPCION1 then ACCION1)(case OPCION2 then ACCION2)
([default] ACCION-DEFAULT)
)
Doacutende dependiendo del valor de ltexpresioacuten-casegt se ejecutaraacute una ltaccioacutengt en particular Si nin-guna ltopcioacutengt es correcta se ejecutara la ltaccioacuten-defaultgt
365 Funciones con la clase String
Habitualmente trabajaremos con Strings o cadena de Strings CLIPS proporciona una serie de herramien-tas para trabajar con esta clase
1 Convertir string a MAYUacuteSCULAS A veces es conveniente tener todos los caracteres en mayuacutesculaspara no tener problemas de comparaciones o simplemente por convenio Para ello CLIPS dispone dela funcioacuten upcase la cual convierte a mayuacutesculas un siacutembolo o string
(upcase ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplos
(upcase Ccedillips es divertido) rarr CcedilLIPS ES DIVERTIDO
(upcase Clips_es_divertido) rarr CLIPS_ES_DIVERTIDO
2 Convertir string a MINUacuteSCULAS la funcioacuten es downcase
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3459
36 Programacioacuten 31
3 Concatenacioacuten de strings Tambieacuten es de gran utilidad poder juntar dos o maacutes paraacutemetros en un solostring Todo paraacutemetro a juntar deben ser de uno de los siguientes tipos symbol String integer floato instance-name
(str-cat parametro1 parametro2 parametroN )
Ejemplo
(str-cat IA nota 10) rarr IAnota10
4 Comparacioacuten de strings Funcioacuten que nos indica si dos strings son iguales
(str-compareltexpresioacuten-simboacutelica-o-de-cadenagtltexpresioacuten-simboacutelica-o-de-cadenagt
)
Esta funcioacuten devuelve
0 Si ambos strings son iguales1 Si el primer string es mayor que el segundo string-1 Si el primer string es menor que el segundo string
5 Longitud de un string Muchas veces es de gran utilidad saber que tamantildeo tiene un string
(str-length ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplo
(str-length Inteligencia Artificial) rarr 23
366 iquestCoacutemo obtener el contenido de una variable en un string
Para conseguir un string a partir de un integer float symbol instance-name debes utilizar el comandostr-cat Si a la funcioacuten le pasamos como paraacutemetros varios elementos los transformaraacute a string y losconcatenaraacute La sintaxis de esta funcioacuten es la siguiente (str-cat elementos) Esta funcioacuten la usaremossobre todo cuando queramos realizar comparaciones entre el contenido de una variable y un string ya quepreviamente necesitaremos usar la funcioacuten str-cat para pasar el contenido de la variable a string y realizarde este modo la comparacioacuten de forma correcta
367 iquestComo se crea una lista
Con create$ Todos los operadores sobre listas llevan el siacutembolo $ al final Igual que con las variables sedebe usar bind siempre que se desee modificar una lista
(bind lista (create$ a b c))
368 iquestComo borro un elemento de una lista
Con delete$Usa la siguiente sintaxis(delete$ ltlistagt ltindice-iniciogt ltindice-finalgt)Se borraraacuten todos los elementos del rango entre las posiciones inicio y final ambas incluidas Tambieacuten exis-
tedelete-member$ (delete-member$ ltlistagt ltelementogt) Borraraacute todas las apariciones del elemento enla lista
(delete$ (create$ a b c d e f) 3 5) minusrarr (a b f)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1859
34 Las reglas 15
n)) ) Entonces entraraacute en la regla para cada valor posible que pueda asignar a la variable n a partir delos hechos
Si queremos indicar cualquier valor utilizaremos el siacutembolo y para cualquier lista el siacutembolo $ (Ej(evento ) (estilo $) ) Tambieacuten existe la opcioacuten de guardar en una variable una referencia al objetoEllo se consigue poniendo var lt- a su izquierda (Ej p lt- (persona (nombre Juan))) Se puede usarpor ejemplo para pasaacuterselo de paraacutemetro a una funcioacuten llamada en la RHS
Establecer condiciones
Ademaacutes podemos especificar restricciones adicionales sobre los valores que puede tomar un campo de unhecho Existen tres tipos principales de restricciones Conectadas (por orden de precedencia o prioridad)
not (~) Evita que cierto campo cumpla determinada restriccioacuten
and (amp) Combina dos restricciones conjuntivamente
or (|) Combina dos restricciones disjuntivamente
De predicado () Obliga a que cierto campo cumpla determinada condicioacuten (especificada por el predicado)
Por valor devuelto por una funcioacuten = Permite llamar a una funcioacuten y utilizar el valor devuelto pararestringir el valor que pueda tomar un campo de un hecho
Se puede comprobar si se cumple una determinada condicioacuten mediante el constructor test Dentro detest se pueden hacer llamadas a cualquier funcioacuten o predicado ya sea primitiva de CLIPS o definidapor nosotros
Combinar elementos
Los diferentes elementos de la parte izquierda van impliacutecitamente unidos mediante una AND que indicaconjuncioacuten No obstante podemos hacerlo expliacutecitamente mediante (and (cond1) (cond2)) aunque suelen
utilizarse para anidar ANDs dentro de ORsOR Sirve para hacer una disyuncioacuten (or (cond1) (cond2)) Es equivalente a escribir varias reglas en lasque cada una de ellas tenga uno de los componentes del OR en su parte izquierda y la misma parte derecha
NOT Sirve para detectar si no existe un determinado hecho (Ej (not (estilo sibarita)))exists Cuando a un conjunto de elementos se le antecede exists se comprueba que hay al menos un
hecho en la base de hechos que cumpla la condicioacuten (Ej (exists(bebida precio (ltprecio 5))) )forall Permite comprobar si todos los hechos que satisfacen un determinado patroacuten cumplen una serie
de condiciones (Ej (forall(plato (estilo moderno)))
343 iquestCoacutemo obtener la direccioacuten de hechos o instancias situados en LHS
En algunas ocasiones vamos a necesitar realizar alguacuten tipo de accioacuten en la parte derecha de las reglassobre hechos o instancias que cumplan unas determinadas condiciones Pero para ello necesitaremos primerotener acceso a estos elementos para despueacutes poder operar sobre ellos Esto lo conseguiremos guardando ladireccioacuten del elemento en una variable hacieacutendolo del siguiente modo
variable_direccion lt- (elemento)
Pongamos un ejemplo para ver realmente el funcionamiento y uso de esta posibilidad que CLIPS nosofrece
1 (defrule imprime-area2 instancia lt- (object (is-a Rectangulo))3 =gt4 (printout t Area del rectangulo (instance-name instancia)5 (send instancia calcula-area) crlf)6 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1959
16 Capiacutetulo 3 CLIPS
Cuando se ejecuta esta regla se imprimiraacuten las aacutereas de todas las instancias de la clase Rectangulo Enla parte izquierda de la regla lo que hacemos es guardar en la variable instancia la direccioacuten de la instanciade Rectangulo que estamos tratando en ese momento La regla se ejecutaraacute para todas las instanciasalmacenadas en la memoria de trabajo que cumplan la condicioacuten (is-a Rectangulo) es decir para todaslas instancias de la clase Rectangulo En la parte derecha de la regla donde se ejecutan las acciones podemosver que se imprimiraacute para cada instancia lo siguiente Area del rectangulo [nombre_instancia] aacuterea
del rectaacutengulo La funcioacuten instance-name nos devuelve el nombre de la instancia que le pasamos porparaacutemetro Ademaacutes hemos llamado al gestor de mensajes calcula-area para que nos devuelva el area delrectaacutengulo
344 iquestCoacutemo hacer sentencias or en la izquierda de las reglas
Con (or ) Si por ejemplo tenemos dos hechos (a) y (b) y queremos ejecutar la derecha de la reglacuando se cumpla uno de los dos tendremos que hacer (or (a) (b)) Atencioacuten porque la parte derecha seejecutaraacute tantas veces como veces se cumpla cada uno de los hechos si para nosotros existe tanto (a) como(b) la parte derecha se ejecutaraacute dos veces Para que soacutelo se usa una vez podemos hacer combinaciones de
or y and (funciona igual) o usar un patroacuten por ejemplo (persona Juan|Pedro) soacutelo se ejecutariacutea una vez
345 Com afegir una condicioacute a la part esquerre drsquouna regla
A vegades eacutes necessari que una regla srsquoinstanciiuml si es produeix una condicioacute especial (i no un fet) Per feraixoacute farem servir la comanda (test ltCONDICIOgt)
Per exemple imaginem que la nostre base de fets compte amb un fet (preu valor) amb un preudeterminat Imaginem que volem una regla que srsquoinstanciiuml quan aquest valor eacutes meacutes gran que 30
Per fer-ho fent servir tot el que hem explicat
1 (defrule preucar2 (preu preu)3 (test (gt preu 30))4 =gt5 (printout t El preu es mes gran que 30)6 )
Eacutes a dir si el preu eacutes meacutes gran que 30 srsquoimprimiragrave un missatge per pantallaAquestes condicions poden contenir ANDs i ORs de varies condicionsPer exemple
1 (defrule preulimit2 (preu preu)3 factminim lt- (preuminim minim)4 factmax lt- (preumaxim maxim)5 (test (and (gt preu minim) (lt preu maxim) ))6 =gt7 (retract factminim)8 (retract factmax)9 (printout t El preu estagrave dintre del rang)
On comprovarem si el preu estagrave dintre drsquoun rang determinat i en aquest cas esborra els fets que contenen
el magravexim preu i el miacutenim preu i mostra un missatge per pantalla
346 Puede una misma regla ejecutarse maacutes de una vez
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2059
34 Las reglas 17
Es muy importante entender que cada regla se ejecutaraacute una vez por cada combinacioacuten de valores en suLHS
1 (defrule regla2 (color col)3 (peso pes)4 =gt5
Si tengo tres colores y dos pesos asertados la regla se ejecutaraacute 6 veces una con cada combinacioacuten decolor y peso
347 Com puc definir lrsquoordre de les regles
La idea drsquoun sistema basant en regles eacutes no definir un ordre lineal drsquoaquestes (costa deixar de pensar de
forma iterativa)En el cas de necessitar que una regla srsquoexecuti despreacutes drsquouna altre pots fer servir Fets la regla anteriorcrea un fet que la segona regla tindragrave a la part esquerra
1 (defrule pregunta12 =gt3 (assert (pregunta1Feta))4 5 )6
7 (defrule pregunta2
8 (pregunta1Feta)9 =gt
10 11 )
I finalment pots usar la propietat salience Aquesta propietat indica la prioritat drsquoexecucioacute de les regles( les regles amb salience majors srsquoexecutaran abans ) Pot prendre valors positius i negatius entre -10000 y+10000 Per defecte les regles tenen salience 0
1 (defrule pregunta12 (declare (salience 2))3 =gt4 5 )6
7 (defrule pregunta28 (declare (salience 1))9 =gt
10 11 )
El valor indicado en la propiedad salience puede ser el nuacutemero directamente o una expresioacuten por ejemplovariable10 podemos usar variable para elegir que regla se ejecutaraacute
Las prioridades deben ser usadas solo para determinar el orden en el que se disparan algunas reglas sobreotras no para fijar el flujo de control ya que la principal ventaja de un sistema basado en reglas es larepresentacioacuten declarativa del conocimiento y de esta forma abusando de las prioridades conduce a unsistema procedimental
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2159
18 Capiacutetulo 3 CLIPS
348 Com forccedilar que una regla sigui la primera
Per que aquesta regla sigui la primera ha de tenir el salience meacutes gran de totes
1 (defrule presentacio2 (declare (salience 20))3 =gt4 (printout t ------ Benvingut ----- crlf)5 )
349 Vull guardar certs valors que es fan servir durant lrsquoexecucioacute de diferents regles Com hopuc fer
Tens principalment dues alternatives Si el valor eacutes un tipus bagravesic pots fer servir una variable global ambla sintaxi seguumlent
(defglobal nom_variable = valor)
Aquesta sentegravencia no va a dins de cap funcioacute ni regla es posa sola a la part que creguis convenient delcodi Vegem un exemple
(defglobal preu_minim_primer = 1000)
Per fer-la servir es fa exactament de la mateixa manera que amb una variable normal perograve has de posarels dos asteriscs Per exemple
(bind preu_minim_primer curr-preu)
Per altra banda si el valor o valors que vols guardar han de ser instagravencies una bona estrategravegia pot serutilitzar un deftemplate Eacutes uacutetil sobretot per anar guardant solucions temporals o llistes drsquoelements quepoden formar part de la solucioacute
Per utilitzar-ho has de seguir els passos seguumlents
1 Definir el deftemplate
(deftemplate nom_del_deftemplate(multislot nom_multislot)
(slot nom_slot)
)
Amb un exemple es veuragrave meacutes clar
(deftemplate llista-plats(multislot primers)(multislot segons)(multislot postres)
)
2 Inicialitzar el deftemplate
(defrule[condicions vagraveries] La condicioacute base eacutes que llista-plats no srsquoha inicialitzat encara
(not (llista-plats))=gt
llista conteacute els valors de llista-plats (que de moment estan buits)(bind llista (assert (llista-plats)))
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2259
35 Las clasesinstancias 19
3 Assignar-li valors
(bind segons_plats (find-all-instances ((plat Plat)) TRUE)(modify llista (segons segons_plats))
4 Recuperar els valors
(defrule[condicions vagraveries]llista lt- (llista-plats (segons $segons_plats))
=gt
Ara la variable $segons_plats conteacute tots els elements de segons
35 Las clasesinstancias
351 Tengo que representar la jerarquiacutea de un frame iquestEs preferible antildeadir las subclases a laontologiacutea o bien diferenciarlas mediante un slot en la superclase
Las dos formas son vaacutelidas pero es recomendable representarlas en clases separadas cuando se vayan abuscar instancias de ese tipo ya que asiacute no tendremos que hacer un recorrido por todas las de la superclaseNo obstante si soacutelo se trata de una caracteriacutestica puntual del frame y no vamos a hacer buacutesquedas de unaexclusiva subclase entonces seraacute maacutes eficiente antildeadir un slot debido a su mejor accesibilidad
352 iquestQueacute es un objeto
Podriacuteamos decir que un objeto es un hecho no ordenado con herencia
353 iquestPorqueacute usar objetos en contexto de la praacutectica de CLIPS de IA
Como bien sabemos una parte de la praacutectica de SBCrsquos consisten en crear la ontologiacutea Esta ontologiacutease exporta para poder interactuar con CLIPS en formato pins y pont El archivo pont contendraacute ladeclaracioacuten de todas las clases creadas previamente por Protege (defclass ) El archivo pins contendraacute
todas las instancias de las clases declaradas en el archivo pont Como puede intuir el lector se necesitaraacuteinteractuar con los objetos previamente creados por Protegravegegrave
354 Como se definen las clases
Para definir las clases usaremos el constructor defclass
(defclass ltnombregt [ltcomentariogt](is-a ltnombre-de-superclasegt)[(role concrete | abstract)]
[(pattern-match reactive | non-reactive)]ltslotgt definicioacuten de los atributos de la clase
ltdocumentacioacuten-handlergt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2359
20 Capiacutetulo 3 CLIPS
En caso de desear que la nueva clase herede las propiedades de otra ya existente el nombre de esta deberaacuteespecificarse despues de is-a El rol determinaraacute si la clase es concreta (se puede instanciar) o abstracta(destinada a ser superclase) El pattern-match debe declararse como reactivo si se desea que las instanciasde la clase puedan unificar con los elementos objeto de las reglas (siacutembolo lt-) Los slots correspondena los atributos de la clase y los handlers a las funciones de eacutesta Los handlers se pueden declarar en ladeclaracioacuten de la propia clase pero se deben definir externamente Dado que no aporta ninguna ventaja
declararlos es recomendable definirlos directamente Noacutetese que todo aquello que estaacute entre corchetes ([])constituye informacioacuten adicional que no es obligatorio especificar
1 (defclass Persona2 (is-a Ser_Vivo)3 (role concrete)4 (single-slot edad5 (type INTEGER)6 (range 1 99)7 (cardinality 0 1)8 (create-accessor read-write)9 )
10 (multislot amigos11 (type INSTANCE)12 (allowed-classes Persona)13 )14 )
El comportamiento y declaracioacuten de los slots es ideacutentico al de los slots de los hechos ordenados Losatributos de tipo INSTANCE (referencian otras instancias) estan en formato INSTANCE-NAME
355 Com consulto una instagravencia a partir drsquouna regla
Podem fer servir la part esquerre drsquouna regla per trobar instagravencies Lrsquouacutes eacutes molt semblant a trobar elpunter a un fet fent servir
(object [(is-a ltNOM_CLASSEgt)|(name ltNOM_INSTANCIA)|(ltNOM-SLOTgt ltVALORVARIABLE))])
Per exemple si volem que una regla srsquoinstanciiuml si tenim instanciat un plat de la classe Plat podriem ferservir
1 (defrule tenimplat2 plat lt- (object (is-a Plat))3 =gt4 (print t (send plat get-nom) crlf)
La regla imprimiragrave el nom del plat que trobi Eacutes important notar que srsquoactivaragrave per cada instagravencia de platque tinguem a la base de coneixement
Podem consultar els valors de la instancia fent servir condicions a la part esquerre de la regla Per exemplesi nomeacutes volgueacutessim els plats amb un preu meacutes gran que 30
1 (defrule platCar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Srsquoactivaragrave per tots els plats amb un preu major a 30
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2459
35 Las clasesinstancias 21
Srsquoha drsquoanar amb cura per aquest tipus de regla ja que si la base de coneixement eacutes molt amplia pot acabarderivant amb problemes de memograveria
Per exemple si en comptes de preguntar per una instagravencia de Plat pregunteacutessim per dues instancies dePlat
1 (defrule platsCars2 plat1 lt- (object (is-a Plat) (Preu p1))3 plat2 lt- (object (is-a Plat) (Preu p2))4 (test (gt p1 30))5 (test (gt p2 30))6 =gt7 (print t (send plat1 get-nom) i (send plat1 get-nom) soacuten cars8 crlf)9 )
Faria unificacioacute amb totes les combinacions possibles (amb repeticions) de dos plats de tota la base deconeixement Aixograve es podria anar ampliant fins fer-se intractable
Si tenim drsquoalguna manera el nom de la instancia podem fer
1 (defrule platPicant2 (cuina (plat p))3 (object (name p) (picant pi))4 =gt5 (print t picant pi crlf)6 )
Aixoacute es pot servir per crear condicions que facin servir noms drsquoinstancies que tenim almacenats a slotsdrsquoaltres instancies per exemple
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send v get-Preu) crlf)6 )
Aquesta regla imprimiria el preu del vi asociat al plat si es negre
356 Tengo problemas en condiciones de reglas con slots de instancias obtenidos con send
A veces dan problemas las reglas en las que las condiciones sobre los valores de los slots de una instanciase escriben usando mensajes get sobre los atributos de una instancia en lugar de utilizar patrones paraobtenerlos por ejemplo la regla
1 (defrule platcar2 plat lt- (object (is-a Plat) )3 (test (gt (send plat get-Preu) 30))4 =gt5 (print t (send plat get-nom) es car6 crlf)7 )
No funciona correctamente en CLIPS pero la regla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2559
22 Capiacutetulo 3 CLIPS
1 (defrule platcar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Siacute lo haceEn el caso de que el valor del slot sea booleano se puede escribir la regla como
1 (defrule platpicant2 plat lt- (object (is-a Plat) (Picant TRUE))3 =gt4 (print t (send plat get-nom) es picant crlf)
En el caso de que el slot sea a su vez una instancia se puede utilizar para obtener los valores de estainstancia en la condicion como se explica en la pregunta anterior
357 Tengo problemas con instancias obtenidas del slot de otra instancia en el patroacuten de unaregla
Este problema aparece cuando el patron de una regla instancia una variable a un nombre de instancia yesta no esta definida en el modulo de la regla por ejemplo si la regla siguiente pertenece a un modulo queno es el de la instancia
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4
=gt5 (print t preu (send v get-Preu) crlf)6 )
La regla se quejaraacute de que la instancia no existe al enviarle el send ya que solo se busca la instancia dentrodel moacutedulo de la regla y no en los importados Para arreglar esto se puede usar la funcioacuten (instance-address[ltMODULOgt|] ltINSTANCIAgt) que busca la direccion de la instancia en un modulo concreto o en todos losmoacutedulos que se importan () Deberiacuteamos entonces escribir la regla
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send (instance-address v) get-Preu) crlf)6 )
358 iquestCoacutemo realizar una buacutesqueda de instancias que cumplan unas restricciones
CLIPS nos ofrece varias funciones de buacutesqueda de instancias que cumplan unas determinadas restriccionesque a nosotros nos interese
La funcioacuten find-instance Esta funcioacuten devuelve la primera instancia que cumple todas las restric-ciones indicadas
La funcioacuten find-all-instances Esta funcioacuten devuelve todas las instancias que cumplen las restric-ciones indicadas
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2659
35 Las clasesinstancias 23
La sintaxis de ambas funciones es igual exceptuando el nombre de la funcioacuten(find-all-instances (clase_instancias) (restricciones))A continuacioacuten se muestran varios ejemplos
(bind rectangulos (find-all-instances ((inst Rectangulo)) (gtinstaltura 10))) Des-pueacutes de ejecutar esta funcioacuten en la variable rectangulos habraacute una lista con todas las instancias de la
clase Rectangulo cuya altura sea superior a 10(bind rectangulos (find-all-instances ((inst Rectangulo)) (and (gtinstaltura 10) (=instanchura 7)))) Este trozo de coacutedigo hace que en la variable rectangulos se guarde una listade las instancias de la clase Rectangulo que tienen una altura superior a 10 y una anchura igual a 7
Estas funciones que CLIPS nos ofrece tienen otra funcionalidad y es que podemos realizar buacutesquedas deconjuntos de instancias
(bind rectangulos (find-all-instances ((a Rectangulo) (b Rectangulo)) (= aalturabaltura))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas de instancias de laclase Rectangulo que tienen la misma altura
Por uacuteltimo es necesario comentar que se pueden realizar buacutesquedas de conjuntos de instancias que seande distintas clases
(bind figuras (find-all-instances ((rect Rectangulo) (circ Circulo)) (= rectalturacircradio))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas ltrectangulocirculogtque cumplan que la altura del rectaacutengulo sea igual al radio del ciacuterculo
Existen maacutes comandos para obtener instancias pero son menos utilizadas a nivel baacutesico como pueden serany-instancep do-for-instance do-for-all-instances y delayed-do-for-all-instances
359 iquestCoacutemo se interactuacutea con objetos
La interaccioacuten con objetos se efectuacutea mediante lo que se denomina mensaje
(defmessage-handlerltnombre-clasegtltnombre-mensajegt[lttipo-handlergt] [ltcomentariogt]ltparaacutemetrogt [ltparaacutemetro-comodiacutengt])ltaccioacutengt
)
Un gestor de mensajes consta de 7 partes
1 Nombre de clase a la que el gestor estaraacute asociado
2 Nombre del mensaje
3 Tipo de gestor (Nosotros habitualmente usaremos primary que viene por defecto)
4 Comentario (opcional)
5 Lista de paraacutemetros6 Paraacutemetro comodiacuten (para gestionar muacuteltiples paraacutemetros)
7 Secuencia de acciones o expresiones que seraacuten ejecutadas por el gestor
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2759
24 Capiacutetulo 3 CLIPS
Enfocado a la praacutectica de CLIPS la maacutes comuacuten es que queramos interactuar con objetos para
1 Imprimir los objetos Un ejemplo
1 (defmessage-handler avion imprimir-beneficio ()
2 Para implementar funciones calculadas asociadas al objeto Un ejemplo
1 (defmessage-handler avion calcular-beneficio ()2 ( selfplazas-ocupadas selfprecio-billete))3 )
Como se puede observar el paraacutemetro impliacutecito self contiene la instancia activa para este mensaje
3510 iquestComo se interactuacutea con las instancias de los objetos
Podremos interactuar entre las instancias de los objetos mediante la funcioacuten send
(send ltexpresioacuten-de-objetogtltnombre-de-mensajegtltexpresioacutengt)Donde se toman como argumentos el objeto destino del mensaje el mensaje mismo y otros paraacutemetros
que debieran ser pasados a los gestoresParticularmente en el aacutembito de la praacutectica usualmente necesitaremos utilizar el envioacute de mensajes de
tipo get put and delete Estos mensajes tiene la siguiente sintaxis
get-ltnombre-atributogt
put-ltnombre-atributogt
delete
Aquiacute tenemos un ejemplo de como utilizarlo recordando que ponemos entre corchetes la instancia la cualse enviacutea el mensaje
(defclass avion (is-a USER)(role concrete)(slot precio-billete (create-accessor read) (default 34))(slot plazas-ocupadas (create-accessor write) (default 0)))
Clase creada
gt(make-instance a of avion) Creacioacuten de una instancia de avion[a]
gt(send [a] get-precio-billete) Obtencioacuten de un slot34 Resultado obtenidogt(send [a] put-plazas-ocupadas 100) Modificacioacuten de un slotgt(send [a] delete) Eliminacioacuten de la instanciaTrue
3511 Uso de make-instance
Cuando queremos crear una instancia de una clase para ir rellenandola con los resultados o datos quevayamos obteniendo se haria lo siguiente
(bind variable_instancia (make-instance nombre_instancia of nombre_clase))
Una vez creada podemos jugar con dicha instancia en las diferentes reglas siempre que la llamemos enlos activadores
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2859
35 Las clasesinstancias 25
(defrule reglavar_instancia lt- (object (is-a nombre_clase))=gt
)
De esta manera dentro de la regla podemos hacer acciones con la instancia por ejemplo(send var_instancia put-articulo articulo_ejemplo)
3512 Como generar automaacuteticamente nombres de instancia
En ocasiones queremos crear instancias en reglas y queremos que su nombre sea distinto del de otrasque ya tenemos Para ello podemos utilizar las funciones gensym y gensym La primera genera un siacutembolodel estilo genN donde N es un nuacutemero La segunda hace lo mismo pero aseguraacutendose de que ese siacutembolono exista ya Se puede reiniciar el contador que usan estas dos funciones con el operador (setgen ltnumgt)donde ltnumgt es el nuacutemero por el que queremos que empiecen ahora los siacutembolos
Para usar esto para generar el nombre de una instancia podemos hacer
(make-instance (gensym) of ltclasegt)
Cada vez que se ejecute se generaraacute un nombre de instancia nuevoSi creamos instancias de diferentes clases y queremos que las instancias tengan nombres que podamos
identificar podemos concatenar siacutembolos a los siacutembolos generados por gensym por ejemplo
(make-instance (sym-cat pepe- (gensym)) of ltclasegt)
generaraacute una instancia con el nombre pepe-genN
3513 Com fer un getset drsquoun slot drsquouna classe
Per consultar el valor drsquoun slot drsquouna classe ho podem fer enviant-li un missatge de la seguumlent manera
(send ltVARIABLEgt get-ltNOM_ATRIBUTgt)
Per exemple si tenim una instagravencia de la classe Plat ( instancia ) i volem saber el valor del seu slotnom
(send instancia get-nom)
Per assignar un valor a un slot drsquouna drsquoinstagravencia hem drsquoenviar-li un missatge de la seguumlent manera
(send ltVARIABLEgt put-ltNOM_ATRIBUTgt ltVALORgt)On ltVALORgt pot ser un valor o un megravetode que retorni un valor
(send instancia put-nom nom)
3514 iquestCoacutemo acceder a una instancia cuyo nombre conocemos
Si conocemos el nombre de una instancia y necesitamos acceder a ella es decir necesitamos enviarle alguacutenmensaje mediante la funcioacuten send podemos hacerlo directamente escribiendo en lugar de la variable quealmacena la instancia el nombre de la instancia entre corchetes [ ] A continuacioacuten se muestra un ejemplo
(bind altura_rect1 (send [rect1] get-altura))
En este caso se guardaraacute en la variable altura_rect1 el valor de la altura de la instancia que tiene comonombre rect1
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2959
26 Capiacutetulo 3 CLIPS
3515 Obtenir el nom drsquouna classe
Si tenim una instagravencia drsquouna classe i volem saber el nom de la classe (uacutetil si tenim una bona taxonomiade classes) ho podem fer amb el megravetode (class ltINSTANCIAgt)
Si per exemple imaginem que tenim la classe Actor la qual teacute com subclasses la classe APrincipalASecundari i ACameo Imaginem que estem tractant amb instancies drsquoactors i volem saber si la instanciaque estem tractant es de la classe APrincipal
Ho hauriacuteem de fer de la seguumlent manera
(eq (class instancia) APrincipal)
Fixem-nos que APrincipal eacutes un siacutembol no un String (un truco eacutes fixar-se en que no teacute cometes) Si vol-gueacutessim comparar-ho amb un String (per exemple un String introduiumlt per lrsquousuari) ho podriacuteem transformara un String amb el megravetode str-cat
(eq (str-cat (class instancia)) Principal)
3516 Como convierto un INSTANCE-ADRESS en un INSTANCE-NAME
En alguacuten momento nos podemos encontrar con la situacioacuten de que disponemos de un puntero a unainstancia y necesitamos su nombre o lo contrario En ambos casos podemos usar la funcioacuten instance-nameSu funcionamiento es bidireccional podemos introducirle un instance-name y nos devolveraacute un instance-adress y viceversa
1 (defrule imprimir-nombre2 estlt-(object (is-a Estudiante) (edad 25))3 =gt4 (printout t (instance-name est) crlf)5
)
3517 Com iterar a traveacutes drsquoun multi-slot
El seguumlent tambeacute eacutes vagravelid com exemple de com iterar a traveacutes drsquouna llistaImaginem que tenim una instagravencia de la classe Plat a la varible (plat) la qual teacute un multi-slot drsquoinstagravencies
de la classe Ingredient Imaginem que volem imprimir per pantalla el nom drsquoaquests ingredients (slot nomde la classe Ingredient) Necessitarem iterar sobre la llista drsquoingredients
1 (bind i 1)2 (while (lt= i (length$ (send plat get-ingredients)))3 do4 (bind ingredient (nth$ i (send plat get-ingredients)))5 (printout t (send ingredient get-nom) crlf)6 (bind i (+ i 1))7 )
El megravetode (nth$ ltINDEXgtltLLISTAgt) et retorna lrsquoelement situat a INDEX de LLISTAEl megravetode (length$ ltLLISTAgt) retorna el nuacutemero drsquoelements de LLISTA
3518 Coacutemo modificarinsertarborrar valores en un multislot
Los valores de un multislot se pueden cambiar usando la funcioacuten slot-replace$ La sintaxis es la siguiente
(slot-replace$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt ltvalorgt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3059
35 Las clasesinstancias 27
Donde ltiniciogt y ltfingt son el rango de posiciones del multislot que se quiere modificar y ltvalorgtson los valores que queremos reemplazar Obviamente deberaacute haber tantos valores como posiciones hayamosindicado en el rango
Para insertar nuevos valores podemos usar la funcioacuten slot-insert$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltposgt ltvalorgt)
El valor se inserta delante de la posicioacuten indicada si la posicioacuten es mayor que la longitud del multislot secolocaraacute al final
Para borrar elementos de un multislot podemos usar la funcioacuten slot-delete$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt)
Se borraraacuten los elementos que estaacuten en el rango indicado
3519 Coacutemo recorrer un atributo multievaluado
Supongamos que la variable respuesta tiene una lista de instancias
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 aquiacute hacemos lo que queramos4 )5 )
Loop-for-count funciona como un for primero la variable que haraacute de contador luego el valor de origeny luego el valor final Para controlar el final usamos la funcioacuten que he explicado antes i tomaraacute valoresdesde 1 hasta n asiacute que usando la funcioacuten nth$ obtendremos cada uno de los elementos La variable auxiraacute teniendo cada uno de los valores
3520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz)
Es igual que antes pero con dos bucles
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 (bind aux2 (send aux get-slot_que_queremos))4 (loop-for-count (j 1 (length$ aux2)) do5 (bind aux_final (nth$ j aux2))6 aquiacute ya podemos trabajar con el elemento en concreto7 )8 )
Supongamos que respuesta tiene una lista de instancias con el primer bucle haremos lo mismo que antes ir
iterando por esas instancias Una vez que tenemos cada instancia con aux2 con el segundo bucle iteraremosdentro de sus instancias interiores
Por ejemplo si tenemos varios equipos de fuacutetbol y cada equipo tiene varios jugadores en el primer bucleestamos iterando entre los equipos y en el segundo entre los jugadores de cada equipo en particular
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3159
28 Capiacutetulo 3 CLIPS
3521 Com puc esborrar una instagravencia
Per esborrar una instagravencia (per exemple segons la informacioacute que proporcioni lrsquousuari podem deduir queuna segraverie drsquoinstagravencies eacutes impossible que es facin servir per a la solucioacute) ho podem fer enviant un missatgedelete a la instagravencia eacutes a dir (send ltINSTANCIAgtdelete)
(send inst delete)
Un megravetode que podria ser uacutetil de la cara a la pragravectica podria ser el seguumlent
1 (defrule elimina-instancia2 (declare (salience 10))3 elimina-fact lt- (elimina-inst inst)4 =gt5 (send inst delete)6 (retract elimina-fact)
Imaginem que per exemple que volem eliminar una llista drsquoinstagravencies Per eliminar-les podriacuteem recoacuterrerel llistat marcant les instagravencies que volem esborrar afegint el seguumlent fet
(assert (elimina-instancia inst))
Aixiacute com que elimina-instancia teacute un salience alt esborraria les instagravencies marcades quan tingueacutes ocasioacuteDrsquoaquesta manera ens estalviem el problema de recoacuterrer un llistat drsquoinstagravencies amb un iterador mentre
anem eliminant els elements de la llista cosa que pot donar problemes amb lrsquoiterador
3522 Com imprimir una instagravencia
Per imprimir una classe (uacutetil per exemple per mostrar el resultat final) el millor eacutes definir message-handlersPer exemple imaginem que tenim una classe Plat la qual teacute un slot nom de tipus String Si volgueacutessimimprimir per pantalla un missatge que digueacutes
El nom del plat eacutes ndashltnom del platgtndash
Hauriacuteem de definir un message-handler que simplement imprimiacutes per pantalla el valor de lrsquoslot de laforma
(defmesssage-handler ltCLASSNAMEgt ltMESSAGENAMEgt primary ()ltCODIgt
)
Per el cas de lrsquoexemple
1 (defmessage-handler Plat print primary ()2 (printout t -- selfnom --) )3 )
Per cridar-ho nomeacutes caldragrave enviar-li un missatge a la instagravencia amb el nom del message-handler (enaquest cas print)
(send instancia print)
Un message-handler pot cridar a altres message-handlers amb el que es poden encadenar diverses instagraven-cies Per exemple imaginem que tenim la classe Menuacute la qual teacute un atribut plats que eacutes un llista drsquoinstagravenciesde la classe Plat Dintre del message-handler menuacute podriacuteem iterar a traveacutes de la llista de plats enviant elmissatge print que hem definit anteriorment
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3259
36 Programacioacuten 29
3523 Com es navega entre instagravencies relacionades
Per exemple tinc una instagravencia iA que teacute un slot anomenat slotB que eacutes una instagravencia drsquoun frame B Vullsaber el nom de la instagravencia associada al slotB de iA Ho pots fer aixiacute
(bind B (send iA get-slotB))(bind res (send B get-nom))
Si estagraves dins drsquouna condicioacute ho pots simplificar de la forma seguumlent
(bind res (send iAslotB get-nom)
Els dos punts soacuten equivalents al punt de Java
36 Programacioacuten
361 Com introduir un comentari
Els comentaris a CLIPS va darrere de un com per exemple
Comentari
Tambeacute podem afegir comentaris a les nostres regles deffacts deftemplates etc Generalment van darrereel nom de la estructura per exemple
1 (defrule neteja regla per la qual si la cuina estagrave bruta srsquoafegiragrave una tasca de2 neteja
3 (estat-cuina bruta)4 =gt5 (assert (tasca netejar))6 )
362 Referenciar el valor null a CLIPS
Per referenciar el valor null a clips es fa amb el simbol nil Per exemple si volem saber si una instagravenciainst es null ho podriacuteem fer de la seguumlent manera
(eq inst nil)
363 Formas de recorrer una lista
Para recorrer una lista disponemos de diferentes opciones en este FAQ explicaremos como crear unaestructura tipo ldquoWHILErdquo y tipo ldquoFORrdquo
1 While Esta regla se ejecuta hasta que la expresioacuten a evaluar sea falsa Este tipo de estructura se rigepor seguir la sintaxis while - do y se construiriacutea de la siguiente forma
(while ltexpresioacutengt[do] ltaccioacutengt)
Doacutende dependiendo del valor de ltexpresioacutengt
Valor TRUE Se realizaraacute la accioacuten ltaccioacutengt i se volveraacute a evaluar ltexpresioacutengt
Valor FALSE No se ejecutaraacute la accioacuten ltaccioacutengt
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3359
30 Capiacutetulo 3 CLIPS
2 For Esta regla sirve para ejecutar un bucle N (final - inicio) veces Este tipo de estructura se rige porseguir la sintaxis loop-for-count y se construiriacutea de la siguiente forma
(loop-for-count (ltvargtltiniciogtltfinalgt) [do] ltaccioacutengt)
Doacutende
ltvargt Variable que se usara como iacutendice
ltiniciogt Valor inicial que tendraacute ltvargt
ltfinalgt Ultimo valor que tendraacute la variable ltvargt
ltaccioacutengt Accioacuten que es realizaraacute hasta que ltvargt tenga el valor de ltfingt
364 Formas de elegir una opcioacuten
En este apartado explicaremos como crear una estructura if y una estructura switch
If Este tipo de estructura se rige por seguir la sintaxis if - then - else y se construiriacutea de lasiguiente forma
(if ltexpresioacutengtthen ltaccioacutengt[else ltaccioacuten2gt])
Doacutende dependiendo del valor de ltexpresioacutengt
bull Valor TRUE Se realizaraacute la accioacuten ltaccioacutengtbull Valor FALSE Se realizaraacute la accioacuten ltaccioacuten2gt (en caso de haber)
Switch Este tipo de estructura se rige por seguir la sintaxis switch - opciones y se construiriacutea dela siguiente forma
(switch ltexpresioacuten-testgt(case OPCION1 then ACCION1)(case OPCION2 then ACCION2)
([default] ACCION-DEFAULT)
)
Doacutende dependiendo del valor de ltexpresioacuten-casegt se ejecutaraacute una ltaccioacutengt en particular Si nin-guna ltopcioacutengt es correcta se ejecutara la ltaccioacuten-defaultgt
365 Funciones con la clase String
Habitualmente trabajaremos con Strings o cadena de Strings CLIPS proporciona una serie de herramien-tas para trabajar con esta clase
1 Convertir string a MAYUacuteSCULAS A veces es conveniente tener todos los caracteres en mayuacutesculaspara no tener problemas de comparaciones o simplemente por convenio Para ello CLIPS dispone dela funcioacuten upcase la cual convierte a mayuacutesculas un siacutembolo o string
(upcase ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplos
(upcase Ccedillips es divertido) rarr CcedilLIPS ES DIVERTIDO
(upcase Clips_es_divertido) rarr CLIPS_ES_DIVERTIDO
2 Convertir string a MINUacuteSCULAS la funcioacuten es downcase
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3459
36 Programacioacuten 31
3 Concatenacioacuten de strings Tambieacuten es de gran utilidad poder juntar dos o maacutes paraacutemetros en un solostring Todo paraacutemetro a juntar deben ser de uno de los siguientes tipos symbol String integer floato instance-name
(str-cat parametro1 parametro2 parametroN )
Ejemplo
(str-cat IA nota 10) rarr IAnota10
4 Comparacioacuten de strings Funcioacuten que nos indica si dos strings son iguales
(str-compareltexpresioacuten-simboacutelica-o-de-cadenagtltexpresioacuten-simboacutelica-o-de-cadenagt
)
Esta funcioacuten devuelve
0 Si ambos strings son iguales1 Si el primer string es mayor que el segundo string-1 Si el primer string es menor que el segundo string
5 Longitud de un string Muchas veces es de gran utilidad saber que tamantildeo tiene un string
(str-length ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplo
(str-length Inteligencia Artificial) rarr 23
366 iquestCoacutemo obtener el contenido de una variable en un string
Para conseguir un string a partir de un integer float symbol instance-name debes utilizar el comandostr-cat Si a la funcioacuten le pasamos como paraacutemetros varios elementos los transformaraacute a string y losconcatenaraacute La sintaxis de esta funcioacuten es la siguiente (str-cat elementos) Esta funcioacuten la usaremossobre todo cuando queramos realizar comparaciones entre el contenido de una variable y un string ya quepreviamente necesitaremos usar la funcioacuten str-cat para pasar el contenido de la variable a string y realizarde este modo la comparacioacuten de forma correcta
367 iquestComo se crea una lista
Con create$ Todos los operadores sobre listas llevan el siacutembolo $ al final Igual que con las variables sedebe usar bind siempre que se desee modificar una lista
(bind lista (create$ a b c))
368 iquestComo borro un elemento de una lista
Con delete$Usa la siguiente sintaxis(delete$ ltlistagt ltindice-iniciogt ltindice-finalgt)Se borraraacuten todos los elementos del rango entre las posiciones inicio y final ambas incluidas Tambieacuten exis-
tedelete-member$ (delete-member$ ltlistagt ltelementogt) Borraraacute todas las apariciones del elemento enla lista
(delete$ (create$ a b c d e f) 3 5) minusrarr (a b f)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 1959
16 Capiacutetulo 3 CLIPS
Cuando se ejecuta esta regla se imprimiraacuten las aacutereas de todas las instancias de la clase Rectangulo Enla parte izquierda de la regla lo que hacemos es guardar en la variable instancia la direccioacuten de la instanciade Rectangulo que estamos tratando en ese momento La regla se ejecutaraacute para todas las instanciasalmacenadas en la memoria de trabajo que cumplan la condicioacuten (is-a Rectangulo) es decir para todaslas instancias de la clase Rectangulo En la parte derecha de la regla donde se ejecutan las acciones podemosver que se imprimiraacute para cada instancia lo siguiente Area del rectangulo [nombre_instancia] aacuterea
del rectaacutengulo La funcioacuten instance-name nos devuelve el nombre de la instancia que le pasamos porparaacutemetro Ademaacutes hemos llamado al gestor de mensajes calcula-area para que nos devuelva el area delrectaacutengulo
344 iquestCoacutemo hacer sentencias or en la izquierda de las reglas
Con (or ) Si por ejemplo tenemos dos hechos (a) y (b) y queremos ejecutar la derecha de la reglacuando se cumpla uno de los dos tendremos que hacer (or (a) (b)) Atencioacuten porque la parte derecha seejecutaraacute tantas veces como veces se cumpla cada uno de los hechos si para nosotros existe tanto (a) como(b) la parte derecha se ejecutaraacute dos veces Para que soacutelo se usa una vez podemos hacer combinaciones de
or y and (funciona igual) o usar un patroacuten por ejemplo (persona Juan|Pedro) soacutelo se ejecutariacutea una vez
345 Com afegir una condicioacute a la part esquerre drsquouna regla
A vegades eacutes necessari que una regla srsquoinstanciiuml si es produeix una condicioacute especial (i no un fet) Per feraixoacute farem servir la comanda (test ltCONDICIOgt)
Per exemple imaginem que la nostre base de fets compte amb un fet (preu valor) amb un preudeterminat Imaginem que volem una regla que srsquoinstanciiuml quan aquest valor eacutes meacutes gran que 30
Per fer-ho fent servir tot el que hem explicat
1 (defrule preucar2 (preu preu)3 (test (gt preu 30))4 =gt5 (printout t El preu es mes gran que 30)6 )
Eacutes a dir si el preu eacutes meacutes gran que 30 srsquoimprimiragrave un missatge per pantallaAquestes condicions poden contenir ANDs i ORs de varies condicionsPer exemple
1 (defrule preulimit2 (preu preu)3 factminim lt- (preuminim minim)4 factmax lt- (preumaxim maxim)5 (test (and (gt preu minim) (lt preu maxim) ))6 =gt7 (retract factminim)8 (retract factmax)9 (printout t El preu estagrave dintre del rang)
On comprovarem si el preu estagrave dintre drsquoun rang determinat i en aquest cas esborra els fets que contenen
el magravexim preu i el miacutenim preu i mostra un missatge per pantalla
346 Puede una misma regla ejecutarse maacutes de una vez
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2059
34 Las reglas 17
Es muy importante entender que cada regla se ejecutaraacute una vez por cada combinacioacuten de valores en suLHS
1 (defrule regla2 (color col)3 (peso pes)4 =gt5
Si tengo tres colores y dos pesos asertados la regla se ejecutaraacute 6 veces una con cada combinacioacuten decolor y peso
347 Com puc definir lrsquoordre de les regles
La idea drsquoun sistema basant en regles eacutes no definir un ordre lineal drsquoaquestes (costa deixar de pensar de
forma iterativa)En el cas de necessitar que una regla srsquoexecuti despreacutes drsquouna altre pots fer servir Fets la regla anteriorcrea un fet que la segona regla tindragrave a la part esquerra
1 (defrule pregunta12 =gt3 (assert (pregunta1Feta))4 5 )6
7 (defrule pregunta2
8 (pregunta1Feta)9 =gt
10 11 )
I finalment pots usar la propietat salience Aquesta propietat indica la prioritat drsquoexecucioacute de les regles( les regles amb salience majors srsquoexecutaran abans ) Pot prendre valors positius i negatius entre -10000 y+10000 Per defecte les regles tenen salience 0
1 (defrule pregunta12 (declare (salience 2))3 =gt4 5 )6
7 (defrule pregunta28 (declare (salience 1))9 =gt
10 11 )
El valor indicado en la propiedad salience puede ser el nuacutemero directamente o una expresioacuten por ejemplovariable10 podemos usar variable para elegir que regla se ejecutaraacute
Las prioridades deben ser usadas solo para determinar el orden en el que se disparan algunas reglas sobreotras no para fijar el flujo de control ya que la principal ventaja de un sistema basado en reglas es larepresentacioacuten declarativa del conocimiento y de esta forma abusando de las prioridades conduce a unsistema procedimental
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2159
18 Capiacutetulo 3 CLIPS
348 Com forccedilar que una regla sigui la primera
Per que aquesta regla sigui la primera ha de tenir el salience meacutes gran de totes
1 (defrule presentacio2 (declare (salience 20))3 =gt4 (printout t ------ Benvingut ----- crlf)5 )
349 Vull guardar certs valors que es fan servir durant lrsquoexecucioacute de diferents regles Com hopuc fer
Tens principalment dues alternatives Si el valor eacutes un tipus bagravesic pots fer servir una variable global ambla sintaxi seguumlent
(defglobal nom_variable = valor)
Aquesta sentegravencia no va a dins de cap funcioacute ni regla es posa sola a la part que creguis convenient delcodi Vegem un exemple
(defglobal preu_minim_primer = 1000)
Per fer-la servir es fa exactament de la mateixa manera que amb una variable normal perograve has de posarels dos asteriscs Per exemple
(bind preu_minim_primer curr-preu)
Per altra banda si el valor o valors que vols guardar han de ser instagravencies una bona estrategravegia pot serutilitzar un deftemplate Eacutes uacutetil sobretot per anar guardant solucions temporals o llistes drsquoelements quepoden formar part de la solucioacute
Per utilitzar-ho has de seguir els passos seguumlents
1 Definir el deftemplate
(deftemplate nom_del_deftemplate(multislot nom_multislot)
(slot nom_slot)
)
Amb un exemple es veuragrave meacutes clar
(deftemplate llista-plats(multislot primers)(multislot segons)(multislot postres)
)
2 Inicialitzar el deftemplate
(defrule[condicions vagraveries] La condicioacute base eacutes que llista-plats no srsquoha inicialitzat encara
(not (llista-plats))=gt
llista conteacute els valors de llista-plats (que de moment estan buits)(bind llista (assert (llista-plats)))
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2259
35 Las clasesinstancias 19
3 Assignar-li valors
(bind segons_plats (find-all-instances ((plat Plat)) TRUE)(modify llista (segons segons_plats))
4 Recuperar els valors
(defrule[condicions vagraveries]llista lt- (llista-plats (segons $segons_plats))
=gt
Ara la variable $segons_plats conteacute tots els elements de segons
35 Las clasesinstancias
351 Tengo que representar la jerarquiacutea de un frame iquestEs preferible antildeadir las subclases a laontologiacutea o bien diferenciarlas mediante un slot en la superclase
Las dos formas son vaacutelidas pero es recomendable representarlas en clases separadas cuando se vayan abuscar instancias de ese tipo ya que asiacute no tendremos que hacer un recorrido por todas las de la superclaseNo obstante si soacutelo se trata de una caracteriacutestica puntual del frame y no vamos a hacer buacutesquedas de unaexclusiva subclase entonces seraacute maacutes eficiente antildeadir un slot debido a su mejor accesibilidad
352 iquestQueacute es un objeto
Podriacuteamos decir que un objeto es un hecho no ordenado con herencia
353 iquestPorqueacute usar objetos en contexto de la praacutectica de CLIPS de IA
Como bien sabemos una parte de la praacutectica de SBCrsquos consisten en crear la ontologiacutea Esta ontologiacutease exporta para poder interactuar con CLIPS en formato pins y pont El archivo pont contendraacute ladeclaracioacuten de todas las clases creadas previamente por Protege (defclass ) El archivo pins contendraacute
todas las instancias de las clases declaradas en el archivo pont Como puede intuir el lector se necesitaraacuteinteractuar con los objetos previamente creados por Protegravegegrave
354 Como se definen las clases
Para definir las clases usaremos el constructor defclass
(defclass ltnombregt [ltcomentariogt](is-a ltnombre-de-superclasegt)[(role concrete | abstract)]
[(pattern-match reactive | non-reactive)]ltslotgt definicioacuten de los atributos de la clase
ltdocumentacioacuten-handlergt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2359
20 Capiacutetulo 3 CLIPS
En caso de desear que la nueva clase herede las propiedades de otra ya existente el nombre de esta deberaacuteespecificarse despues de is-a El rol determinaraacute si la clase es concreta (se puede instanciar) o abstracta(destinada a ser superclase) El pattern-match debe declararse como reactivo si se desea que las instanciasde la clase puedan unificar con los elementos objeto de las reglas (siacutembolo lt-) Los slots correspondena los atributos de la clase y los handlers a las funciones de eacutesta Los handlers se pueden declarar en ladeclaracioacuten de la propia clase pero se deben definir externamente Dado que no aporta ninguna ventaja
declararlos es recomendable definirlos directamente Noacutetese que todo aquello que estaacute entre corchetes ([])constituye informacioacuten adicional que no es obligatorio especificar
1 (defclass Persona2 (is-a Ser_Vivo)3 (role concrete)4 (single-slot edad5 (type INTEGER)6 (range 1 99)7 (cardinality 0 1)8 (create-accessor read-write)9 )
10 (multislot amigos11 (type INSTANCE)12 (allowed-classes Persona)13 )14 )
El comportamiento y declaracioacuten de los slots es ideacutentico al de los slots de los hechos ordenados Losatributos de tipo INSTANCE (referencian otras instancias) estan en formato INSTANCE-NAME
355 Com consulto una instagravencia a partir drsquouna regla
Podem fer servir la part esquerre drsquouna regla per trobar instagravencies Lrsquouacutes eacutes molt semblant a trobar elpunter a un fet fent servir
(object [(is-a ltNOM_CLASSEgt)|(name ltNOM_INSTANCIA)|(ltNOM-SLOTgt ltVALORVARIABLE))])
Per exemple si volem que una regla srsquoinstanciiuml si tenim instanciat un plat de la classe Plat podriem ferservir
1 (defrule tenimplat2 plat lt- (object (is-a Plat))3 =gt4 (print t (send plat get-nom) crlf)
La regla imprimiragrave el nom del plat que trobi Eacutes important notar que srsquoactivaragrave per cada instagravencia de platque tinguem a la base de coneixement
Podem consultar els valors de la instancia fent servir condicions a la part esquerre de la regla Per exemplesi nomeacutes volgueacutessim els plats amb un preu meacutes gran que 30
1 (defrule platCar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Srsquoactivaragrave per tots els plats amb un preu major a 30
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2459
35 Las clasesinstancias 21
Srsquoha drsquoanar amb cura per aquest tipus de regla ja que si la base de coneixement eacutes molt amplia pot acabarderivant amb problemes de memograveria
Per exemple si en comptes de preguntar per una instagravencia de Plat pregunteacutessim per dues instancies dePlat
1 (defrule platsCars2 plat1 lt- (object (is-a Plat) (Preu p1))3 plat2 lt- (object (is-a Plat) (Preu p2))4 (test (gt p1 30))5 (test (gt p2 30))6 =gt7 (print t (send plat1 get-nom) i (send plat1 get-nom) soacuten cars8 crlf)9 )
Faria unificacioacute amb totes les combinacions possibles (amb repeticions) de dos plats de tota la base deconeixement Aixograve es podria anar ampliant fins fer-se intractable
Si tenim drsquoalguna manera el nom de la instancia podem fer
1 (defrule platPicant2 (cuina (plat p))3 (object (name p) (picant pi))4 =gt5 (print t picant pi crlf)6 )
Aixoacute es pot servir per crear condicions que facin servir noms drsquoinstancies que tenim almacenats a slotsdrsquoaltres instancies per exemple
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send v get-Preu) crlf)6 )
Aquesta regla imprimiria el preu del vi asociat al plat si es negre
356 Tengo problemas en condiciones de reglas con slots de instancias obtenidos con send
A veces dan problemas las reglas en las que las condiciones sobre los valores de los slots de una instanciase escriben usando mensajes get sobre los atributos de una instancia en lugar de utilizar patrones paraobtenerlos por ejemplo la regla
1 (defrule platcar2 plat lt- (object (is-a Plat) )3 (test (gt (send plat get-Preu) 30))4 =gt5 (print t (send plat get-nom) es car6 crlf)7 )
No funciona correctamente en CLIPS pero la regla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2559
22 Capiacutetulo 3 CLIPS
1 (defrule platcar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Siacute lo haceEn el caso de que el valor del slot sea booleano se puede escribir la regla como
1 (defrule platpicant2 plat lt- (object (is-a Plat) (Picant TRUE))3 =gt4 (print t (send plat get-nom) es picant crlf)
En el caso de que el slot sea a su vez una instancia se puede utilizar para obtener los valores de estainstancia en la condicion como se explica en la pregunta anterior
357 Tengo problemas con instancias obtenidas del slot de otra instancia en el patroacuten de unaregla
Este problema aparece cuando el patron de una regla instancia una variable a un nombre de instancia yesta no esta definida en el modulo de la regla por ejemplo si la regla siguiente pertenece a un modulo queno es el de la instancia
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4
=gt5 (print t preu (send v get-Preu) crlf)6 )
La regla se quejaraacute de que la instancia no existe al enviarle el send ya que solo se busca la instancia dentrodel moacutedulo de la regla y no en los importados Para arreglar esto se puede usar la funcioacuten (instance-address[ltMODULOgt|] ltINSTANCIAgt) que busca la direccion de la instancia en un modulo concreto o en todos losmoacutedulos que se importan () Deberiacuteamos entonces escribir la regla
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send (instance-address v) get-Preu) crlf)6 )
358 iquestCoacutemo realizar una buacutesqueda de instancias que cumplan unas restricciones
CLIPS nos ofrece varias funciones de buacutesqueda de instancias que cumplan unas determinadas restriccionesque a nosotros nos interese
La funcioacuten find-instance Esta funcioacuten devuelve la primera instancia que cumple todas las restric-ciones indicadas
La funcioacuten find-all-instances Esta funcioacuten devuelve todas las instancias que cumplen las restric-ciones indicadas
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2659
35 Las clasesinstancias 23
La sintaxis de ambas funciones es igual exceptuando el nombre de la funcioacuten(find-all-instances (clase_instancias) (restricciones))A continuacioacuten se muestran varios ejemplos
(bind rectangulos (find-all-instances ((inst Rectangulo)) (gtinstaltura 10))) Des-pueacutes de ejecutar esta funcioacuten en la variable rectangulos habraacute una lista con todas las instancias de la
clase Rectangulo cuya altura sea superior a 10(bind rectangulos (find-all-instances ((inst Rectangulo)) (and (gtinstaltura 10) (=instanchura 7)))) Este trozo de coacutedigo hace que en la variable rectangulos se guarde una listade las instancias de la clase Rectangulo que tienen una altura superior a 10 y una anchura igual a 7
Estas funciones que CLIPS nos ofrece tienen otra funcionalidad y es que podemos realizar buacutesquedas deconjuntos de instancias
(bind rectangulos (find-all-instances ((a Rectangulo) (b Rectangulo)) (= aalturabaltura))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas de instancias de laclase Rectangulo que tienen la misma altura
Por uacuteltimo es necesario comentar que se pueden realizar buacutesquedas de conjuntos de instancias que seande distintas clases
(bind figuras (find-all-instances ((rect Rectangulo) (circ Circulo)) (= rectalturacircradio))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas ltrectangulocirculogtque cumplan que la altura del rectaacutengulo sea igual al radio del ciacuterculo
Existen maacutes comandos para obtener instancias pero son menos utilizadas a nivel baacutesico como pueden serany-instancep do-for-instance do-for-all-instances y delayed-do-for-all-instances
359 iquestCoacutemo se interactuacutea con objetos
La interaccioacuten con objetos se efectuacutea mediante lo que se denomina mensaje
(defmessage-handlerltnombre-clasegtltnombre-mensajegt[lttipo-handlergt] [ltcomentariogt]ltparaacutemetrogt [ltparaacutemetro-comodiacutengt])ltaccioacutengt
)
Un gestor de mensajes consta de 7 partes
1 Nombre de clase a la que el gestor estaraacute asociado
2 Nombre del mensaje
3 Tipo de gestor (Nosotros habitualmente usaremos primary que viene por defecto)
4 Comentario (opcional)
5 Lista de paraacutemetros6 Paraacutemetro comodiacuten (para gestionar muacuteltiples paraacutemetros)
7 Secuencia de acciones o expresiones que seraacuten ejecutadas por el gestor
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2759
24 Capiacutetulo 3 CLIPS
Enfocado a la praacutectica de CLIPS la maacutes comuacuten es que queramos interactuar con objetos para
1 Imprimir los objetos Un ejemplo
1 (defmessage-handler avion imprimir-beneficio ()
2 Para implementar funciones calculadas asociadas al objeto Un ejemplo
1 (defmessage-handler avion calcular-beneficio ()2 ( selfplazas-ocupadas selfprecio-billete))3 )
Como se puede observar el paraacutemetro impliacutecito self contiene la instancia activa para este mensaje
3510 iquestComo se interactuacutea con las instancias de los objetos
Podremos interactuar entre las instancias de los objetos mediante la funcioacuten send
(send ltexpresioacuten-de-objetogtltnombre-de-mensajegtltexpresioacutengt)Donde se toman como argumentos el objeto destino del mensaje el mensaje mismo y otros paraacutemetros
que debieran ser pasados a los gestoresParticularmente en el aacutembito de la praacutectica usualmente necesitaremos utilizar el envioacute de mensajes de
tipo get put and delete Estos mensajes tiene la siguiente sintaxis
get-ltnombre-atributogt
put-ltnombre-atributogt
delete
Aquiacute tenemos un ejemplo de como utilizarlo recordando que ponemos entre corchetes la instancia la cualse enviacutea el mensaje
(defclass avion (is-a USER)(role concrete)(slot precio-billete (create-accessor read) (default 34))(slot plazas-ocupadas (create-accessor write) (default 0)))
Clase creada
gt(make-instance a of avion) Creacioacuten de una instancia de avion[a]
gt(send [a] get-precio-billete) Obtencioacuten de un slot34 Resultado obtenidogt(send [a] put-plazas-ocupadas 100) Modificacioacuten de un slotgt(send [a] delete) Eliminacioacuten de la instanciaTrue
3511 Uso de make-instance
Cuando queremos crear una instancia de una clase para ir rellenandola con los resultados o datos quevayamos obteniendo se haria lo siguiente
(bind variable_instancia (make-instance nombre_instancia of nombre_clase))
Una vez creada podemos jugar con dicha instancia en las diferentes reglas siempre que la llamemos enlos activadores
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2859
35 Las clasesinstancias 25
(defrule reglavar_instancia lt- (object (is-a nombre_clase))=gt
)
De esta manera dentro de la regla podemos hacer acciones con la instancia por ejemplo(send var_instancia put-articulo articulo_ejemplo)
3512 Como generar automaacuteticamente nombres de instancia
En ocasiones queremos crear instancias en reglas y queremos que su nombre sea distinto del de otrasque ya tenemos Para ello podemos utilizar las funciones gensym y gensym La primera genera un siacutembolodel estilo genN donde N es un nuacutemero La segunda hace lo mismo pero aseguraacutendose de que ese siacutembolono exista ya Se puede reiniciar el contador que usan estas dos funciones con el operador (setgen ltnumgt)donde ltnumgt es el nuacutemero por el que queremos que empiecen ahora los siacutembolos
Para usar esto para generar el nombre de una instancia podemos hacer
(make-instance (gensym) of ltclasegt)
Cada vez que se ejecute se generaraacute un nombre de instancia nuevoSi creamos instancias de diferentes clases y queremos que las instancias tengan nombres que podamos
identificar podemos concatenar siacutembolos a los siacutembolos generados por gensym por ejemplo
(make-instance (sym-cat pepe- (gensym)) of ltclasegt)
generaraacute una instancia con el nombre pepe-genN
3513 Com fer un getset drsquoun slot drsquouna classe
Per consultar el valor drsquoun slot drsquouna classe ho podem fer enviant-li un missatge de la seguumlent manera
(send ltVARIABLEgt get-ltNOM_ATRIBUTgt)
Per exemple si tenim una instagravencia de la classe Plat ( instancia ) i volem saber el valor del seu slotnom
(send instancia get-nom)
Per assignar un valor a un slot drsquouna drsquoinstagravencia hem drsquoenviar-li un missatge de la seguumlent manera
(send ltVARIABLEgt put-ltNOM_ATRIBUTgt ltVALORgt)On ltVALORgt pot ser un valor o un megravetode que retorni un valor
(send instancia put-nom nom)
3514 iquestCoacutemo acceder a una instancia cuyo nombre conocemos
Si conocemos el nombre de una instancia y necesitamos acceder a ella es decir necesitamos enviarle alguacutenmensaje mediante la funcioacuten send podemos hacerlo directamente escribiendo en lugar de la variable quealmacena la instancia el nombre de la instancia entre corchetes [ ] A continuacioacuten se muestra un ejemplo
(bind altura_rect1 (send [rect1] get-altura))
En este caso se guardaraacute en la variable altura_rect1 el valor de la altura de la instancia que tiene comonombre rect1
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2959
26 Capiacutetulo 3 CLIPS
3515 Obtenir el nom drsquouna classe
Si tenim una instagravencia drsquouna classe i volem saber el nom de la classe (uacutetil si tenim una bona taxonomiade classes) ho podem fer amb el megravetode (class ltINSTANCIAgt)
Si per exemple imaginem que tenim la classe Actor la qual teacute com subclasses la classe APrincipalASecundari i ACameo Imaginem que estem tractant amb instancies drsquoactors i volem saber si la instanciaque estem tractant es de la classe APrincipal
Ho hauriacuteem de fer de la seguumlent manera
(eq (class instancia) APrincipal)
Fixem-nos que APrincipal eacutes un siacutembol no un String (un truco eacutes fixar-se en que no teacute cometes) Si vol-gueacutessim comparar-ho amb un String (per exemple un String introduiumlt per lrsquousuari) ho podriacuteem transformara un String amb el megravetode str-cat
(eq (str-cat (class instancia)) Principal)
3516 Como convierto un INSTANCE-ADRESS en un INSTANCE-NAME
En alguacuten momento nos podemos encontrar con la situacioacuten de que disponemos de un puntero a unainstancia y necesitamos su nombre o lo contrario En ambos casos podemos usar la funcioacuten instance-nameSu funcionamiento es bidireccional podemos introducirle un instance-name y nos devolveraacute un instance-adress y viceversa
1 (defrule imprimir-nombre2 estlt-(object (is-a Estudiante) (edad 25))3 =gt4 (printout t (instance-name est) crlf)5
)
3517 Com iterar a traveacutes drsquoun multi-slot
El seguumlent tambeacute eacutes vagravelid com exemple de com iterar a traveacutes drsquouna llistaImaginem que tenim una instagravencia de la classe Plat a la varible (plat) la qual teacute un multi-slot drsquoinstagravencies
de la classe Ingredient Imaginem que volem imprimir per pantalla el nom drsquoaquests ingredients (slot nomde la classe Ingredient) Necessitarem iterar sobre la llista drsquoingredients
1 (bind i 1)2 (while (lt= i (length$ (send plat get-ingredients)))3 do4 (bind ingredient (nth$ i (send plat get-ingredients)))5 (printout t (send ingredient get-nom) crlf)6 (bind i (+ i 1))7 )
El megravetode (nth$ ltINDEXgtltLLISTAgt) et retorna lrsquoelement situat a INDEX de LLISTAEl megravetode (length$ ltLLISTAgt) retorna el nuacutemero drsquoelements de LLISTA
3518 Coacutemo modificarinsertarborrar valores en un multislot
Los valores de un multislot se pueden cambiar usando la funcioacuten slot-replace$ La sintaxis es la siguiente
(slot-replace$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt ltvalorgt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3059
35 Las clasesinstancias 27
Donde ltiniciogt y ltfingt son el rango de posiciones del multislot que se quiere modificar y ltvalorgtson los valores que queremos reemplazar Obviamente deberaacute haber tantos valores como posiciones hayamosindicado en el rango
Para insertar nuevos valores podemos usar la funcioacuten slot-insert$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltposgt ltvalorgt)
El valor se inserta delante de la posicioacuten indicada si la posicioacuten es mayor que la longitud del multislot secolocaraacute al final
Para borrar elementos de un multislot podemos usar la funcioacuten slot-delete$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt)
Se borraraacuten los elementos que estaacuten en el rango indicado
3519 Coacutemo recorrer un atributo multievaluado
Supongamos que la variable respuesta tiene una lista de instancias
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 aquiacute hacemos lo que queramos4 )5 )
Loop-for-count funciona como un for primero la variable que haraacute de contador luego el valor de origeny luego el valor final Para controlar el final usamos la funcioacuten que he explicado antes i tomaraacute valoresdesde 1 hasta n asiacute que usando la funcioacuten nth$ obtendremos cada uno de los elementos La variable auxiraacute teniendo cada uno de los valores
3520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz)
Es igual que antes pero con dos bucles
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 (bind aux2 (send aux get-slot_que_queremos))4 (loop-for-count (j 1 (length$ aux2)) do5 (bind aux_final (nth$ j aux2))6 aquiacute ya podemos trabajar con el elemento en concreto7 )8 )
Supongamos que respuesta tiene una lista de instancias con el primer bucle haremos lo mismo que antes ir
iterando por esas instancias Una vez que tenemos cada instancia con aux2 con el segundo bucle iteraremosdentro de sus instancias interiores
Por ejemplo si tenemos varios equipos de fuacutetbol y cada equipo tiene varios jugadores en el primer bucleestamos iterando entre los equipos y en el segundo entre los jugadores de cada equipo en particular
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3159
28 Capiacutetulo 3 CLIPS
3521 Com puc esborrar una instagravencia
Per esborrar una instagravencia (per exemple segons la informacioacute que proporcioni lrsquousuari podem deduir queuna segraverie drsquoinstagravencies eacutes impossible que es facin servir per a la solucioacute) ho podem fer enviant un missatgedelete a la instagravencia eacutes a dir (send ltINSTANCIAgtdelete)
(send inst delete)
Un megravetode que podria ser uacutetil de la cara a la pragravectica podria ser el seguumlent
1 (defrule elimina-instancia2 (declare (salience 10))3 elimina-fact lt- (elimina-inst inst)4 =gt5 (send inst delete)6 (retract elimina-fact)
Imaginem que per exemple que volem eliminar una llista drsquoinstagravencies Per eliminar-les podriacuteem recoacuterrerel llistat marcant les instagravencies que volem esborrar afegint el seguumlent fet
(assert (elimina-instancia inst))
Aixiacute com que elimina-instancia teacute un salience alt esborraria les instagravencies marcades quan tingueacutes ocasioacuteDrsquoaquesta manera ens estalviem el problema de recoacuterrer un llistat drsquoinstagravencies amb un iterador mentre
anem eliminant els elements de la llista cosa que pot donar problemes amb lrsquoiterador
3522 Com imprimir una instagravencia
Per imprimir una classe (uacutetil per exemple per mostrar el resultat final) el millor eacutes definir message-handlersPer exemple imaginem que tenim una classe Plat la qual teacute un slot nom de tipus String Si volgueacutessimimprimir per pantalla un missatge que digueacutes
El nom del plat eacutes ndashltnom del platgtndash
Hauriacuteem de definir un message-handler que simplement imprimiacutes per pantalla el valor de lrsquoslot de laforma
(defmesssage-handler ltCLASSNAMEgt ltMESSAGENAMEgt primary ()ltCODIgt
)
Per el cas de lrsquoexemple
1 (defmessage-handler Plat print primary ()2 (printout t -- selfnom --) )3 )
Per cridar-ho nomeacutes caldragrave enviar-li un missatge a la instagravencia amb el nom del message-handler (enaquest cas print)
(send instancia print)
Un message-handler pot cridar a altres message-handlers amb el que es poden encadenar diverses instagraven-cies Per exemple imaginem que tenim la classe Menuacute la qual teacute un atribut plats que eacutes un llista drsquoinstagravenciesde la classe Plat Dintre del message-handler menuacute podriacuteem iterar a traveacutes de la llista de plats enviant elmissatge print que hem definit anteriorment
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3259
36 Programacioacuten 29
3523 Com es navega entre instagravencies relacionades
Per exemple tinc una instagravencia iA que teacute un slot anomenat slotB que eacutes una instagravencia drsquoun frame B Vullsaber el nom de la instagravencia associada al slotB de iA Ho pots fer aixiacute
(bind B (send iA get-slotB))(bind res (send B get-nom))
Si estagraves dins drsquouna condicioacute ho pots simplificar de la forma seguumlent
(bind res (send iAslotB get-nom)
Els dos punts soacuten equivalents al punt de Java
36 Programacioacuten
361 Com introduir un comentari
Els comentaris a CLIPS va darrere de un com per exemple
Comentari
Tambeacute podem afegir comentaris a les nostres regles deffacts deftemplates etc Generalment van darrereel nom de la estructura per exemple
1 (defrule neteja regla per la qual si la cuina estagrave bruta srsquoafegiragrave una tasca de2 neteja
3 (estat-cuina bruta)4 =gt5 (assert (tasca netejar))6 )
362 Referenciar el valor null a CLIPS
Per referenciar el valor null a clips es fa amb el simbol nil Per exemple si volem saber si una instagravenciainst es null ho podriacuteem fer de la seguumlent manera
(eq inst nil)
363 Formas de recorrer una lista
Para recorrer una lista disponemos de diferentes opciones en este FAQ explicaremos como crear unaestructura tipo ldquoWHILErdquo y tipo ldquoFORrdquo
1 While Esta regla se ejecuta hasta que la expresioacuten a evaluar sea falsa Este tipo de estructura se rigepor seguir la sintaxis while - do y se construiriacutea de la siguiente forma
(while ltexpresioacutengt[do] ltaccioacutengt)
Doacutende dependiendo del valor de ltexpresioacutengt
Valor TRUE Se realizaraacute la accioacuten ltaccioacutengt i se volveraacute a evaluar ltexpresioacutengt
Valor FALSE No se ejecutaraacute la accioacuten ltaccioacutengt
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3359
30 Capiacutetulo 3 CLIPS
2 For Esta regla sirve para ejecutar un bucle N (final - inicio) veces Este tipo de estructura se rige porseguir la sintaxis loop-for-count y se construiriacutea de la siguiente forma
(loop-for-count (ltvargtltiniciogtltfinalgt) [do] ltaccioacutengt)
Doacutende
ltvargt Variable que se usara como iacutendice
ltiniciogt Valor inicial que tendraacute ltvargt
ltfinalgt Ultimo valor que tendraacute la variable ltvargt
ltaccioacutengt Accioacuten que es realizaraacute hasta que ltvargt tenga el valor de ltfingt
364 Formas de elegir una opcioacuten
En este apartado explicaremos como crear una estructura if y una estructura switch
If Este tipo de estructura se rige por seguir la sintaxis if - then - else y se construiriacutea de lasiguiente forma
(if ltexpresioacutengtthen ltaccioacutengt[else ltaccioacuten2gt])
Doacutende dependiendo del valor de ltexpresioacutengt
bull Valor TRUE Se realizaraacute la accioacuten ltaccioacutengtbull Valor FALSE Se realizaraacute la accioacuten ltaccioacuten2gt (en caso de haber)
Switch Este tipo de estructura se rige por seguir la sintaxis switch - opciones y se construiriacutea dela siguiente forma
(switch ltexpresioacuten-testgt(case OPCION1 then ACCION1)(case OPCION2 then ACCION2)
([default] ACCION-DEFAULT)
)
Doacutende dependiendo del valor de ltexpresioacuten-casegt se ejecutaraacute una ltaccioacutengt en particular Si nin-guna ltopcioacutengt es correcta se ejecutara la ltaccioacuten-defaultgt
365 Funciones con la clase String
Habitualmente trabajaremos con Strings o cadena de Strings CLIPS proporciona una serie de herramien-tas para trabajar con esta clase
1 Convertir string a MAYUacuteSCULAS A veces es conveniente tener todos los caracteres en mayuacutesculaspara no tener problemas de comparaciones o simplemente por convenio Para ello CLIPS dispone dela funcioacuten upcase la cual convierte a mayuacutesculas un siacutembolo o string
(upcase ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplos
(upcase Ccedillips es divertido) rarr CcedilLIPS ES DIVERTIDO
(upcase Clips_es_divertido) rarr CLIPS_ES_DIVERTIDO
2 Convertir string a MINUacuteSCULAS la funcioacuten es downcase
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3459
36 Programacioacuten 31
3 Concatenacioacuten de strings Tambieacuten es de gran utilidad poder juntar dos o maacutes paraacutemetros en un solostring Todo paraacutemetro a juntar deben ser de uno de los siguientes tipos symbol String integer floato instance-name
(str-cat parametro1 parametro2 parametroN )
Ejemplo
(str-cat IA nota 10) rarr IAnota10
4 Comparacioacuten de strings Funcioacuten que nos indica si dos strings son iguales
(str-compareltexpresioacuten-simboacutelica-o-de-cadenagtltexpresioacuten-simboacutelica-o-de-cadenagt
)
Esta funcioacuten devuelve
0 Si ambos strings son iguales1 Si el primer string es mayor que el segundo string-1 Si el primer string es menor que el segundo string
5 Longitud de un string Muchas veces es de gran utilidad saber que tamantildeo tiene un string
(str-length ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplo
(str-length Inteligencia Artificial) rarr 23
366 iquestCoacutemo obtener el contenido de una variable en un string
Para conseguir un string a partir de un integer float symbol instance-name debes utilizar el comandostr-cat Si a la funcioacuten le pasamos como paraacutemetros varios elementos los transformaraacute a string y losconcatenaraacute La sintaxis de esta funcioacuten es la siguiente (str-cat elementos) Esta funcioacuten la usaremossobre todo cuando queramos realizar comparaciones entre el contenido de una variable y un string ya quepreviamente necesitaremos usar la funcioacuten str-cat para pasar el contenido de la variable a string y realizarde este modo la comparacioacuten de forma correcta
367 iquestComo se crea una lista
Con create$ Todos los operadores sobre listas llevan el siacutembolo $ al final Igual que con las variables sedebe usar bind siempre que se desee modificar una lista
(bind lista (create$ a b c))
368 iquestComo borro un elemento de una lista
Con delete$Usa la siguiente sintaxis(delete$ ltlistagt ltindice-iniciogt ltindice-finalgt)Se borraraacuten todos los elementos del rango entre las posiciones inicio y final ambas incluidas Tambieacuten exis-
tedelete-member$ (delete-member$ ltlistagt ltelementogt) Borraraacute todas las apariciones del elemento enla lista
(delete$ (create$ a b c d e f) 3 5) minusrarr (a b f)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2059
34 Las reglas 17
Es muy importante entender que cada regla se ejecutaraacute una vez por cada combinacioacuten de valores en suLHS
1 (defrule regla2 (color col)3 (peso pes)4 =gt5
Si tengo tres colores y dos pesos asertados la regla se ejecutaraacute 6 veces una con cada combinacioacuten decolor y peso
347 Com puc definir lrsquoordre de les regles
La idea drsquoun sistema basant en regles eacutes no definir un ordre lineal drsquoaquestes (costa deixar de pensar de
forma iterativa)En el cas de necessitar que una regla srsquoexecuti despreacutes drsquouna altre pots fer servir Fets la regla anteriorcrea un fet que la segona regla tindragrave a la part esquerra
1 (defrule pregunta12 =gt3 (assert (pregunta1Feta))4 5 )6
7 (defrule pregunta2
8 (pregunta1Feta)9 =gt
10 11 )
I finalment pots usar la propietat salience Aquesta propietat indica la prioritat drsquoexecucioacute de les regles( les regles amb salience majors srsquoexecutaran abans ) Pot prendre valors positius i negatius entre -10000 y+10000 Per defecte les regles tenen salience 0
1 (defrule pregunta12 (declare (salience 2))3 =gt4 5 )6
7 (defrule pregunta28 (declare (salience 1))9 =gt
10 11 )
El valor indicado en la propiedad salience puede ser el nuacutemero directamente o una expresioacuten por ejemplovariable10 podemos usar variable para elegir que regla se ejecutaraacute
Las prioridades deben ser usadas solo para determinar el orden en el que se disparan algunas reglas sobreotras no para fijar el flujo de control ya que la principal ventaja de un sistema basado en reglas es larepresentacioacuten declarativa del conocimiento y de esta forma abusando de las prioridades conduce a unsistema procedimental
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2159
18 Capiacutetulo 3 CLIPS
348 Com forccedilar que una regla sigui la primera
Per que aquesta regla sigui la primera ha de tenir el salience meacutes gran de totes
1 (defrule presentacio2 (declare (salience 20))3 =gt4 (printout t ------ Benvingut ----- crlf)5 )
349 Vull guardar certs valors que es fan servir durant lrsquoexecucioacute de diferents regles Com hopuc fer
Tens principalment dues alternatives Si el valor eacutes un tipus bagravesic pots fer servir una variable global ambla sintaxi seguumlent
(defglobal nom_variable = valor)
Aquesta sentegravencia no va a dins de cap funcioacute ni regla es posa sola a la part que creguis convenient delcodi Vegem un exemple
(defglobal preu_minim_primer = 1000)
Per fer-la servir es fa exactament de la mateixa manera que amb una variable normal perograve has de posarels dos asteriscs Per exemple
(bind preu_minim_primer curr-preu)
Per altra banda si el valor o valors que vols guardar han de ser instagravencies una bona estrategravegia pot serutilitzar un deftemplate Eacutes uacutetil sobretot per anar guardant solucions temporals o llistes drsquoelements quepoden formar part de la solucioacute
Per utilitzar-ho has de seguir els passos seguumlents
1 Definir el deftemplate
(deftemplate nom_del_deftemplate(multislot nom_multislot)
(slot nom_slot)
)
Amb un exemple es veuragrave meacutes clar
(deftemplate llista-plats(multislot primers)(multislot segons)(multislot postres)
)
2 Inicialitzar el deftemplate
(defrule[condicions vagraveries] La condicioacute base eacutes que llista-plats no srsquoha inicialitzat encara
(not (llista-plats))=gt
llista conteacute els valors de llista-plats (que de moment estan buits)(bind llista (assert (llista-plats)))
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2259
35 Las clasesinstancias 19
3 Assignar-li valors
(bind segons_plats (find-all-instances ((plat Plat)) TRUE)(modify llista (segons segons_plats))
4 Recuperar els valors
(defrule[condicions vagraveries]llista lt- (llista-plats (segons $segons_plats))
=gt
Ara la variable $segons_plats conteacute tots els elements de segons
35 Las clasesinstancias
351 Tengo que representar la jerarquiacutea de un frame iquestEs preferible antildeadir las subclases a laontologiacutea o bien diferenciarlas mediante un slot en la superclase
Las dos formas son vaacutelidas pero es recomendable representarlas en clases separadas cuando se vayan abuscar instancias de ese tipo ya que asiacute no tendremos que hacer un recorrido por todas las de la superclaseNo obstante si soacutelo se trata de una caracteriacutestica puntual del frame y no vamos a hacer buacutesquedas de unaexclusiva subclase entonces seraacute maacutes eficiente antildeadir un slot debido a su mejor accesibilidad
352 iquestQueacute es un objeto
Podriacuteamos decir que un objeto es un hecho no ordenado con herencia
353 iquestPorqueacute usar objetos en contexto de la praacutectica de CLIPS de IA
Como bien sabemos una parte de la praacutectica de SBCrsquos consisten en crear la ontologiacutea Esta ontologiacutease exporta para poder interactuar con CLIPS en formato pins y pont El archivo pont contendraacute ladeclaracioacuten de todas las clases creadas previamente por Protege (defclass ) El archivo pins contendraacute
todas las instancias de las clases declaradas en el archivo pont Como puede intuir el lector se necesitaraacuteinteractuar con los objetos previamente creados por Protegravegegrave
354 Como se definen las clases
Para definir las clases usaremos el constructor defclass
(defclass ltnombregt [ltcomentariogt](is-a ltnombre-de-superclasegt)[(role concrete | abstract)]
[(pattern-match reactive | non-reactive)]ltslotgt definicioacuten de los atributos de la clase
ltdocumentacioacuten-handlergt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2359
20 Capiacutetulo 3 CLIPS
En caso de desear que la nueva clase herede las propiedades de otra ya existente el nombre de esta deberaacuteespecificarse despues de is-a El rol determinaraacute si la clase es concreta (se puede instanciar) o abstracta(destinada a ser superclase) El pattern-match debe declararse como reactivo si se desea que las instanciasde la clase puedan unificar con los elementos objeto de las reglas (siacutembolo lt-) Los slots correspondena los atributos de la clase y los handlers a las funciones de eacutesta Los handlers se pueden declarar en ladeclaracioacuten de la propia clase pero se deben definir externamente Dado que no aporta ninguna ventaja
declararlos es recomendable definirlos directamente Noacutetese que todo aquello que estaacute entre corchetes ([])constituye informacioacuten adicional que no es obligatorio especificar
1 (defclass Persona2 (is-a Ser_Vivo)3 (role concrete)4 (single-slot edad5 (type INTEGER)6 (range 1 99)7 (cardinality 0 1)8 (create-accessor read-write)9 )
10 (multislot amigos11 (type INSTANCE)12 (allowed-classes Persona)13 )14 )
El comportamiento y declaracioacuten de los slots es ideacutentico al de los slots de los hechos ordenados Losatributos de tipo INSTANCE (referencian otras instancias) estan en formato INSTANCE-NAME
355 Com consulto una instagravencia a partir drsquouna regla
Podem fer servir la part esquerre drsquouna regla per trobar instagravencies Lrsquouacutes eacutes molt semblant a trobar elpunter a un fet fent servir
(object [(is-a ltNOM_CLASSEgt)|(name ltNOM_INSTANCIA)|(ltNOM-SLOTgt ltVALORVARIABLE))])
Per exemple si volem que una regla srsquoinstanciiuml si tenim instanciat un plat de la classe Plat podriem ferservir
1 (defrule tenimplat2 plat lt- (object (is-a Plat))3 =gt4 (print t (send plat get-nom) crlf)
La regla imprimiragrave el nom del plat que trobi Eacutes important notar que srsquoactivaragrave per cada instagravencia de platque tinguem a la base de coneixement
Podem consultar els valors de la instancia fent servir condicions a la part esquerre de la regla Per exemplesi nomeacutes volgueacutessim els plats amb un preu meacutes gran que 30
1 (defrule platCar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Srsquoactivaragrave per tots els plats amb un preu major a 30
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2459
35 Las clasesinstancias 21
Srsquoha drsquoanar amb cura per aquest tipus de regla ja que si la base de coneixement eacutes molt amplia pot acabarderivant amb problemes de memograveria
Per exemple si en comptes de preguntar per una instagravencia de Plat pregunteacutessim per dues instancies dePlat
1 (defrule platsCars2 plat1 lt- (object (is-a Plat) (Preu p1))3 plat2 lt- (object (is-a Plat) (Preu p2))4 (test (gt p1 30))5 (test (gt p2 30))6 =gt7 (print t (send plat1 get-nom) i (send plat1 get-nom) soacuten cars8 crlf)9 )
Faria unificacioacute amb totes les combinacions possibles (amb repeticions) de dos plats de tota la base deconeixement Aixograve es podria anar ampliant fins fer-se intractable
Si tenim drsquoalguna manera el nom de la instancia podem fer
1 (defrule platPicant2 (cuina (plat p))3 (object (name p) (picant pi))4 =gt5 (print t picant pi crlf)6 )
Aixoacute es pot servir per crear condicions que facin servir noms drsquoinstancies que tenim almacenats a slotsdrsquoaltres instancies per exemple
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send v get-Preu) crlf)6 )
Aquesta regla imprimiria el preu del vi asociat al plat si es negre
356 Tengo problemas en condiciones de reglas con slots de instancias obtenidos con send
A veces dan problemas las reglas en las que las condiciones sobre los valores de los slots de una instanciase escriben usando mensajes get sobre los atributos de una instancia en lugar de utilizar patrones paraobtenerlos por ejemplo la regla
1 (defrule platcar2 plat lt- (object (is-a Plat) )3 (test (gt (send plat get-Preu) 30))4 =gt5 (print t (send plat get-nom) es car6 crlf)7 )
No funciona correctamente en CLIPS pero la regla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2559
22 Capiacutetulo 3 CLIPS
1 (defrule platcar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Siacute lo haceEn el caso de que el valor del slot sea booleano se puede escribir la regla como
1 (defrule platpicant2 plat lt- (object (is-a Plat) (Picant TRUE))3 =gt4 (print t (send plat get-nom) es picant crlf)
En el caso de que el slot sea a su vez una instancia se puede utilizar para obtener los valores de estainstancia en la condicion como se explica en la pregunta anterior
357 Tengo problemas con instancias obtenidas del slot de otra instancia en el patroacuten de unaregla
Este problema aparece cuando el patron de una regla instancia una variable a un nombre de instancia yesta no esta definida en el modulo de la regla por ejemplo si la regla siguiente pertenece a un modulo queno es el de la instancia
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4
=gt5 (print t preu (send v get-Preu) crlf)6 )
La regla se quejaraacute de que la instancia no existe al enviarle el send ya que solo se busca la instancia dentrodel moacutedulo de la regla y no en los importados Para arreglar esto se puede usar la funcioacuten (instance-address[ltMODULOgt|] ltINSTANCIAgt) que busca la direccion de la instancia en un modulo concreto o en todos losmoacutedulos que se importan () Deberiacuteamos entonces escribir la regla
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send (instance-address v) get-Preu) crlf)6 )
358 iquestCoacutemo realizar una buacutesqueda de instancias que cumplan unas restricciones
CLIPS nos ofrece varias funciones de buacutesqueda de instancias que cumplan unas determinadas restriccionesque a nosotros nos interese
La funcioacuten find-instance Esta funcioacuten devuelve la primera instancia que cumple todas las restric-ciones indicadas
La funcioacuten find-all-instances Esta funcioacuten devuelve todas las instancias que cumplen las restric-ciones indicadas
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2659
35 Las clasesinstancias 23
La sintaxis de ambas funciones es igual exceptuando el nombre de la funcioacuten(find-all-instances (clase_instancias) (restricciones))A continuacioacuten se muestran varios ejemplos
(bind rectangulos (find-all-instances ((inst Rectangulo)) (gtinstaltura 10))) Des-pueacutes de ejecutar esta funcioacuten en la variable rectangulos habraacute una lista con todas las instancias de la
clase Rectangulo cuya altura sea superior a 10(bind rectangulos (find-all-instances ((inst Rectangulo)) (and (gtinstaltura 10) (=instanchura 7)))) Este trozo de coacutedigo hace que en la variable rectangulos se guarde una listade las instancias de la clase Rectangulo que tienen una altura superior a 10 y una anchura igual a 7
Estas funciones que CLIPS nos ofrece tienen otra funcionalidad y es que podemos realizar buacutesquedas deconjuntos de instancias
(bind rectangulos (find-all-instances ((a Rectangulo) (b Rectangulo)) (= aalturabaltura))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas de instancias de laclase Rectangulo que tienen la misma altura
Por uacuteltimo es necesario comentar que se pueden realizar buacutesquedas de conjuntos de instancias que seande distintas clases
(bind figuras (find-all-instances ((rect Rectangulo) (circ Circulo)) (= rectalturacircradio))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas ltrectangulocirculogtque cumplan que la altura del rectaacutengulo sea igual al radio del ciacuterculo
Existen maacutes comandos para obtener instancias pero son menos utilizadas a nivel baacutesico como pueden serany-instancep do-for-instance do-for-all-instances y delayed-do-for-all-instances
359 iquestCoacutemo se interactuacutea con objetos
La interaccioacuten con objetos se efectuacutea mediante lo que se denomina mensaje
(defmessage-handlerltnombre-clasegtltnombre-mensajegt[lttipo-handlergt] [ltcomentariogt]ltparaacutemetrogt [ltparaacutemetro-comodiacutengt])ltaccioacutengt
)
Un gestor de mensajes consta de 7 partes
1 Nombre de clase a la que el gestor estaraacute asociado
2 Nombre del mensaje
3 Tipo de gestor (Nosotros habitualmente usaremos primary que viene por defecto)
4 Comentario (opcional)
5 Lista de paraacutemetros6 Paraacutemetro comodiacuten (para gestionar muacuteltiples paraacutemetros)
7 Secuencia de acciones o expresiones que seraacuten ejecutadas por el gestor
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2759
24 Capiacutetulo 3 CLIPS
Enfocado a la praacutectica de CLIPS la maacutes comuacuten es que queramos interactuar con objetos para
1 Imprimir los objetos Un ejemplo
1 (defmessage-handler avion imprimir-beneficio ()
2 Para implementar funciones calculadas asociadas al objeto Un ejemplo
1 (defmessage-handler avion calcular-beneficio ()2 ( selfplazas-ocupadas selfprecio-billete))3 )
Como se puede observar el paraacutemetro impliacutecito self contiene la instancia activa para este mensaje
3510 iquestComo se interactuacutea con las instancias de los objetos
Podremos interactuar entre las instancias de los objetos mediante la funcioacuten send
(send ltexpresioacuten-de-objetogtltnombre-de-mensajegtltexpresioacutengt)Donde se toman como argumentos el objeto destino del mensaje el mensaje mismo y otros paraacutemetros
que debieran ser pasados a los gestoresParticularmente en el aacutembito de la praacutectica usualmente necesitaremos utilizar el envioacute de mensajes de
tipo get put and delete Estos mensajes tiene la siguiente sintaxis
get-ltnombre-atributogt
put-ltnombre-atributogt
delete
Aquiacute tenemos un ejemplo de como utilizarlo recordando que ponemos entre corchetes la instancia la cualse enviacutea el mensaje
(defclass avion (is-a USER)(role concrete)(slot precio-billete (create-accessor read) (default 34))(slot plazas-ocupadas (create-accessor write) (default 0)))
Clase creada
gt(make-instance a of avion) Creacioacuten de una instancia de avion[a]
gt(send [a] get-precio-billete) Obtencioacuten de un slot34 Resultado obtenidogt(send [a] put-plazas-ocupadas 100) Modificacioacuten de un slotgt(send [a] delete) Eliminacioacuten de la instanciaTrue
3511 Uso de make-instance
Cuando queremos crear una instancia de una clase para ir rellenandola con los resultados o datos quevayamos obteniendo se haria lo siguiente
(bind variable_instancia (make-instance nombre_instancia of nombre_clase))
Una vez creada podemos jugar con dicha instancia en las diferentes reglas siempre que la llamemos enlos activadores
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2859
35 Las clasesinstancias 25
(defrule reglavar_instancia lt- (object (is-a nombre_clase))=gt
)
De esta manera dentro de la regla podemos hacer acciones con la instancia por ejemplo(send var_instancia put-articulo articulo_ejemplo)
3512 Como generar automaacuteticamente nombres de instancia
En ocasiones queremos crear instancias en reglas y queremos que su nombre sea distinto del de otrasque ya tenemos Para ello podemos utilizar las funciones gensym y gensym La primera genera un siacutembolodel estilo genN donde N es un nuacutemero La segunda hace lo mismo pero aseguraacutendose de que ese siacutembolono exista ya Se puede reiniciar el contador que usan estas dos funciones con el operador (setgen ltnumgt)donde ltnumgt es el nuacutemero por el que queremos que empiecen ahora los siacutembolos
Para usar esto para generar el nombre de una instancia podemos hacer
(make-instance (gensym) of ltclasegt)
Cada vez que se ejecute se generaraacute un nombre de instancia nuevoSi creamos instancias de diferentes clases y queremos que las instancias tengan nombres que podamos
identificar podemos concatenar siacutembolos a los siacutembolos generados por gensym por ejemplo
(make-instance (sym-cat pepe- (gensym)) of ltclasegt)
generaraacute una instancia con el nombre pepe-genN
3513 Com fer un getset drsquoun slot drsquouna classe
Per consultar el valor drsquoun slot drsquouna classe ho podem fer enviant-li un missatge de la seguumlent manera
(send ltVARIABLEgt get-ltNOM_ATRIBUTgt)
Per exemple si tenim una instagravencia de la classe Plat ( instancia ) i volem saber el valor del seu slotnom
(send instancia get-nom)
Per assignar un valor a un slot drsquouna drsquoinstagravencia hem drsquoenviar-li un missatge de la seguumlent manera
(send ltVARIABLEgt put-ltNOM_ATRIBUTgt ltVALORgt)On ltVALORgt pot ser un valor o un megravetode que retorni un valor
(send instancia put-nom nom)
3514 iquestCoacutemo acceder a una instancia cuyo nombre conocemos
Si conocemos el nombre de una instancia y necesitamos acceder a ella es decir necesitamos enviarle alguacutenmensaje mediante la funcioacuten send podemos hacerlo directamente escribiendo en lugar de la variable quealmacena la instancia el nombre de la instancia entre corchetes [ ] A continuacioacuten se muestra un ejemplo
(bind altura_rect1 (send [rect1] get-altura))
En este caso se guardaraacute en la variable altura_rect1 el valor de la altura de la instancia que tiene comonombre rect1
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2959
26 Capiacutetulo 3 CLIPS
3515 Obtenir el nom drsquouna classe
Si tenim una instagravencia drsquouna classe i volem saber el nom de la classe (uacutetil si tenim una bona taxonomiade classes) ho podem fer amb el megravetode (class ltINSTANCIAgt)
Si per exemple imaginem que tenim la classe Actor la qual teacute com subclasses la classe APrincipalASecundari i ACameo Imaginem que estem tractant amb instancies drsquoactors i volem saber si la instanciaque estem tractant es de la classe APrincipal
Ho hauriacuteem de fer de la seguumlent manera
(eq (class instancia) APrincipal)
Fixem-nos que APrincipal eacutes un siacutembol no un String (un truco eacutes fixar-se en que no teacute cometes) Si vol-gueacutessim comparar-ho amb un String (per exemple un String introduiumlt per lrsquousuari) ho podriacuteem transformara un String amb el megravetode str-cat
(eq (str-cat (class instancia)) Principal)
3516 Como convierto un INSTANCE-ADRESS en un INSTANCE-NAME
En alguacuten momento nos podemos encontrar con la situacioacuten de que disponemos de un puntero a unainstancia y necesitamos su nombre o lo contrario En ambos casos podemos usar la funcioacuten instance-nameSu funcionamiento es bidireccional podemos introducirle un instance-name y nos devolveraacute un instance-adress y viceversa
1 (defrule imprimir-nombre2 estlt-(object (is-a Estudiante) (edad 25))3 =gt4 (printout t (instance-name est) crlf)5
)
3517 Com iterar a traveacutes drsquoun multi-slot
El seguumlent tambeacute eacutes vagravelid com exemple de com iterar a traveacutes drsquouna llistaImaginem que tenim una instagravencia de la classe Plat a la varible (plat) la qual teacute un multi-slot drsquoinstagravencies
de la classe Ingredient Imaginem que volem imprimir per pantalla el nom drsquoaquests ingredients (slot nomde la classe Ingredient) Necessitarem iterar sobre la llista drsquoingredients
1 (bind i 1)2 (while (lt= i (length$ (send plat get-ingredients)))3 do4 (bind ingredient (nth$ i (send plat get-ingredients)))5 (printout t (send ingredient get-nom) crlf)6 (bind i (+ i 1))7 )
El megravetode (nth$ ltINDEXgtltLLISTAgt) et retorna lrsquoelement situat a INDEX de LLISTAEl megravetode (length$ ltLLISTAgt) retorna el nuacutemero drsquoelements de LLISTA
3518 Coacutemo modificarinsertarborrar valores en un multislot
Los valores de un multislot se pueden cambiar usando la funcioacuten slot-replace$ La sintaxis es la siguiente
(slot-replace$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt ltvalorgt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3059
35 Las clasesinstancias 27
Donde ltiniciogt y ltfingt son el rango de posiciones del multislot que se quiere modificar y ltvalorgtson los valores que queremos reemplazar Obviamente deberaacute haber tantos valores como posiciones hayamosindicado en el rango
Para insertar nuevos valores podemos usar la funcioacuten slot-insert$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltposgt ltvalorgt)
El valor se inserta delante de la posicioacuten indicada si la posicioacuten es mayor que la longitud del multislot secolocaraacute al final
Para borrar elementos de un multislot podemos usar la funcioacuten slot-delete$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt)
Se borraraacuten los elementos que estaacuten en el rango indicado
3519 Coacutemo recorrer un atributo multievaluado
Supongamos que la variable respuesta tiene una lista de instancias
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 aquiacute hacemos lo que queramos4 )5 )
Loop-for-count funciona como un for primero la variable que haraacute de contador luego el valor de origeny luego el valor final Para controlar el final usamos la funcioacuten que he explicado antes i tomaraacute valoresdesde 1 hasta n asiacute que usando la funcioacuten nth$ obtendremos cada uno de los elementos La variable auxiraacute teniendo cada uno de los valores
3520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz)
Es igual que antes pero con dos bucles
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 (bind aux2 (send aux get-slot_que_queremos))4 (loop-for-count (j 1 (length$ aux2)) do5 (bind aux_final (nth$ j aux2))6 aquiacute ya podemos trabajar con el elemento en concreto7 )8 )
Supongamos que respuesta tiene una lista de instancias con el primer bucle haremos lo mismo que antes ir
iterando por esas instancias Una vez que tenemos cada instancia con aux2 con el segundo bucle iteraremosdentro de sus instancias interiores
Por ejemplo si tenemos varios equipos de fuacutetbol y cada equipo tiene varios jugadores en el primer bucleestamos iterando entre los equipos y en el segundo entre los jugadores de cada equipo en particular
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3159
28 Capiacutetulo 3 CLIPS
3521 Com puc esborrar una instagravencia
Per esborrar una instagravencia (per exemple segons la informacioacute que proporcioni lrsquousuari podem deduir queuna segraverie drsquoinstagravencies eacutes impossible que es facin servir per a la solucioacute) ho podem fer enviant un missatgedelete a la instagravencia eacutes a dir (send ltINSTANCIAgtdelete)
(send inst delete)
Un megravetode que podria ser uacutetil de la cara a la pragravectica podria ser el seguumlent
1 (defrule elimina-instancia2 (declare (salience 10))3 elimina-fact lt- (elimina-inst inst)4 =gt5 (send inst delete)6 (retract elimina-fact)
Imaginem que per exemple que volem eliminar una llista drsquoinstagravencies Per eliminar-les podriacuteem recoacuterrerel llistat marcant les instagravencies que volem esborrar afegint el seguumlent fet
(assert (elimina-instancia inst))
Aixiacute com que elimina-instancia teacute un salience alt esborraria les instagravencies marcades quan tingueacutes ocasioacuteDrsquoaquesta manera ens estalviem el problema de recoacuterrer un llistat drsquoinstagravencies amb un iterador mentre
anem eliminant els elements de la llista cosa que pot donar problemes amb lrsquoiterador
3522 Com imprimir una instagravencia
Per imprimir una classe (uacutetil per exemple per mostrar el resultat final) el millor eacutes definir message-handlersPer exemple imaginem que tenim una classe Plat la qual teacute un slot nom de tipus String Si volgueacutessimimprimir per pantalla un missatge que digueacutes
El nom del plat eacutes ndashltnom del platgtndash
Hauriacuteem de definir un message-handler que simplement imprimiacutes per pantalla el valor de lrsquoslot de laforma
(defmesssage-handler ltCLASSNAMEgt ltMESSAGENAMEgt primary ()ltCODIgt
)
Per el cas de lrsquoexemple
1 (defmessage-handler Plat print primary ()2 (printout t -- selfnom --) )3 )
Per cridar-ho nomeacutes caldragrave enviar-li un missatge a la instagravencia amb el nom del message-handler (enaquest cas print)
(send instancia print)
Un message-handler pot cridar a altres message-handlers amb el que es poden encadenar diverses instagraven-cies Per exemple imaginem que tenim la classe Menuacute la qual teacute un atribut plats que eacutes un llista drsquoinstagravenciesde la classe Plat Dintre del message-handler menuacute podriacuteem iterar a traveacutes de la llista de plats enviant elmissatge print que hem definit anteriorment
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3259
36 Programacioacuten 29
3523 Com es navega entre instagravencies relacionades
Per exemple tinc una instagravencia iA que teacute un slot anomenat slotB que eacutes una instagravencia drsquoun frame B Vullsaber el nom de la instagravencia associada al slotB de iA Ho pots fer aixiacute
(bind B (send iA get-slotB))(bind res (send B get-nom))
Si estagraves dins drsquouna condicioacute ho pots simplificar de la forma seguumlent
(bind res (send iAslotB get-nom)
Els dos punts soacuten equivalents al punt de Java
36 Programacioacuten
361 Com introduir un comentari
Els comentaris a CLIPS va darrere de un com per exemple
Comentari
Tambeacute podem afegir comentaris a les nostres regles deffacts deftemplates etc Generalment van darrereel nom de la estructura per exemple
1 (defrule neteja regla per la qual si la cuina estagrave bruta srsquoafegiragrave una tasca de2 neteja
3 (estat-cuina bruta)4 =gt5 (assert (tasca netejar))6 )
362 Referenciar el valor null a CLIPS
Per referenciar el valor null a clips es fa amb el simbol nil Per exemple si volem saber si una instagravenciainst es null ho podriacuteem fer de la seguumlent manera
(eq inst nil)
363 Formas de recorrer una lista
Para recorrer una lista disponemos de diferentes opciones en este FAQ explicaremos como crear unaestructura tipo ldquoWHILErdquo y tipo ldquoFORrdquo
1 While Esta regla se ejecuta hasta que la expresioacuten a evaluar sea falsa Este tipo de estructura se rigepor seguir la sintaxis while - do y se construiriacutea de la siguiente forma
(while ltexpresioacutengt[do] ltaccioacutengt)
Doacutende dependiendo del valor de ltexpresioacutengt
Valor TRUE Se realizaraacute la accioacuten ltaccioacutengt i se volveraacute a evaluar ltexpresioacutengt
Valor FALSE No se ejecutaraacute la accioacuten ltaccioacutengt
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3359
30 Capiacutetulo 3 CLIPS
2 For Esta regla sirve para ejecutar un bucle N (final - inicio) veces Este tipo de estructura se rige porseguir la sintaxis loop-for-count y se construiriacutea de la siguiente forma
(loop-for-count (ltvargtltiniciogtltfinalgt) [do] ltaccioacutengt)
Doacutende
ltvargt Variable que se usara como iacutendice
ltiniciogt Valor inicial que tendraacute ltvargt
ltfinalgt Ultimo valor que tendraacute la variable ltvargt
ltaccioacutengt Accioacuten que es realizaraacute hasta que ltvargt tenga el valor de ltfingt
364 Formas de elegir una opcioacuten
En este apartado explicaremos como crear una estructura if y una estructura switch
If Este tipo de estructura se rige por seguir la sintaxis if - then - else y se construiriacutea de lasiguiente forma
(if ltexpresioacutengtthen ltaccioacutengt[else ltaccioacuten2gt])
Doacutende dependiendo del valor de ltexpresioacutengt
bull Valor TRUE Se realizaraacute la accioacuten ltaccioacutengtbull Valor FALSE Se realizaraacute la accioacuten ltaccioacuten2gt (en caso de haber)
Switch Este tipo de estructura se rige por seguir la sintaxis switch - opciones y se construiriacutea dela siguiente forma
(switch ltexpresioacuten-testgt(case OPCION1 then ACCION1)(case OPCION2 then ACCION2)
([default] ACCION-DEFAULT)
)
Doacutende dependiendo del valor de ltexpresioacuten-casegt se ejecutaraacute una ltaccioacutengt en particular Si nin-guna ltopcioacutengt es correcta se ejecutara la ltaccioacuten-defaultgt
365 Funciones con la clase String
Habitualmente trabajaremos con Strings o cadena de Strings CLIPS proporciona una serie de herramien-tas para trabajar con esta clase
1 Convertir string a MAYUacuteSCULAS A veces es conveniente tener todos los caracteres en mayuacutesculaspara no tener problemas de comparaciones o simplemente por convenio Para ello CLIPS dispone dela funcioacuten upcase la cual convierte a mayuacutesculas un siacutembolo o string
(upcase ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplos
(upcase Ccedillips es divertido) rarr CcedilLIPS ES DIVERTIDO
(upcase Clips_es_divertido) rarr CLIPS_ES_DIVERTIDO
2 Convertir string a MINUacuteSCULAS la funcioacuten es downcase
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3459
36 Programacioacuten 31
3 Concatenacioacuten de strings Tambieacuten es de gran utilidad poder juntar dos o maacutes paraacutemetros en un solostring Todo paraacutemetro a juntar deben ser de uno de los siguientes tipos symbol String integer floato instance-name
(str-cat parametro1 parametro2 parametroN )
Ejemplo
(str-cat IA nota 10) rarr IAnota10
4 Comparacioacuten de strings Funcioacuten que nos indica si dos strings son iguales
(str-compareltexpresioacuten-simboacutelica-o-de-cadenagtltexpresioacuten-simboacutelica-o-de-cadenagt
)
Esta funcioacuten devuelve
0 Si ambos strings son iguales1 Si el primer string es mayor que el segundo string-1 Si el primer string es menor que el segundo string
5 Longitud de un string Muchas veces es de gran utilidad saber que tamantildeo tiene un string
(str-length ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplo
(str-length Inteligencia Artificial) rarr 23
366 iquestCoacutemo obtener el contenido de una variable en un string
Para conseguir un string a partir de un integer float symbol instance-name debes utilizar el comandostr-cat Si a la funcioacuten le pasamos como paraacutemetros varios elementos los transformaraacute a string y losconcatenaraacute La sintaxis de esta funcioacuten es la siguiente (str-cat elementos) Esta funcioacuten la usaremossobre todo cuando queramos realizar comparaciones entre el contenido de una variable y un string ya quepreviamente necesitaremos usar la funcioacuten str-cat para pasar el contenido de la variable a string y realizarde este modo la comparacioacuten de forma correcta
367 iquestComo se crea una lista
Con create$ Todos los operadores sobre listas llevan el siacutembolo $ al final Igual que con las variables sedebe usar bind siempre que se desee modificar una lista
(bind lista (create$ a b c))
368 iquestComo borro un elemento de una lista
Con delete$Usa la siguiente sintaxis(delete$ ltlistagt ltindice-iniciogt ltindice-finalgt)Se borraraacuten todos los elementos del rango entre las posiciones inicio y final ambas incluidas Tambieacuten exis-
tedelete-member$ (delete-member$ ltlistagt ltelementogt) Borraraacute todas las apariciones del elemento enla lista
(delete$ (create$ a b c d e f) 3 5) minusrarr (a b f)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2159
18 Capiacutetulo 3 CLIPS
348 Com forccedilar que una regla sigui la primera
Per que aquesta regla sigui la primera ha de tenir el salience meacutes gran de totes
1 (defrule presentacio2 (declare (salience 20))3 =gt4 (printout t ------ Benvingut ----- crlf)5 )
349 Vull guardar certs valors que es fan servir durant lrsquoexecucioacute de diferents regles Com hopuc fer
Tens principalment dues alternatives Si el valor eacutes un tipus bagravesic pots fer servir una variable global ambla sintaxi seguumlent
(defglobal nom_variable = valor)
Aquesta sentegravencia no va a dins de cap funcioacute ni regla es posa sola a la part que creguis convenient delcodi Vegem un exemple
(defglobal preu_minim_primer = 1000)
Per fer-la servir es fa exactament de la mateixa manera que amb una variable normal perograve has de posarels dos asteriscs Per exemple
(bind preu_minim_primer curr-preu)
Per altra banda si el valor o valors que vols guardar han de ser instagravencies una bona estrategravegia pot serutilitzar un deftemplate Eacutes uacutetil sobretot per anar guardant solucions temporals o llistes drsquoelements quepoden formar part de la solucioacute
Per utilitzar-ho has de seguir els passos seguumlents
1 Definir el deftemplate
(deftemplate nom_del_deftemplate(multislot nom_multislot)
(slot nom_slot)
)
Amb un exemple es veuragrave meacutes clar
(deftemplate llista-plats(multislot primers)(multislot segons)(multislot postres)
)
2 Inicialitzar el deftemplate
(defrule[condicions vagraveries] La condicioacute base eacutes que llista-plats no srsquoha inicialitzat encara
(not (llista-plats))=gt
llista conteacute els valors de llista-plats (que de moment estan buits)(bind llista (assert (llista-plats)))
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2259
35 Las clasesinstancias 19
3 Assignar-li valors
(bind segons_plats (find-all-instances ((plat Plat)) TRUE)(modify llista (segons segons_plats))
4 Recuperar els valors
(defrule[condicions vagraveries]llista lt- (llista-plats (segons $segons_plats))
=gt
Ara la variable $segons_plats conteacute tots els elements de segons
35 Las clasesinstancias
351 Tengo que representar la jerarquiacutea de un frame iquestEs preferible antildeadir las subclases a laontologiacutea o bien diferenciarlas mediante un slot en la superclase
Las dos formas son vaacutelidas pero es recomendable representarlas en clases separadas cuando se vayan abuscar instancias de ese tipo ya que asiacute no tendremos que hacer un recorrido por todas las de la superclaseNo obstante si soacutelo se trata de una caracteriacutestica puntual del frame y no vamos a hacer buacutesquedas de unaexclusiva subclase entonces seraacute maacutes eficiente antildeadir un slot debido a su mejor accesibilidad
352 iquestQueacute es un objeto
Podriacuteamos decir que un objeto es un hecho no ordenado con herencia
353 iquestPorqueacute usar objetos en contexto de la praacutectica de CLIPS de IA
Como bien sabemos una parte de la praacutectica de SBCrsquos consisten en crear la ontologiacutea Esta ontologiacutease exporta para poder interactuar con CLIPS en formato pins y pont El archivo pont contendraacute ladeclaracioacuten de todas las clases creadas previamente por Protege (defclass ) El archivo pins contendraacute
todas las instancias de las clases declaradas en el archivo pont Como puede intuir el lector se necesitaraacuteinteractuar con los objetos previamente creados por Protegravegegrave
354 Como se definen las clases
Para definir las clases usaremos el constructor defclass
(defclass ltnombregt [ltcomentariogt](is-a ltnombre-de-superclasegt)[(role concrete | abstract)]
[(pattern-match reactive | non-reactive)]ltslotgt definicioacuten de los atributos de la clase
ltdocumentacioacuten-handlergt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2359
20 Capiacutetulo 3 CLIPS
En caso de desear que la nueva clase herede las propiedades de otra ya existente el nombre de esta deberaacuteespecificarse despues de is-a El rol determinaraacute si la clase es concreta (se puede instanciar) o abstracta(destinada a ser superclase) El pattern-match debe declararse como reactivo si se desea que las instanciasde la clase puedan unificar con los elementos objeto de las reglas (siacutembolo lt-) Los slots correspondena los atributos de la clase y los handlers a las funciones de eacutesta Los handlers se pueden declarar en ladeclaracioacuten de la propia clase pero se deben definir externamente Dado que no aporta ninguna ventaja
declararlos es recomendable definirlos directamente Noacutetese que todo aquello que estaacute entre corchetes ([])constituye informacioacuten adicional que no es obligatorio especificar
1 (defclass Persona2 (is-a Ser_Vivo)3 (role concrete)4 (single-slot edad5 (type INTEGER)6 (range 1 99)7 (cardinality 0 1)8 (create-accessor read-write)9 )
10 (multislot amigos11 (type INSTANCE)12 (allowed-classes Persona)13 )14 )
El comportamiento y declaracioacuten de los slots es ideacutentico al de los slots de los hechos ordenados Losatributos de tipo INSTANCE (referencian otras instancias) estan en formato INSTANCE-NAME
355 Com consulto una instagravencia a partir drsquouna regla
Podem fer servir la part esquerre drsquouna regla per trobar instagravencies Lrsquouacutes eacutes molt semblant a trobar elpunter a un fet fent servir
(object [(is-a ltNOM_CLASSEgt)|(name ltNOM_INSTANCIA)|(ltNOM-SLOTgt ltVALORVARIABLE))])
Per exemple si volem que una regla srsquoinstanciiuml si tenim instanciat un plat de la classe Plat podriem ferservir
1 (defrule tenimplat2 plat lt- (object (is-a Plat))3 =gt4 (print t (send plat get-nom) crlf)
La regla imprimiragrave el nom del plat que trobi Eacutes important notar que srsquoactivaragrave per cada instagravencia de platque tinguem a la base de coneixement
Podem consultar els valors de la instancia fent servir condicions a la part esquerre de la regla Per exemplesi nomeacutes volgueacutessim els plats amb un preu meacutes gran que 30
1 (defrule platCar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Srsquoactivaragrave per tots els plats amb un preu major a 30
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2459
35 Las clasesinstancias 21
Srsquoha drsquoanar amb cura per aquest tipus de regla ja que si la base de coneixement eacutes molt amplia pot acabarderivant amb problemes de memograveria
Per exemple si en comptes de preguntar per una instagravencia de Plat pregunteacutessim per dues instancies dePlat
1 (defrule platsCars2 plat1 lt- (object (is-a Plat) (Preu p1))3 plat2 lt- (object (is-a Plat) (Preu p2))4 (test (gt p1 30))5 (test (gt p2 30))6 =gt7 (print t (send plat1 get-nom) i (send plat1 get-nom) soacuten cars8 crlf)9 )
Faria unificacioacute amb totes les combinacions possibles (amb repeticions) de dos plats de tota la base deconeixement Aixograve es podria anar ampliant fins fer-se intractable
Si tenim drsquoalguna manera el nom de la instancia podem fer
1 (defrule platPicant2 (cuina (plat p))3 (object (name p) (picant pi))4 =gt5 (print t picant pi crlf)6 )
Aixoacute es pot servir per crear condicions que facin servir noms drsquoinstancies que tenim almacenats a slotsdrsquoaltres instancies per exemple
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send v get-Preu) crlf)6 )
Aquesta regla imprimiria el preu del vi asociat al plat si es negre
356 Tengo problemas en condiciones de reglas con slots de instancias obtenidos con send
A veces dan problemas las reglas en las que las condiciones sobre los valores de los slots de una instanciase escriben usando mensajes get sobre los atributos de una instancia en lugar de utilizar patrones paraobtenerlos por ejemplo la regla
1 (defrule platcar2 plat lt- (object (is-a Plat) )3 (test (gt (send plat get-Preu) 30))4 =gt5 (print t (send plat get-nom) es car6 crlf)7 )
No funciona correctamente en CLIPS pero la regla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2559
22 Capiacutetulo 3 CLIPS
1 (defrule platcar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Siacute lo haceEn el caso de que el valor del slot sea booleano se puede escribir la regla como
1 (defrule platpicant2 plat lt- (object (is-a Plat) (Picant TRUE))3 =gt4 (print t (send plat get-nom) es picant crlf)
En el caso de que el slot sea a su vez una instancia se puede utilizar para obtener los valores de estainstancia en la condicion como se explica en la pregunta anterior
357 Tengo problemas con instancias obtenidas del slot de otra instancia en el patroacuten de unaregla
Este problema aparece cuando el patron de una regla instancia una variable a un nombre de instancia yesta no esta definida en el modulo de la regla por ejemplo si la regla siguiente pertenece a un modulo queno es el de la instancia
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4
=gt5 (print t preu (send v get-Preu) crlf)6 )
La regla se quejaraacute de que la instancia no existe al enviarle el send ya que solo se busca la instancia dentrodel moacutedulo de la regla y no en los importados Para arreglar esto se puede usar la funcioacuten (instance-address[ltMODULOgt|] ltINSTANCIAgt) que busca la direccion de la instancia en un modulo concreto o en todos losmoacutedulos que se importan () Deberiacuteamos entonces escribir la regla
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send (instance-address v) get-Preu) crlf)6 )
358 iquestCoacutemo realizar una buacutesqueda de instancias que cumplan unas restricciones
CLIPS nos ofrece varias funciones de buacutesqueda de instancias que cumplan unas determinadas restriccionesque a nosotros nos interese
La funcioacuten find-instance Esta funcioacuten devuelve la primera instancia que cumple todas las restric-ciones indicadas
La funcioacuten find-all-instances Esta funcioacuten devuelve todas las instancias que cumplen las restric-ciones indicadas
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2659
35 Las clasesinstancias 23
La sintaxis de ambas funciones es igual exceptuando el nombre de la funcioacuten(find-all-instances (clase_instancias) (restricciones))A continuacioacuten se muestran varios ejemplos
(bind rectangulos (find-all-instances ((inst Rectangulo)) (gtinstaltura 10))) Des-pueacutes de ejecutar esta funcioacuten en la variable rectangulos habraacute una lista con todas las instancias de la
clase Rectangulo cuya altura sea superior a 10(bind rectangulos (find-all-instances ((inst Rectangulo)) (and (gtinstaltura 10) (=instanchura 7)))) Este trozo de coacutedigo hace que en la variable rectangulos se guarde una listade las instancias de la clase Rectangulo que tienen una altura superior a 10 y una anchura igual a 7
Estas funciones que CLIPS nos ofrece tienen otra funcionalidad y es que podemos realizar buacutesquedas deconjuntos de instancias
(bind rectangulos (find-all-instances ((a Rectangulo) (b Rectangulo)) (= aalturabaltura))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas de instancias de laclase Rectangulo que tienen la misma altura
Por uacuteltimo es necesario comentar que se pueden realizar buacutesquedas de conjuntos de instancias que seande distintas clases
(bind figuras (find-all-instances ((rect Rectangulo) (circ Circulo)) (= rectalturacircradio))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas ltrectangulocirculogtque cumplan que la altura del rectaacutengulo sea igual al radio del ciacuterculo
Existen maacutes comandos para obtener instancias pero son menos utilizadas a nivel baacutesico como pueden serany-instancep do-for-instance do-for-all-instances y delayed-do-for-all-instances
359 iquestCoacutemo se interactuacutea con objetos
La interaccioacuten con objetos se efectuacutea mediante lo que se denomina mensaje
(defmessage-handlerltnombre-clasegtltnombre-mensajegt[lttipo-handlergt] [ltcomentariogt]ltparaacutemetrogt [ltparaacutemetro-comodiacutengt])ltaccioacutengt
)
Un gestor de mensajes consta de 7 partes
1 Nombre de clase a la que el gestor estaraacute asociado
2 Nombre del mensaje
3 Tipo de gestor (Nosotros habitualmente usaremos primary que viene por defecto)
4 Comentario (opcional)
5 Lista de paraacutemetros6 Paraacutemetro comodiacuten (para gestionar muacuteltiples paraacutemetros)
7 Secuencia de acciones o expresiones que seraacuten ejecutadas por el gestor
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2759
24 Capiacutetulo 3 CLIPS
Enfocado a la praacutectica de CLIPS la maacutes comuacuten es que queramos interactuar con objetos para
1 Imprimir los objetos Un ejemplo
1 (defmessage-handler avion imprimir-beneficio ()
2 Para implementar funciones calculadas asociadas al objeto Un ejemplo
1 (defmessage-handler avion calcular-beneficio ()2 ( selfplazas-ocupadas selfprecio-billete))3 )
Como se puede observar el paraacutemetro impliacutecito self contiene la instancia activa para este mensaje
3510 iquestComo se interactuacutea con las instancias de los objetos
Podremos interactuar entre las instancias de los objetos mediante la funcioacuten send
(send ltexpresioacuten-de-objetogtltnombre-de-mensajegtltexpresioacutengt)Donde se toman como argumentos el objeto destino del mensaje el mensaje mismo y otros paraacutemetros
que debieran ser pasados a los gestoresParticularmente en el aacutembito de la praacutectica usualmente necesitaremos utilizar el envioacute de mensajes de
tipo get put and delete Estos mensajes tiene la siguiente sintaxis
get-ltnombre-atributogt
put-ltnombre-atributogt
delete
Aquiacute tenemos un ejemplo de como utilizarlo recordando que ponemos entre corchetes la instancia la cualse enviacutea el mensaje
(defclass avion (is-a USER)(role concrete)(slot precio-billete (create-accessor read) (default 34))(slot plazas-ocupadas (create-accessor write) (default 0)))
Clase creada
gt(make-instance a of avion) Creacioacuten de una instancia de avion[a]
gt(send [a] get-precio-billete) Obtencioacuten de un slot34 Resultado obtenidogt(send [a] put-plazas-ocupadas 100) Modificacioacuten de un slotgt(send [a] delete) Eliminacioacuten de la instanciaTrue
3511 Uso de make-instance
Cuando queremos crear una instancia de una clase para ir rellenandola con los resultados o datos quevayamos obteniendo se haria lo siguiente
(bind variable_instancia (make-instance nombre_instancia of nombre_clase))
Una vez creada podemos jugar con dicha instancia en las diferentes reglas siempre que la llamemos enlos activadores
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2859
35 Las clasesinstancias 25
(defrule reglavar_instancia lt- (object (is-a nombre_clase))=gt
)
De esta manera dentro de la regla podemos hacer acciones con la instancia por ejemplo(send var_instancia put-articulo articulo_ejemplo)
3512 Como generar automaacuteticamente nombres de instancia
En ocasiones queremos crear instancias en reglas y queremos que su nombre sea distinto del de otrasque ya tenemos Para ello podemos utilizar las funciones gensym y gensym La primera genera un siacutembolodel estilo genN donde N es un nuacutemero La segunda hace lo mismo pero aseguraacutendose de que ese siacutembolono exista ya Se puede reiniciar el contador que usan estas dos funciones con el operador (setgen ltnumgt)donde ltnumgt es el nuacutemero por el que queremos que empiecen ahora los siacutembolos
Para usar esto para generar el nombre de una instancia podemos hacer
(make-instance (gensym) of ltclasegt)
Cada vez que se ejecute se generaraacute un nombre de instancia nuevoSi creamos instancias de diferentes clases y queremos que las instancias tengan nombres que podamos
identificar podemos concatenar siacutembolos a los siacutembolos generados por gensym por ejemplo
(make-instance (sym-cat pepe- (gensym)) of ltclasegt)
generaraacute una instancia con el nombre pepe-genN
3513 Com fer un getset drsquoun slot drsquouna classe
Per consultar el valor drsquoun slot drsquouna classe ho podem fer enviant-li un missatge de la seguumlent manera
(send ltVARIABLEgt get-ltNOM_ATRIBUTgt)
Per exemple si tenim una instagravencia de la classe Plat ( instancia ) i volem saber el valor del seu slotnom
(send instancia get-nom)
Per assignar un valor a un slot drsquouna drsquoinstagravencia hem drsquoenviar-li un missatge de la seguumlent manera
(send ltVARIABLEgt put-ltNOM_ATRIBUTgt ltVALORgt)On ltVALORgt pot ser un valor o un megravetode que retorni un valor
(send instancia put-nom nom)
3514 iquestCoacutemo acceder a una instancia cuyo nombre conocemos
Si conocemos el nombre de una instancia y necesitamos acceder a ella es decir necesitamos enviarle alguacutenmensaje mediante la funcioacuten send podemos hacerlo directamente escribiendo en lugar de la variable quealmacena la instancia el nombre de la instancia entre corchetes [ ] A continuacioacuten se muestra un ejemplo
(bind altura_rect1 (send [rect1] get-altura))
En este caso se guardaraacute en la variable altura_rect1 el valor de la altura de la instancia que tiene comonombre rect1
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2959
26 Capiacutetulo 3 CLIPS
3515 Obtenir el nom drsquouna classe
Si tenim una instagravencia drsquouna classe i volem saber el nom de la classe (uacutetil si tenim una bona taxonomiade classes) ho podem fer amb el megravetode (class ltINSTANCIAgt)
Si per exemple imaginem que tenim la classe Actor la qual teacute com subclasses la classe APrincipalASecundari i ACameo Imaginem que estem tractant amb instancies drsquoactors i volem saber si la instanciaque estem tractant es de la classe APrincipal
Ho hauriacuteem de fer de la seguumlent manera
(eq (class instancia) APrincipal)
Fixem-nos que APrincipal eacutes un siacutembol no un String (un truco eacutes fixar-se en que no teacute cometes) Si vol-gueacutessim comparar-ho amb un String (per exemple un String introduiumlt per lrsquousuari) ho podriacuteem transformara un String amb el megravetode str-cat
(eq (str-cat (class instancia)) Principal)
3516 Como convierto un INSTANCE-ADRESS en un INSTANCE-NAME
En alguacuten momento nos podemos encontrar con la situacioacuten de que disponemos de un puntero a unainstancia y necesitamos su nombre o lo contrario En ambos casos podemos usar la funcioacuten instance-nameSu funcionamiento es bidireccional podemos introducirle un instance-name y nos devolveraacute un instance-adress y viceversa
1 (defrule imprimir-nombre2 estlt-(object (is-a Estudiante) (edad 25))3 =gt4 (printout t (instance-name est) crlf)5
)
3517 Com iterar a traveacutes drsquoun multi-slot
El seguumlent tambeacute eacutes vagravelid com exemple de com iterar a traveacutes drsquouna llistaImaginem que tenim una instagravencia de la classe Plat a la varible (plat) la qual teacute un multi-slot drsquoinstagravencies
de la classe Ingredient Imaginem que volem imprimir per pantalla el nom drsquoaquests ingredients (slot nomde la classe Ingredient) Necessitarem iterar sobre la llista drsquoingredients
1 (bind i 1)2 (while (lt= i (length$ (send plat get-ingredients)))3 do4 (bind ingredient (nth$ i (send plat get-ingredients)))5 (printout t (send ingredient get-nom) crlf)6 (bind i (+ i 1))7 )
El megravetode (nth$ ltINDEXgtltLLISTAgt) et retorna lrsquoelement situat a INDEX de LLISTAEl megravetode (length$ ltLLISTAgt) retorna el nuacutemero drsquoelements de LLISTA
3518 Coacutemo modificarinsertarborrar valores en un multislot
Los valores de un multislot se pueden cambiar usando la funcioacuten slot-replace$ La sintaxis es la siguiente
(slot-replace$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt ltvalorgt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3059
35 Las clasesinstancias 27
Donde ltiniciogt y ltfingt son el rango de posiciones del multislot que se quiere modificar y ltvalorgtson los valores que queremos reemplazar Obviamente deberaacute haber tantos valores como posiciones hayamosindicado en el rango
Para insertar nuevos valores podemos usar la funcioacuten slot-insert$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltposgt ltvalorgt)
El valor se inserta delante de la posicioacuten indicada si la posicioacuten es mayor que la longitud del multislot secolocaraacute al final
Para borrar elementos de un multislot podemos usar la funcioacuten slot-delete$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt)
Se borraraacuten los elementos que estaacuten en el rango indicado
3519 Coacutemo recorrer un atributo multievaluado
Supongamos que la variable respuesta tiene una lista de instancias
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 aquiacute hacemos lo que queramos4 )5 )
Loop-for-count funciona como un for primero la variable que haraacute de contador luego el valor de origeny luego el valor final Para controlar el final usamos la funcioacuten que he explicado antes i tomaraacute valoresdesde 1 hasta n asiacute que usando la funcioacuten nth$ obtendremos cada uno de los elementos La variable auxiraacute teniendo cada uno de los valores
3520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz)
Es igual que antes pero con dos bucles
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 (bind aux2 (send aux get-slot_que_queremos))4 (loop-for-count (j 1 (length$ aux2)) do5 (bind aux_final (nth$ j aux2))6 aquiacute ya podemos trabajar con el elemento en concreto7 )8 )
Supongamos que respuesta tiene una lista de instancias con el primer bucle haremos lo mismo que antes ir
iterando por esas instancias Una vez que tenemos cada instancia con aux2 con el segundo bucle iteraremosdentro de sus instancias interiores
Por ejemplo si tenemos varios equipos de fuacutetbol y cada equipo tiene varios jugadores en el primer bucleestamos iterando entre los equipos y en el segundo entre los jugadores de cada equipo en particular
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3159
28 Capiacutetulo 3 CLIPS
3521 Com puc esborrar una instagravencia
Per esborrar una instagravencia (per exemple segons la informacioacute que proporcioni lrsquousuari podem deduir queuna segraverie drsquoinstagravencies eacutes impossible que es facin servir per a la solucioacute) ho podem fer enviant un missatgedelete a la instagravencia eacutes a dir (send ltINSTANCIAgtdelete)
(send inst delete)
Un megravetode que podria ser uacutetil de la cara a la pragravectica podria ser el seguumlent
1 (defrule elimina-instancia2 (declare (salience 10))3 elimina-fact lt- (elimina-inst inst)4 =gt5 (send inst delete)6 (retract elimina-fact)
Imaginem que per exemple que volem eliminar una llista drsquoinstagravencies Per eliminar-les podriacuteem recoacuterrerel llistat marcant les instagravencies que volem esborrar afegint el seguumlent fet
(assert (elimina-instancia inst))
Aixiacute com que elimina-instancia teacute un salience alt esborraria les instagravencies marcades quan tingueacutes ocasioacuteDrsquoaquesta manera ens estalviem el problema de recoacuterrer un llistat drsquoinstagravencies amb un iterador mentre
anem eliminant els elements de la llista cosa que pot donar problemes amb lrsquoiterador
3522 Com imprimir una instagravencia
Per imprimir una classe (uacutetil per exemple per mostrar el resultat final) el millor eacutes definir message-handlersPer exemple imaginem que tenim una classe Plat la qual teacute un slot nom de tipus String Si volgueacutessimimprimir per pantalla un missatge que digueacutes
El nom del plat eacutes ndashltnom del platgtndash
Hauriacuteem de definir un message-handler que simplement imprimiacutes per pantalla el valor de lrsquoslot de laforma
(defmesssage-handler ltCLASSNAMEgt ltMESSAGENAMEgt primary ()ltCODIgt
)
Per el cas de lrsquoexemple
1 (defmessage-handler Plat print primary ()2 (printout t -- selfnom --) )3 )
Per cridar-ho nomeacutes caldragrave enviar-li un missatge a la instagravencia amb el nom del message-handler (enaquest cas print)
(send instancia print)
Un message-handler pot cridar a altres message-handlers amb el que es poden encadenar diverses instagraven-cies Per exemple imaginem que tenim la classe Menuacute la qual teacute un atribut plats que eacutes un llista drsquoinstagravenciesde la classe Plat Dintre del message-handler menuacute podriacuteem iterar a traveacutes de la llista de plats enviant elmissatge print que hem definit anteriorment
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3259
36 Programacioacuten 29
3523 Com es navega entre instagravencies relacionades
Per exemple tinc una instagravencia iA que teacute un slot anomenat slotB que eacutes una instagravencia drsquoun frame B Vullsaber el nom de la instagravencia associada al slotB de iA Ho pots fer aixiacute
(bind B (send iA get-slotB))(bind res (send B get-nom))
Si estagraves dins drsquouna condicioacute ho pots simplificar de la forma seguumlent
(bind res (send iAslotB get-nom)
Els dos punts soacuten equivalents al punt de Java
36 Programacioacuten
361 Com introduir un comentari
Els comentaris a CLIPS va darrere de un com per exemple
Comentari
Tambeacute podem afegir comentaris a les nostres regles deffacts deftemplates etc Generalment van darrereel nom de la estructura per exemple
1 (defrule neteja regla per la qual si la cuina estagrave bruta srsquoafegiragrave una tasca de2 neteja
3 (estat-cuina bruta)4 =gt5 (assert (tasca netejar))6 )
362 Referenciar el valor null a CLIPS
Per referenciar el valor null a clips es fa amb el simbol nil Per exemple si volem saber si una instagravenciainst es null ho podriacuteem fer de la seguumlent manera
(eq inst nil)
363 Formas de recorrer una lista
Para recorrer una lista disponemos de diferentes opciones en este FAQ explicaremos como crear unaestructura tipo ldquoWHILErdquo y tipo ldquoFORrdquo
1 While Esta regla se ejecuta hasta que la expresioacuten a evaluar sea falsa Este tipo de estructura se rigepor seguir la sintaxis while - do y se construiriacutea de la siguiente forma
(while ltexpresioacutengt[do] ltaccioacutengt)
Doacutende dependiendo del valor de ltexpresioacutengt
Valor TRUE Se realizaraacute la accioacuten ltaccioacutengt i se volveraacute a evaluar ltexpresioacutengt
Valor FALSE No se ejecutaraacute la accioacuten ltaccioacutengt
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3359
30 Capiacutetulo 3 CLIPS
2 For Esta regla sirve para ejecutar un bucle N (final - inicio) veces Este tipo de estructura se rige porseguir la sintaxis loop-for-count y se construiriacutea de la siguiente forma
(loop-for-count (ltvargtltiniciogtltfinalgt) [do] ltaccioacutengt)
Doacutende
ltvargt Variable que se usara como iacutendice
ltiniciogt Valor inicial que tendraacute ltvargt
ltfinalgt Ultimo valor que tendraacute la variable ltvargt
ltaccioacutengt Accioacuten que es realizaraacute hasta que ltvargt tenga el valor de ltfingt
364 Formas de elegir una opcioacuten
En este apartado explicaremos como crear una estructura if y una estructura switch
If Este tipo de estructura se rige por seguir la sintaxis if - then - else y se construiriacutea de lasiguiente forma
(if ltexpresioacutengtthen ltaccioacutengt[else ltaccioacuten2gt])
Doacutende dependiendo del valor de ltexpresioacutengt
bull Valor TRUE Se realizaraacute la accioacuten ltaccioacutengtbull Valor FALSE Se realizaraacute la accioacuten ltaccioacuten2gt (en caso de haber)
Switch Este tipo de estructura se rige por seguir la sintaxis switch - opciones y se construiriacutea dela siguiente forma
(switch ltexpresioacuten-testgt(case OPCION1 then ACCION1)(case OPCION2 then ACCION2)
([default] ACCION-DEFAULT)
)
Doacutende dependiendo del valor de ltexpresioacuten-casegt se ejecutaraacute una ltaccioacutengt en particular Si nin-guna ltopcioacutengt es correcta se ejecutara la ltaccioacuten-defaultgt
365 Funciones con la clase String
Habitualmente trabajaremos con Strings o cadena de Strings CLIPS proporciona una serie de herramien-tas para trabajar con esta clase
1 Convertir string a MAYUacuteSCULAS A veces es conveniente tener todos los caracteres en mayuacutesculaspara no tener problemas de comparaciones o simplemente por convenio Para ello CLIPS dispone dela funcioacuten upcase la cual convierte a mayuacutesculas un siacutembolo o string
(upcase ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplos
(upcase Ccedillips es divertido) rarr CcedilLIPS ES DIVERTIDO
(upcase Clips_es_divertido) rarr CLIPS_ES_DIVERTIDO
2 Convertir string a MINUacuteSCULAS la funcioacuten es downcase
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3459
36 Programacioacuten 31
3 Concatenacioacuten de strings Tambieacuten es de gran utilidad poder juntar dos o maacutes paraacutemetros en un solostring Todo paraacutemetro a juntar deben ser de uno de los siguientes tipos symbol String integer floato instance-name
(str-cat parametro1 parametro2 parametroN )
Ejemplo
(str-cat IA nota 10) rarr IAnota10
4 Comparacioacuten de strings Funcioacuten que nos indica si dos strings son iguales
(str-compareltexpresioacuten-simboacutelica-o-de-cadenagtltexpresioacuten-simboacutelica-o-de-cadenagt
)
Esta funcioacuten devuelve
0 Si ambos strings son iguales1 Si el primer string es mayor que el segundo string-1 Si el primer string es menor que el segundo string
5 Longitud de un string Muchas veces es de gran utilidad saber que tamantildeo tiene un string
(str-length ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplo
(str-length Inteligencia Artificial) rarr 23
366 iquestCoacutemo obtener el contenido de una variable en un string
Para conseguir un string a partir de un integer float symbol instance-name debes utilizar el comandostr-cat Si a la funcioacuten le pasamos como paraacutemetros varios elementos los transformaraacute a string y losconcatenaraacute La sintaxis de esta funcioacuten es la siguiente (str-cat elementos) Esta funcioacuten la usaremossobre todo cuando queramos realizar comparaciones entre el contenido de una variable y un string ya quepreviamente necesitaremos usar la funcioacuten str-cat para pasar el contenido de la variable a string y realizarde este modo la comparacioacuten de forma correcta
367 iquestComo se crea una lista
Con create$ Todos los operadores sobre listas llevan el siacutembolo $ al final Igual que con las variables sedebe usar bind siempre que se desee modificar una lista
(bind lista (create$ a b c))
368 iquestComo borro un elemento de una lista
Con delete$Usa la siguiente sintaxis(delete$ ltlistagt ltindice-iniciogt ltindice-finalgt)Se borraraacuten todos los elementos del rango entre las posiciones inicio y final ambas incluidas Tambieacuten exis-
tedelete-member$ (delete-member$ ltlistagt ltelementogt) Borraraacute todas las apariciones del elemento enla lista
(delete$ (create$ a b c d e f) 3 5) minusrarr (a b f)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2259
35 Las clasesinstancias 19
3 Assignar-li valors
(bind segons_plats (find-all-instances ((plat Plat)) TRUE)(modify llista (segons segons_plats))
4 Recuperar els valors
(defrule[condicions vagraveries]llista lt- (llista-plats (segons $segons_plats))
=gt
Ara la variable $segons_plats conteacute tots els elements de segons
35 Las clasesinstancias
351 Tengo que representar la jerarquiacutea de un frame iquestEs preferible antildeadir las subclases a laontologiacutea o bien diferenciarlas mediante un slot en la superclase
Las dos formas son vaacutelidas pero es recomendable representarlas en clases separadas cuando se vayan abuscar instancias de ese tipo ya que asiacute no tendremos que hacer un recorrido por todas las de la superclaseNo obstante si soacutelo se trata de una caracteriacutestica puntual del frame y no vamos a hacer buacutesquedas de unaexclusiva subclase entonces seraacute maacutes eficiente antildeadir un slot debido a su mejor accesibilidad
352 iquestQueacute es un objeto
Podriacuteamos decir que un objeto es un hecho no ordenado con herencia
353 iquestPorqueacute usar objetos en contexto de la praacutectica de CLIPS de IA
Como bien sabemos una parte de la praacutectica de SBCrsquos consisten en crear la ontologiacutea Esta ontologiacutease exporta para poder interactuar con CLIPS en formato pins y pont El archivo pont contendraacute ladeclaracioacuten de todas las clases creadas previamente por Protege (defclass ) El archivo pins contendraacute
todas las instancias de las clases declaradas en el archivo pont Como puede intuir el lector se necesitaraacuteinteractuar con los objetos previamente creados por Protegravegegrave
354 Como se definen las clases
Para definir las clases usaremos el constructor defclass
(defclass ltnombregt [ltcomentariogt](is-a ltnombre-de-superclasegt)[(role concrete | abstract)]
[(pattern-match reactive | non-reactive)]ltslotgt definicioacuten de los atributos de la clase
ltdocumentacioacuten-handlergt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2359
20 Capiacutetulo 3 CLIPS
En caso de desear que la nueva clase herede las propiedades de otra ya existente el nombre de esta deberaacuteespecificarse despues de is-a El rol determinaraacute si la clase es concreta (se puede instanciar) o abstracta(destinada a ser superclase) El pattern-match debe declararse como reactivo si se desea que las instanciasde la clase puedan unificar con los elementos objeto de las reglas (siacutembolo lt-) Los slots correspondena los atributos de la clase y los handlers a las funciones de eacutesta Los handlers se pueden declarar en ladeclaracioacuten de la propia clase pero se deben definir externamente Dado que no aporta ninguna ventaja
declararlos es recomendable definirlos directamente Noacutetese que todo aquello que estaacute entre corchetes ([])constituye informacioacuten adicional que no es obligatorio especificar
1 (defclass Persona2 (is-a Ser_Vivo)3 (role concrete)4 (single-slot edad5 (type INTEGER)6 (range 1 99)7 (cardinality 0 1)8 (create-accessor read-write)9 )
10 (multislot amigos11 (type INSTANCE)12 (allowed-classes Persona)13 )14 )
El comportamiento y declaracioacuten de los slots es ideacutentico al de los slots de los hechos ordenados Losatributos de tipo INSTANCE (referencian otras instancias) estan en formato INSTANCE-NAME
355 Com consulto una instagravencia a partir drsquouna regla
Podem fer servir la part esquerre drsquouna regla per trobar instagravencies Lrsquouacutes eacutes molt semblant a trobar elpunter a un fet fent servir
(object [(is-a ltNOM_CLASSEgt)|(name ltNOM_INSTANCIA)|(ltNOM-SLOTgt ltVALORVARIABLE))])
Per exemple si volem que una regla srsquoinstanciiuml si tenim instanciat un plat de la classe Plat podriem ferservir
1 (defrule tenimplat2 plat lt- (object (is-a Plat))3 =gt4 (print t (send plat get-nom) crlf)
La regla imprimiragrave el nom del plat que trobi Eacutes important notar que srsquoactivaragrave per cada instagravencia de platque tinguem a la base de coneixement
Podem consultar els valors de la instancia fent servir condicions a la part esquerre de la regla Per exemplesi nomeacutes volgueacutessim els plats amb un preu meacutes gran que 30
1 (defrule platCar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Srsquoactivaragrave per tots els plats amb un preu major a 30
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2459
35 Las clasesinstancias 21
Srsquoha drsquoanar amb cura per aquest tipus de regla ja que si la base de coneixement eacutes molt amplia pot acabarderivant amb problemes de memograveria
Per exemple si en comptes de preguntar per una instagravencia de Plat pregunteacutessim per dues instancies dePlat
1 (defrule platsCars2 plat1 lt- (object (is-a Plat) (Preu p1))3 plat2 lt- (object (is-a Plat) (Preu p2))4 (test (gt p1 30))5 (test (gt p2 30))6 =gt7 (print t (send plat1 get-nom) i (send plat1 get-nom) soacuten cars8 crlf)9 )
Faria unificacioacute amb totes les combinacions possibles (amb repeticions) de dos plats de tota la base deconeixement Aixograve es podria anar ampliant fins fer-se intractable
Si tenim drsquoalguna manera el nom de la instancia podem fer
1 (defrule platPicant2 (cuina (plat p))3 (object (name p) (picant pi))4 =gt5 (print t picant pi crlf)6 )
Aixoacute es pot servir per crear condicions que facin servir noms drsquoinstancies que tenim almacenats a slotsdrsquoaltres instancies per exemple
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send v get-Preu) crlf)6 )
Aquesta regla imprimiria el preu del vi asociat al plat si es negre
356 Tengo problemas en condiciones de reglas con slots de instancias obtenidos con send
A veces dan problemas las reglas en las que las condiciones sobre los valores de los slots de una instanciase escriben usando mensajes get sobre los atributos de una instancia en lugar de utilizar patrones paraobtenerlos por ejemplo la regla
1 (defrule platcar2 plat lt- (object (is-a Plat) )3 (test (gt (send plat get-Preu) 30))4 =gt5 (print t (send plat get-nom) es car6 crlf)7 )
No funciona correctamente en CLIPS pero la regla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2559
22 Capiacutetulo 3 CLIPS
1 (defrule platcar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Siacute lo haceEn el caso de que el valor del slot sea booleano se puede escribir la regla como
1 (defrule platpicant2 plat lt- (object (is-a Plat) (Picant TRUE))3 =gt4 (print t (send plat get-nom) es picant crlf)
En el caso de que el slot sea a su vez una instancia se puede utilizar para obtener los valores de estainstancia en la condicion como se explica en la pregunta anterior
357 Tengo problemas con instancias obtenidas del slot de otra instancia en el patroacuten de unaregla
Este problema aparece cuando el patron de una regla instancia una variable a un nombre de instancia yesta no esta definida en el modulo de la regla por ejemplo si la regla siguiente pertenece a un modulo queno es el de la instancia
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4
=gt5 (print t preu (send v get-Preu) crlf)6 )
La regla se quejaraacute de que la instancia no existe al enviarle el send ya que solo se busca la instancia dentrodel moacutedulo de la regla y no en los importados Para arreglar esto se puede usar la funcioacuten (instance-address[ltMODULOgt|] ltINSTANCIAgt) que busca la direccion de la instancia en un modulo concreto o en todos losmoacutedulos que se importan () Deberiacuteamos entonces escribir la regla
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send (instance-address v) get-Preu) crlf)6 )
358 iquestCoacutemo realizar una buacutesqueda de instancias que cumplan unas restricciones
CLIPS nos ofrece varias funciones de buacutesqueda de instancias que cumplan unas determinadas restriccionesque a nosotros nos interese
La funcioacuten find-instance Esta funcioacuten devuelve la primera instancia que cumple todas las restric-ciones indicadas
La funcioacuten find-all-instances Esta funcioacuten devuelve todas las instancias que cumplen las restric-ciones indicadas
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2659
35 Las clasesinstancias 23
La sintaxis de ambas funciones es igual exceptuando el nombre de la funcioacuten(find-all-instances (clase_instancias) (restricciones))A continuacioacuten se muestran varios ejemplos
(bind rectangulos (find-all-instances ((inst Rectangulo)) (gtinstaltura 10))) Des-pueacutes de ejecutar esta funcioacuten en la variable rectangulos habraacute una lista con todas las instancias de la
clase Rectangulo cuya altura sea superior a 10(bind rectangulos (find-all-instances ((inst Rectangulo)) (and (gtinstaltura 10) (=instanchura 7)))) Este trozo de coacutedigo hace que en la variable rectangulos se guarde una listade las instancias de la clase Rectangulo que tienen una altura superior a 10 y una anchura igual a 7
Estas funciones que CLIPS nos ofrece tienen otra funcionalidad y es que podemos realizar buacutesquedas deconjuntos de instancias
(bind rectangulos (find-all-instances ((a Rectangulo) (b Rectangulo)) (= aalturabaltura))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas de instancias de laclase Rectangulo que tienen la misma altura
Por uacuteltimo es necesario comentar que se pueden realizar buacutesquedas de conjuntos de instancias que seande distintas clases
(bind figuras (find-all-instances ((rect Rectangulo) (circ Circulo)) (= rectalturacircradio))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas ltrectangulocirculogtque cumplan que la altura del rectaacutengulo sea igual al radio del ciacuterculo
Existen maacutes comandos para obtener instancias pero son menos utilizadas a nivel baacutesico como pueden serany-instancep do-for-instance do-for-all-instances y delayed-do-for-all-instances
359 iquestCoacutemo se interactuacutea con objetos
La interaccioacuten con objetos se efectuacutea mediante lo que se denomina mensaje
(defmessage-handlerltnombre-clasegtltnombre-mensajegt[lttipo-handlergt] [ltcomentariogt]ltparaacutemetrogt [ltparaacutemetro-comodiacutengt])ltaccioacutengt
)
Un gestor de mensajes consta de 7 partes
1 Nombre de clase a la que el gestor estaraacute asociado
2 Nombre del mensaje
3 Tipo de gestor (Nosotros habitualmente usaremos primary que viene por defecto)
4 Comentario (opcional)
5 Lista de paraacutemetros6 Paraacutemetro comodiacuten (para gestionar muacuteltiples paraacutemetros)
7 Secuencia de acciones o expresiones que seraacuten ejecutadas por el gestor
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2759
24 Capiacutetulo 3 CLIPS
Enfocado a la praacutectica de CLIPS la maacutes comuacuten es que queramos interactuar con objetos para
1 Imprimir los objetos Un ejemplo
1 (defmessage-handler avion imprimir-beneficio ()
2 Para implementar funciones calculadas asociadas al objeto Un ejemplo
1 (defmessage-handler avion calcular-beneficio ()2 ( selfplazas-ocupadas selfprecio-billete))3 )
Como se puede observar el paraacutemetro impliacutecito self contiene la instancia activa para este mensaje
3510 iquestComo se interactuacutea con las instancias de los objetos
Podremos interactuar entre las instancias de los objetos mediante la funcioacuten send
(send ltexpresioacuten-de-objetogtltnombre-de-mensajegtltexpresioacutengt)Donde se toman como argumentos el objeto destino del mensaje el mensaje mismo y otros paraacutemetros
que debieran ser pasados a los gestoresParticularmente en el aacutembito de la praacutectica usualmente necesitaremos utilizar el envioacute de mensajes de
tipo get put and delete Estos mensajes tiene la siguiente sintaxis
get-ltnombre-atributogt
put-ltnombre-atributogt
delete
Aquiacute tenemos un ejemplo de como utilizarlo recordando que ponemos entre corchetes la instancia la cualse enviacutea el mensaje
(defclass avion (is-a USER)(role concrete)(slot precio-billete (create-accessor read) (default 34))(slot plazas-ocupadas (create-accessor write) (default 0)))
Clase creada
gt(make-instance a of avion) Creacioacuten de una instancia de avion[a]
gt(send [a] get-precio-billete) Obtencioacuten de un slot34 Resultado obtenidogt(send [a] put-plazas-ocupadas 100) Modificacioacuten de un slotgt(send [a] delete) Eliminacioacuten de la instanciaTrue
3511 Uso de make-instance
Cuando queremos crear una instancia de una clase para ir rellenandola con los resultados o datos quevayamos obteniendo se haria lo siguiente
(bind variable_instancia (make-instance nombre_instancia of nombre_clase))
Una vez creada podemos jugar con dicha instancia en las diferentes reglas siempre que la llamemos enlos activadores
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2859
35 Las clasesinstancias 25
(defrule reglavar_instancia lt- (object (is-a nombre_clase))=gt
)
De esta manera dentro de la regla podemos hacer acciones con la instancia por ejemplo(send var_instancia put-articulo articulo_ejemplo)
3512 Como generar automaacuteticamente nombres de instancia
En ocasiones queremos crear instancias en reglas y queremos que su nombre sea distinto del de otrasque ya tenemos Para ello podemos utilizar las funciones gensym y gensym La primera genera un siacutembolodel estilo genN donde N es un nuacutemero La segunda hace lo mismo pero aseguraacutendose de que ese siacutembolono exista ya Se puede reiniciar el contador que usan estas dos funciones con el operador (setgen ltnumgt)donde ltnumgt es el nuacutemero por el que queremos que empiecen ahora los siacutembolos
Para usar esto para generar el nombre de una instancia podemos hacer
(make-instance (gensym) of ltclasegt)
Cada vez que se ejecute se generaraacute un nombre de instancia nuevoSi creamos instancias de diferentes clases y queremos que las instancias tengan nombres que podamos
identificar podemos concatenar siacutembolos a los siacutembolos generados por gensym por ejemplo
(make-instance (sym-cat pepe- (gensym)) of ltclasegt)
generaraacute una instancia con el nombre pepe-genN
3513 Com fer un getset drsquoun slot drsquouna classe
Per consultar el valor drsquoun slot drsquouna classe ho podem fer enviant-li un missatge de la seguumlent manera
(send ltVARIABLEgt get-ltNOM_ATRIBUTgt)
Per exemple si tenim una instagravencia de la classe Plat ( instancia ) i volem saber el valor del seu slotnom
(send instancia get-nom)
Per assignar un valor a un slot drsquouna drsquoinstagravencia hem drsquoenviar-li un missatge de la seguumlent manera
(send ltVARIABLEgt put-ltNOM_ATRIBUTgt ltVALORgt)On ltVALORgt pot ser un valor o un megravetode que retorni un valor
(send instancia put-nom nom)
3514 iquestCoacutemo acceder a una instancia cuyo nombre conocemos
Si conocemos el nombre de una instancia y necesitamos acceder a ella es decir necesitamos enviarle alguacutenmensaje mediante la funcioacuten send podemos hacerlo directamente escribiendo en lugar de la variable quealmacena la instancia el nombre de la instancia entre corchetes [ ] A continuacioacuten se muestra un ejemplo
(bind altura_rect1 (send [rect1] get-altura))
En este caso se guardaraacute en la variable altura_rect1 el valor de la altura de la instancia que tiene comonombre rect1
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2959
26 Capiacutetulo 3 CLIPS
3515 Obtenir el nom drsquouna classe
Si tenim una instagravencia drsquouna classe i volem saber el nom de la classe (uacutetil si tenim una bona taxonomiade classes) ho podem fer amb el megravetode (class ltINSTANCIAgt)
Si per exemple imaginem que tenim la classe Actor la qual teacute com subclasses la classe APrincipalASecundari i ACameo Imaginem que estem tractant amb instancies drsquoactors i volem saber si la instanciaque estem tractant es de la classe APrincipal
Ho hauriacuteem de fer de la seguumlent manera
(eq (class instancia) APrincipal)
Fixem-nos que APrincipal eacutes un siacutembol no un String (un truco eacutes fixar-se en que no teacute cometes) Si vol-gueacutessim comparar-ho amb un String (per exemple un String introduiumlt per lrsquousuari) ho podriacuteem transformara un String amb el megravetode str-cat
(eq (str-cat (class instancia)) Principal)
3516 Como convierto un INSTANCE-ADRESS en un INSTANCE-NAME
En alguacuten momento nos podemos encontrar con la situacioacuten de que disponemos de un puntero a unainstancia y necesitamos su nombre o lo contrario En ambos casos podemos usar la funcioacuten instance-nameSu funcionamiento es bidireccional podemos introducirle un instance-name y nos devolveraacute un instance-adress y viceversa
1 (defrule imprimir-nombre2 estlt-(object (is-a Estudiante) (edad 25))3 =gt4 (printout t (instance-name est) crlf)5
)
3517 Com iterar a traveacutes drsquoun multi-slot
El seguumlent tambeacute eacutes vagravelid com exemple de com iterar a traveacutes drsquouna llistaImaginem que tenim una instagravencia de la classe Plat a la varible (plat) la qual teacute un multi-slot drsquoinstagravencies
de la classe Ingredient Imaginem que volem imprimir per pantalla el nom drsquoaquests ingredients (slot nomde la classe Ingredient) Necessitarem iterar sobre la llista drsquoingredients
1 (bind i 1)2 (while (lt= i (length$ (send plat get-ingredients)))3 do4 (bind ingredient (nth$ i (send plat get-ingredients)))5 (printout t (send ingredient get-nom) crlf)6 (bind i (+ i 1))7 )
El megravetode (nth$ ltINDEXgtltLLISTAgt) et retorna lrsquoelement situat a INDEX de LLISTAEl megravetode (length$ ltLLISTAgt) retorna el nuacutemero drsquoelements de LLISTA
3518 Coacutemo modificarinsertarborrar valores en un multislot
Los valores de un multislot se pueden cambiar usando la funcioacuten slot-replace$ La sintaxis es la siguiente
(slot-replace$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt ltvalorgt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3059
35 Las clasesinstancias 27
Donde ltiniciogt y ltfingt son el rango de posiciones del multislot que se quiere modificar y ltvalorgtson los valores que queremos reemplazar Obviamente deberaacute haber tantos valores como posiciones hayamosindicado en el rango
Para insertar nuevos valores podemos usar la funcioacuten slot-insert$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltposgt ltvalorgt)
El valor se inserta delante de la posicioacuten indicada si la posicioacuten es mayor que la longitud del multislot secolocaraacute al final
Para borrar elementos de un multislot podemos usar la funcioacuten slot-delete$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt)
Se borraraacuten los elementos que estaacuten en el rango indicado
3519 Coacutemo recorrer un atributo multievaluado
Supongamos que la variable respuesta tiene una lista de instancias
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 aquiacute hacemos lo que queramos4 )5 )
Loop-for-count funciona como un for primero la variable que haraacute de contador luego el valor de origeny luego el valor final Para controlar el final usamos la funcioacuten que he explicado antes i tomaraacute valoresdesde 1 hasta n asiacute que usando la funcioacuten nth$ obtendremos cada uno de los elementos La variable auxiraacute teniendo cada uno de los valores
3520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz)
Es igual que antes pero con dos bucles
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 (bind aux2 (send aux get-slot_que_queremos))4 (loop-for-count (j 1 (length$ aux2)) do5 (bind aux_final (nth$ j aux2))6 aquiacute ya podemos trabajar con el elemento en concreto7 )8 )
Supongamos que respuesta tiene una lista de instancias con el primer bucle haremos lo mismo que antes ir
iterando por esas instancias Una vez que tenemos cada instancia con aux2 con el segundo bucle iteraremosdentro de sus instancias interiores
Por ejemplo si tenemos varios equipos de fuacutetbol y cada equipo tiene varios jugadores en el primer bucleestamos iterando entre los equipos y en el segundo entre los jugadores de cada equipo en particular
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3159
28 Capiacutetulo 3 CLIPS
3521 Com puc esborrar una instagravencia
Per esborrar una instagravencia (per exemple segons la informacioacute que proporcioni lrsquousuari podem deduir queuna segraverie drsquoinstagravencies eacutes impossible que es facin servir per a la solucioacute) ho podem fer enviant un missatgedelete a la instagravencia eacutes a dir (send ltINSTANCIAgtdelete)
(send inst delete)
Un megravetode que podria ser uacutetil de la cara a la pragravectica podria ser el seguumlent
1 (defrule elimina-instancia2 (declare (salience 10))3 elimina-fact lt- (elimina-inst inst)4 =gt5 (send inst delete)6 (retract elimina-fact)
Imaginem que per exemple que volem eliminar una llista drsquoinstagravencies Per eliminar-les podriacuteem recoacuterrerel llistat marcant les instagravencies que volem esborrar afegint el seguumlent fet
(assert (elimina-instancia inst))
Aixiacute com que elimina-instancia teacute un salience alt esborraria les instagravencies marcades quan tingueacutes ocasioacuteDrsquoaquesta manera ens estalviem el problema de recoacuterrer un llistat drsquoinstagravencies amb un iterador mentre
anem eliminant els elements de la llista cosa que pot donar problemes amb lrsquoiterador
3522 Com imprimir una instagravencia
Per imprimir una classe (uacutetil per exemple per mostrar el resultat final) el millor eacutes definir message-handlersPer exemple imaginem que tenim una classe Plat la qual teacute un slot nom de tipus String Si volgueacutessimimprimir per pantalla un missatge que digueacutes
El nom del plat eacutes ndashltnom del platgtndash
Hauriacuteem de definir un message-handler que simplement imprimiacutes per pantalla el valor de lrsquoslot de laforma
(defmesssage-handler ltCLASSNAMEgt ltMESSAGENAMEgt primary ()ltCODIgt
)
Per el cas de lrsquoexemple
1 (defmessage-handler Plat print primary ()2 (printout t -- selfnom --) )3 )
Per cridar-ho nomeacutes caldragrave enviar-li un missatge a la instagravencia amb el nom del message-handler (enaquest cas print)
(send instancia print)
Un message-handler pot cridar a altres message-handlers amb el que es poden encadenar diverses instagraven-cies Per exemple imaginem que tenim la classe Menuacute la qual teacute un atribut plats que eacutes un llista drsquoinstagravenciesde la classe Plat Dintre del message-handler menuacute podriacuteem iterar a traveacutes de la llista de plats enviant elmissatge print que hem definit anteriorment
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3259
36 Programacioacuten 29
3523 Com es navega entre instagravencies relacionades
Per exemple tinc una instagravencia iA que teacute un slot anomenat slotB que eacutes una instagravencia drsquoun frame B Vullsaber el nom de la instagravencia associada al slotB de iA Ho pots fer aixiacute
(bind B (send iA get-slotB))(bind res (send B get-nom))
Si estagraves dins drsquouna condicioacute ho pots simplificar de la forma seguumlent
(bind res (send iAslotB get-nom)
Els dos punts soacuten equivalents al punt de Java
36 Programacioacuten
361 Com introduir un comentari
Els comentaris a CLIPS va darrere de un com per exemple
Comentari
Tambeacute podem afegir comentaris a les nostres regles deffacts deftemplates etc Generalment van darrereel nom de la estructura per exemple
1 (defrule neteja regla per la qual si la cuina estagrave bruta srsquoafegiragrave una tasca de2 neteja
3 (estat-cuina bruta)4 =gt5 (assert (tasca netejar))6 )
362 Referenciar el valor null a CLIPS
Per referenciar el valor null a clips es fa amb el simbol nil Per exemple si volem saber si una instagravenciainst es null ho podriacuteem fer de la seguumlent manera
(eq inst nil)
363 Formas de recorrer una lista
Para recorrer una lista disponemos de diferentes opciones en este FAQ explicaremos como crear unaestructura tipo ldquoWHILErdquo y tipo ldquoFORrdquo
1 While Esta regla se ejecuta hasta que la expresioacuten a evaluar sea falsa Este tipo de estructura se rigepor seguir la sintaxis while - do y se construiriacutea de la siguiente forma
(while ltexpresioacutengt[do] ltaccioacutengt)
Doacutende dependiendo del valor de ltexpresioacutengt
Valor TRUE Se realizaraacute la accioacuten ltaccioacutengt i se volveraacute a evaluar ltexpresioacutengt
Valor FALSE No se ejecutaraacute la accioacuten ltaccioacutengt
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3359
30 Capiacutetulo 3 CLIPS
2 For Esta regla sirve para ejecutar un bucle N (final - inicio) veces Este tipo de estructura se rige porseguir la sintaxis loop-for-count y se construiriacutea de la siguiente forma
(loop-for-count (ltvargtltiniciogtltfinalgt) [do] ltaccioacutengt)
Doacutende
ltvargt Variable que se usara como iacutendice
ltiniciogt Valor inicial que tendraacute ltvargt
ltfinalgt Ultimo valor que tendraacute la variable ltvargt
ltaccioacutengt Accioacuten que es realizaraacute hasta que ltvargt tenga el valor de ltfingt
364 Formas de elegir una opcioacuten
En este apartado explicaremos como crear una estructura if y una estructura switch
If Este tipo de estructura se rige por seguir la sintaxis if - then - else y se construiriacutea de lasiguiente forma
(if ltexpresioacutengtthen ltaccioacutengt[else ltaccioacuten2gt])
Doacutende dependiendo del valor de ltexpresioacutengt
bull Valor TRUE Se realizaraacute la accioacuten ltaccioacutengtbull Valor FALSE Se realizaraacute la accioacuten ltaccioacuten2gt (en caso de haber)
Switch Este tipo de estructura se rige por seguir la sintaxis switch - opciones y se construiriacutea dela siguiente forma
(switch ltexpresioacuten-testgt(case OPCION1 then ACCION1)(case OPCION2 then ACCION2)
([default] ACCION-DEFAULT)
)
Doacutende dependiendo del valor de ltexpresioacuten-casegt se ejecutaraacute una ltaccioacutengt en particular Si nin-guna ltopcioacutengt es correcta se ejecutara la ltaccioacuten-defaultgt
365 Funciones con la clase String
Habitualmente trabajaremos con Strings o cadena de Strings CLIPS proporciona una serie de herramien-tas para trabajar con esta clase
1 Convertir string a MAYUacuteSCULAS A veces es conveniente tener todos los caracteres en mayuacutesculaspara no tener problemas de comparaciones o simplemente por convenio Para ello CLIPS dispone dela funcioacuten upcase la cual convierte a mayuacutesculas un siacutembolo o string
(upcase ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplos
(upcase Ccedillips es divertido) rarr CcedilLIPS ES DIVERTIDO
(upcase Clips_es_divertido) rarr CLIPS_ES_DIVERTIDO
2 Convertir string a MINUacuteSCULAS la funcioacuten es downcase
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3459
36 Programacioacuten 31
3 Concatenacioacuten de strings Tambieacuten es de gran utilidad poder juntar dos o maacutes paraacutemetros en un solostring Todo paraacutemetro a juntar deben ser de uno de los siguientes tipos symbol String integer floato instance-name
(str-cat parametro1 parametro2 parametroN )
Ejemplo
(str-cat IA nota 10) rarr IAnota10
4 Comparacioacuten de strings Funcioacuten que nos indica si dos strings son iguales
(str-compareltexpresioacuten-simboacutelica-o-de-cadenagtltexpresioacuten-simboacutelica-o-de-cadenagt
)
Esta funcioacuten devuelve
0 Si ambos strings son iguales1 Si el primer string es mayor que el segundo string-1 Si el primer string es menor que el segundo string
5 Longitud de un string Muchas veces es de gran utilidad saber que tamantildeo tiene un string
(str-length ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplo
(str-length Inteligencia Artificial) rarr 23
366 iquestCoacutemo obtener el contenido de una variable en un string
Para conseguir un string a partir de un integer float symbol instance-name debes utilizar el comandostr-cat Si a la funcioacuten le pasamos como paraacutemetros varios elementos los transformaraacute a string y losconcatenaraacute La sintaxis de esta funcioacuten es la siguiente (str-cat elementos) Esta funcioacuten la usaremossobre todo cuando queramos realizar comparaciones entre el contenido de una variable y un string ya quepreviamente necesitaremos usar la funcioacuten str-cat para pasar el contenido de la variable a string y realizarde este modo la comparacioacuten de forma correcta
367 iquestComo se crea una lista
Con create$ Todos los operadores sobre listas llevan el siacutembolo $ al final Igual que con las variables sedebe usar bind siempre que se desee modificar una lista
(bind lista (create$ a b c))
368 iquestComo borro un elemento de una lista
Con delete$Usa la siguiente sintaxis(delete$ ltlistagt ltindice-iniciogt ltindice-finalgt)Se borraraacuten todos los elementos del rango entre las posiciones inicio y final ambas incluidas Tambieacuten exis-
tedelete-member$ (delete-member$ ltlistagt ltelementogt) Borraraacute todas las apariciones del elemento enla lista
(delete$ (create$ a b c d e f) 3 5) minusrarr (a b f)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2359
20 Capiacutetulo 3 CLIPS
En caso de desear que la nueva clase herede las propiedades de otra ya existente el nombre de esta deberaacuteespecificarse despues de is-a El rol determinaraacute si la clase es concreta (se puede instanciar) o abstracta(destinada a ser superclase) El pattern-match debe declararse como reactivo si se desea que las instanciasde la clase puedan unificar con los elementos objeto de las reglas (siacutembolo lt-) Los slots correspondena los atributos de la clase y los handlers a las funciones de eacutesta Los handlers se pueden declarar en ladeclaracioacuten de la propia clase pero se deben definir externamente Dado que no aporta ninguna ventaja
declararlos es recomendable definirlos directamente Noacutetese que todo aquello que estaacute entre corchetes ([])constituye informacioacuten adicional que no es obligatorio especificar
1 (defclass Persona2 (is-a Ser_Vivo)3 (role concrete)4 (single-slot edad5 (type INTEGER)6 (range 1 99)7 (cardinality 0 1)8 (create-accessor read-write)9 )
10 (multislot amigos11 (type INSTANCE)12 (allowed-classes Persona)13 )14 )
El comportamiento y declaracioacuten de los slots es ideacutentico al de los slots de los hechos ordenados Losatributos de tipo INSTANCE (referencian otras instancias) estan en formato INSTANCE-NAME
355 Com consulto una instagravencia a partir drsquouna regla
Podem fer servir la part esquerre drsquouna regla per trobar instagravencies Lrsquouacutes eacutes molt semblant a trobar elpunter a un fet fent servir
(object [(is-a ltNOM_CLASSEgt)|(name ltNOM_INSTANCIA)|(ltNOM-SLOTgt ltVALORVARIABLE))])
Per exemple si volem que una regla srsquoinstanciiuml si tenim instanciat un plat de la classe Plat podriem ferservir
1 (defrule tenimplat2 plat lt- (object (is-a Plat))3 =gt4 (print t (send plat get-nom) crlf)
La regla imprimiragrave el nom del plat que trobi Eacutes important notar que srsquoactivaragrave per cada instagravencia de platque tinguem a la base de coneixement
Podem consultar els valors de la instancia fent servir condicions a la part esquerre de la regla Per exemplesi nomeacutes volgueacutessim els plats amb un preu meacutes gran que 30
1 (defrule platCar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Srsquoactivaragrave per tots els plats amb un preu major a 30
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2459
35 Las clasesinstancias 21
Srsquoha drsquoanar amb cura per aquest tipus de regla ja que si la base de coneixement eacutes molt amplia pot acabarderivant amb problemes de memograveria
Per exemple si en comptes de preguntar per una instagravencia de Plat pregunteacutessim per dues instancies dePlat
1 (defrule platsCars2 plat1 lt- (object (is-a Plat) (Preu p1))3 plat2 lt- (object (is-a Plat) (Preu p2))4 (test (gt p1 30))5 (test (gt p2 30))6 =gt7 (print t (send plat1 get-nom) i (send plat1 get-nom) soacuten cars8 crlf)9 )
Faria unificacioacute amb totes les combinacions possibles (amb repeticions) de dos plats de tota la base deconeixement Aixograve es podria anar ampliant fins fer-se intractable
Si tenim drsquoalguna manera el nom de la instancia podem fer
1 (defrule platPicant2 (cuina (plat p))3 (object (name p) (picant pi))4 =gt5 (print t picant pi crlf)6 )
Aixoacute es pot servir per crear condicions que facin servir noms drsquoinstancies que tenim almacenats a slotsdrsquoaltres instancies per exemple
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send v get-Preu) crlf)6 )
Aquesta regla imprimiria el preu del vi asociat al plat si es negre
356 Tengo problemas en condiciones de reglas con slots de instancias obtenidos con send
A veces dan problemas las reglas en las que las condiciones sobre los valores de los slots de una instanciase escriben usando mensajes get sobre los atributos de una instancia en lugar de utilizar patrones paraobtenerlos por ejemplo la regla
1 (defrule platcar2 plat lt- (object (is-a Plat) )3 (test (gt (send plat get-Preu) 30))4 =gt5 (print t (send plat get-nom) es car6 crlf)7 )
No funciona correctamente en CLIPS pero la regla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2559
22 Capiacutetulo 3 CLIPS
1 (defrule platcar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Siacute lo haceEn el caso de que el valor del slot sea booleano se puede escribir la regla como
1 (defrule platpicant2 plat lt- (object (is-a Plat) (Picant TRUE))3 =gt4 (print t (send plat get-nom) es picant crlf)
En el caso de que el slot sea a su vez una instancia se puede utilizar para obtener los valores de estainstancia en la condicion como se explica en la pregunta anterior
357 Tengo problemas con instancias obtenidas del slot de otra instancia en el patroacuten de unaregla
Este problema aparece cuando el patron de una regla instancia una variable a un nombre de instancia yesta no esta definida en el modulo de la regla por ejemplo si la regla siguiente pertenece a un modulo queno es el de la instancia
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4
=gt5 (print t preu (send v get-Preu) crlf)6 )
La regla se quejaraacute de que la instancia no existe al enviarle el send ya que solo se busca la instancia dentrodel moacutedulo de la regla y no en los importados Para arreglar esto se puede usar la funcioacuten (instance-address[ltMODULOgt|] ltINSTANCIAgt) que busca la direccion de la instancia en un modulo concreto o en todos losmoacutedulos que se importan () Deberiacuteamos entonces escribir la regla
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send (instance-address v) get-Preu) crlf)6 )
358 iquestCoacutemo realizar una buacutesqueda de instancias que cumplan unas restricciones
CLIPS nos ofrece varias funciones de buacutesqueda de instancias que cumplan unas determinadas restriccionesque a nosotros nos interese
La funcioacuten find-instance Esta funcioacuten devuelve la primera instancia que cumple todas las restric-ciones indicadas
La funcioacuten find-all-instances Esta funcioacuten devuelve todas las instancias que cumplen las restric-ciones indicadas
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2659
35 Las clasesinstancias 23
La sintaxis de ambas funciones es igual exceptuando el nombre de la funcioacuten(find-all-instances (clase_instancias) (restricciones))A continuacioacuten se muestran varios ejemplos
(bind rectangulos (find-all-instances ((inst Rectangulo)) (gtinstaltura 10))) Des-pueacutes de ejecutar esta funcioacuten en la variable rectangulos habraacute una lista con todas las instancias de la
clase Rectangulo cuya altura sea superior a 10(bind rectangulos (find-all-instances ((inst Rectangulo)) (and (gtinstaltura 10) (=instanchura 7)))) Este trozo de coacutedigo hace que en la variable rectangulos se guarde una listade las instancias de la clase Rectangulo que tienen una altura superior a 10 y una anchura igual a 7
Estas funciones que CLIPS nos ofrece tienen otra funcionalidad y es que podemos realizar buacutesquedas deconjuntos de instancias
(bind rectangulos (find-all-instances ((a Rectangulo) (b Rectangulo)) (= aalturabaltura))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas de instancias de laclase Rectangulo que tienen la misma altura
Por uacuteltimo es necesario comentar que se pueden realizar buacutesquedas de conjuntos de instancias que seande distintas clases
(bind figuras (find-all-instances ((rect Rectangulo) (circ Circulo)) (= rectalturacircradio))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas ltrectangulocirculogtque cumplan que la altura del rectaacutengulo sea igual al radio del ciacuterculo
Existen maacutes comandos para obtener instancias pero son menos utilizadas a nivel baacutesico como pueden serany-instancep do-for-instance do-for-all-instances y delayed-do-for-all-instances
359 iquestCoacutemo se interactuacutea con objetos
La interaccioacuten con objetos se efectuacutea mediante lo que se denomina mensaje
(defmessage-handlerltnombre-clasegtltnombre-mensajegt[lttipo-handlergt] [ltcomentariogt]ltparaacutemetrogt [ltparaacutemetro-comodiacutengt])ltaccioacutengt
)
Un gestor de mensajes consta de 7 partes
1 Nombre de clase a la que el gestor estaraacute asociado
2 Nombre del mensaje
3 Tipo de gestor (Nosotros habitualmente usaremos primary que viene por defecto)
4 Comentario (opcional)
5 Lista de paraacutemetros6 Paraacutemetro comodiacuten (para gestionar muacuteltiples paraacutemetros)
7 Secuencia de acciones o expresiones que seraacuten ejecutadas por el gestor
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2759
24 Capiacutetulo 3 CLIPS
Enfocado a la praacutectica de CLIPS la maacutes comuacuten es que queramos interactuar con objetos para
1 Imprimir los objetos Un ejemplo
1 (defmessage-handler avion imprimir-beneficio ()
2 Para implementar funciones calculadas asociadas al objeto Un ejemplo
1 (defmessage-handler avion calcular-beneficio ()2 ( selfplazas-ocupadas selfprecio-billete))3 )
Como se puede observar el paraacutemetro impliacutecito self contiene la instancia activa para este mensaje
3510 iquestComo se interactuacutea con las instancias de los objetos
Podremos interactuar entre las instancias de los objetos mediante la funcioacuten send
(send ltexpresioacuten-de-objetogtltnombre-de-mensajegtltexpresioacutengt)Donde se toman como argumentos el objeto destino del mensaje el mensaje mismo y otros paraacutemetros
que debieran ser pasados a los gestoresParticularmente en el aacutembito de la praacutectica usualmente necesitaremos utilizar el envioacute de mensajes de
tipo get put and delete Estos mensajes tiene la siguiente sintaxis
get-ltnombre-atributogt
put-ltnombre-atributogt
delete
Aquiacute tenemos un ejemplo de como utilizarlo recordando que ponemos entre corchetes la instancia la cualse enviacutea el mensaje
(defclass avion (is-a USER)(role concrete)(slot precio-billete (create-accessor read) (default 34))(slot plazas-ocupadas (create-accessor write) (default 0)))
Clase creada
gt(make-instance a of avion) Creacioacuten de una instancia de avion[a]
gt(send [a] get-precio-billete) Obtencioacuten de un slot34 Resultado obtenidogt(send [a] put-plazas-ocupadas 100) Modificacioacuten de un slotgt(send [a] delete) Eliminacioacuten de la instanciaTrue
3511 Uso de make-instance
Cuando queremos crear una instancia de una clase para ir rellenandola con los resultados o datos quevayamos obteniendo se haria lo siguiente
(bind variable_instancia (make-instance nombre_instancia of nombre_clase))
Una vez creada podemos jugar con dicha instancia en las diferentes reglas siempre que la llamemos enlos activadores
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2859
35 Las clasesinstancias 25
(defrule reglavar_instancia lt- (object (is-a nombre_clase))=gt
)
De esta manera dentro de la regla podemos hacer acciones con la instancia por ejemplo(send var_instancia put-articulo articulo_ejemplo)
3512 Como generar automaacuteticamente nombres de instancia
En ocasiones queremos crear instancias en reglas y queremos que su nombre sea distinto del de otrasque ya tenemos Para ello podemos utilizar las funciones gensym y gensym La primera genera un siacutembolodel estilo genN donde N es un nuacutemero La segunda hace lo mismo pero aseguraacutendose de que ese siacutembolono exista ya Se puede reiniciar el contador que usan estas dos funciones con el operador (setgen ltnumgt)donde ltnumgt es el nuacutemero por el que queremos que empiecen ahora los siacutembolos
Para usar esto para generar el nombre de una instancia podemos hacer
(make-instance (gensym) of ltclasegt)
Cada vez que se ejecute se generaraacute un nombre de instancia nuevoSi creamos instancias de diferentes clases y queremos que las instancias tengan nombres que podamos
identificar podemos concatenar siacutembolos a los siacutembolos generados por gensym por ejemplo
(make-instance (sym-cat pepe- (gensym)) of ltclasegt)
generaraacute una instancia con el nombre pepe-genN
3513 Com fer un getset drsquoun slot drsquouna classe
Per consultar el valor drsquoun slot drsquouna classe ho podem fer enviant-li un missatge de la seguumlent manera
(send ltVARIABLEgt get-ltNOM_ATRIBUTgt)
Per exemple si tenim una instagravencia de la classe Plat ( instancia ) i volem saber el valor del seu slotnom
(send instancia get-nom)
Per assignar un valor a un slot drsquouna drsquoinstagravencia hem drsquoenviar-li un missatge de la seguumlent manera
(send ltVARIABLEgt put-ltNOM_ATRIBUTgt ltVALORgt)On ltVALORgt pot ser un valor o un megravetode que retorni un valor
(send instancia put-nom nom)
3514 iquestCoacutemo acceder a una instancia cuyo nombre conocemos
Si conocemos el nombre de una instancia y necesitamos acceder a ella es decir necesitamos enviarle alguacutenmensaje mediante la funcioacuten send podemos hacerlo directamente escribiendo en lugar de la variable quealmacena la instancia el nombre de la instancia entre corchetes [ ] A continuacioacuten se muestra un ejemplo
(bind altura_rect1 (send [rect1] get-altura))
En este caso se guardaraacute en la variable altura_rect1 el valor de la altura de la instancia que tiene comonombre rect1
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2959
26 Capiacutetulo 3 CLIPS
3515 Obtenir el nom drsquouna classe
Si tenim una instagravencia drsquouna classe i volem saber el nom de la classe (uacutetil si tenim una bona taxonomiade classes) ho podem fer amb el megravetode (class ltINSTANCIAgt)
Si per exemple imaginem que tenim la classe Actor la qual teacute com subclasses la classe APrincipalASecundari i ACameo Imaginem que estem tractant amb instancies drsquoactors i volem saber si la instanciaque estem tractant es de la classe APrincipal
Ho hauriacuteem de fer de la seguumlent manera
(eq (class instancia) APrincipal)
Fixem-nos que APrincipal eacutes un siacutembol no un String (un truco eacutes fixar-se en que no teacute cometes) Si vol-gueacutessim comparar-ho amb un String (per exemple un String introduiumlt per lrsquousuari) ho podriacuteem transformara un String amb el megravetode str-cat
(eq (str-cat (class instancia)) Principal)
3516 Como convierto un INSTANCE-ADRESS en un INSTANCE-NAME
En alguacuten momento nos podemos encontrar con la situacioacuten de que disponemos de un puntero a unainstancia y necesitamos su nombre o lo contrario En ambos casos podemos usar la funcioacuten instance-nameSu funcionamiento es bidireccional podemos introducirle un instance-name y nos devolveraacute un instance-adress y viceversa
1 (defrule imprimir-nombre2 estlt-(object (is-a Estudiante) (edad 25))3 =gt4 (printout t (instance-name est) crlf)5
)
3517 Com iterar a traveacutes drsquoun multi-slot
El seguumlent tambeacute eacutes vagravelid com exemple de com iterar a traveacutes drsquouna llistaImaginem que tenim una instagravencia de la classe Plat a la varible (plat) la qual teacute un multi-slot drsquoinstagravencies
de la classe Ingredient Imaginem que volem imprimir per pantalla el nom drsquoaquests ingredients (slot nomde la classe Ingredient) Necessitarem iterar sobre la llista drsquoingredients
1 (bind i 1)2 (while (lt= i (length$ (send plat get-ingredients)))3 do4 (bind ingredient (nth$ i (send plat get-ingredients)))5 (printout t (send ingredient get-nom) crlf)6 (bind i (+ i 1))7 )
El megravetode (nth$ ltINDEXgtltLLISTAgt) et retorna lrsquoelement situat a INDEX de LLISTAEl megravetode (length$ ltLLISTAgt) retorna el nuacutemero drsquoelements de LLISTA
3518 Coacutemo modificarinsertarborrar valores en un multislot
Los valores de un multislot se pueden cambiar usando la funcioacuten slot-replace$ La sintaxis es la siguiente
(slot-replace$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt ltvalorgt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3059
35 Las clasesinstancias 27
Donde ltiniciogt y ltfingt son el rango de posiciones del multislot que se quiere modificar y ltvalorgtson los valores que queremos reemplazar Obviamente deberaacute haber tantos valores como posiciones hayamosindicado en el rango
Para insertar nuevos valores podemos usar la funcioacuten slot-insert$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltposgt ltvalorgt)
El valor se inserta delante de la posicioacuten indicada si la posicioacuten es mayor que la longitud del multislot secolocaraacute al final
Para borrar elementos de un multislot podemos usar la funcioacuten slot-delete$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt)
Se borraraacuten los elementos que estaacuten en el rango indicado
3519 Coacutemo recorrer un atributo multievaluado
Supongamos que la variable respuesta tiene una lista de instancias
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 aquiacute hacemos lo que queramos4 )5 )
Loop-for-count funciona como un for primero la variable que haraacute de contador luego el valor de origeny luego el valor final Para controlar el final usamos la funcioacuten que he explicado antes i tomaraacute valoresdesde 1 hasta n asiacute que usando la funcioacuten nth$ obtendremos cada uno de los elementos La variable auxiraacute teniendo cada uno de los valores
3520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz)
Es igual que antes pero con dos bucles
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 (bind aux2 (send aux get-slot_que_queremos))4 (loop-for-count (j 1 (length$ aux2)) do5 (bind aux_final (nth$ j aux2))6 aquiacute ya podemos trabajar con el elemento en concreto7 )8 )
Supongamos que respuesta tiene una lista de instancias con el primer bucle haremos lo mismo que antes ir
iterando por esas instancias Una vez que tenemos cada instancia con aux2 con el segundo bucle iteraremosdentro de sus instancias interiores
Por ejemplo si tenemos varios equipos de fuacutetbol y cada equipo tiene varios jugadores en el primer bucleestamos iterando entre los equipos y en el segundo entre los jugadores de cada equipo en particular
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3159
28 Capiacutetulo 3 CLIPS
3521 Com puc esborrar una instagravencia
Per esborrar una instagravencia (per exemple segons la informacioacute que proporcioni lrsquousuari podem deduir queuna segraverie drsquoinstagravencies eacutes impossible que es facin servir per a la solucioacute) ho podem fer enviant un missatgedelete a la instagravencia eacutes a dir (send ltINSTANCIAgtdelete)
(send inst delete)
Un megravetode que podria ser uacutetil de la cara a la pragravectica podria ser el seguumlent
1 (defrule elimina-instancia2 (declare (salience 10))3 elimina-fact lt- (elimina-inst inst)4 =gt5 (send inst delete)6 (retract elimina-fact)
Imaginem que per exemple que volem eliminar una llista drsquoinstagravencies Per eliminar-les podriacuteem recoacuterrerel llistat marcant les instagravencies que volem esborrar afegint el seguumlent fet
(assert (elimina-instancia inst))
Aixiacute com que elimina-instancia teacute un salience alt esborraria les instagravencies marcades quan tingueacutes ocasioacuteDrsquoaquesta manera ens estalviem el problema de recoacuterrer un llistat drsquoinstagravencies amb un iterador mentre
anem eliminant els elements de la llista cosa que pot donar problemes amb lrsquoiterador
3522 Com imprimir una instagravencia
Per imprimir una classe (uacutetil per exemple per mostrar el resultat final) el millor eacutes definir message-handlersPer exemple imaginem que tenim una classe Plat la qual teacute un slot nom de tipus String Si volgueacutessimimprimir per pantalla un missatge que digueacutes
El nom del plat eacutes ndashltnom del platgtndash
Hauriacuteem de definir un message-handler que simplement imprimiacutes per pantalla el valor de lrsquoslot de laforma
(defmesssage-handler ltCLASSNAMEgt ltMESSAGENAMEgt primary ()ltCODIgt
)
Per el cas de lrsquoexemple
1 (defmessage-handler Plat print primary ()2 (printout t -- selfnom --) )3 )
Per cridar-ho nomeacutes caldragrave enviar-li un missatge a la instagravencia amb el nom del message-handler (enaquest cas print)
(send instancia print)
Un message-handler pot cridar a altres message-handlers amb el que es poden encadenar diverses instagraven-cies Per exemple imaginem que tenim la classe Menuacute la qual teacute un atribut plats que eacutes un llista drsquoinstagravenciesde la classe Plat Dintre del message-handler menuacute podriacuteem iterar a traveacutes de la llista de plats enviant elmissatge print que hem definit anteriorment
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3259
36 Programacioacuten 29
3523 Com es navega entre instagravencies relacionades
Per exemple tinc una instagravencia iA que teacute un slot anomenat slotB que eacutes una instagravencia drsquoun frame B Vullsaber el nom de la instagravencia associada al slotB de iA Ho pots fer aixiacute
(bind B (send iA get-slotB))(bind res (send B get-nom))
Si estagraves dins drsquouna condicioacute ho pots simplificar de la forma seguumlent
(bind res (send iAslotB get-nom)
Els dos punts soacuten equivalents al punt de Java
36 Programacioacuten
361 Com introduir un comentari
Els comentaris a CLIPS va darrere de un com per exemple
Comentari
Tambeacute podem afegir comentaris a les nostres regles deffacts deftemplates etc Generalment van darrereel nom de la estructura per exemple
1 (defrule neteja regla per la qual si la cuina estagrave bruta srsquoafegiragrave una tasca de2 neteja
3 (estat-cuina bruta)4 =gt5 (assert (tasca netejar))6 )
362 Referenciar el valor null a CLIPS
Per referenciar el valor null a clips es fa amb el simbol nil Per exemple si volem saber si una instagravenciainst es null ho podriacuteem fer de la seguumlent manera
(eq inst nil)
363 Formas de recorrer una lista
Para recorrer una lista disponemos de diferentes opciones en este FAQ explicaremos como crear unaestructura tipo ldquoWHILErdquo y tipo ldquoFORrdquo
1 While Esta regla se ejecuta hasta que la expresioacuten a evaluar sea falsa Este tipo de estructura se rigepor seguir la sintaxis while - do y se construiriacutea de la siguiente forma
(while ltexpresioacutengt[do] ltaccioacutengt)
Doacutende dependiendo del valor de ltexpresioacutengt
Valor TRUE Se realizaraacute la accioacuten ltaccioacutengt i se volveraacute a evaluar ltexpresioacutengt
Valor FALSE No se ejecutaraacute la accioacuten ltaccioacutengt
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3359
30 Capiacutetulo 3 CLIPS
2 For Esta regla sirve para ejecutar un bucle N (final - inicio) veces Este tipo de estructura se rige porseguir la sintaxis loop-for-count y se construiriacutea de la siguiente forma
(loop-for-count (ltvargtltiniciogtltfinalgt) [do] ltaccioacutengt)
Doacutende
ltvargt Variable que se usara como iacutendice
ltiniciogt Valor inicial que tendraacute ltvargt
ltfinalgt Ultimo valor que tendraacute la variable ltvargt
ltaccioacutengt Accioacuten que es realizaraacute hasta que ltvargt tenga el valor de ltfingt
364 Formas de elegir una opcioacuten
En este apartado explicaremos como crear una estructura if y una estructura switch
If Este tipo de estructura se rige por seguir la sintaxis if - then - else y se construiriacutea de lasiguiente forma
(if ltexpresioacutengtthen ltaccioacutengt[else ltaccioacuten2gt])
Doacutende dependiendo del valor de ltexpresioacutengt
bull Valor TRUE Se realizaraacute la accioacuten ltaccioacutengtbull Valor FALSE Se realizaraacute la accioacuten ltaccioacuten2gt (en caso de haber)
Switch Este tipo de estructura se rige por seguir la sintaxis switch - opciones y se construiriacutea dela siguiente forma
(switch ltexpresioacuten-testgt(case OPCION1 then ACCION1)(case OPCION2 then ACCION2)
([default] ACCION-DEFAULT)
)
Doacutende dependiendo del valor de ltexpresioacuten-casegt se ejecutaraacute una ltaccioacutengt en particular Si nin-guna ltopcioacutengt es correcta se ejecutara la ltaccioacuten-defaultgt
365 Funciones con la clase String
Habitualmente trabajaremos con Strings o cadena de Strings CLIPS proporciona una serie de herramien-tas para trabajar con esta clase
1 Convertir string a MAYUacuteSCULAS A veces es conveniente tener todos los caracteres en mayuacutesculaspara no tener problemas de comparaciones o simplemente por convenio Para ello CLIPS dispone dela funcioacuten upcase la cual convierte a mayuacutesculas un siacutembolo o string
(upcase ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplos
(upcase Ccedillips es divertido) rarr CcedilLIPS ES DIVERTIDO
(upcase Clips_es_divertido) rarr CLIPS_ES_DIVERTIDO
2 Convertir string a MINUacuteSCULAS la funcioacuten es downcase
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3459
36 Programacioacuten 31
3 Concatenacioacuten de strings Tambieacuten es de gran utilidad poder juntar dos o maacutes paraacutemetros en un solostring Todo paraacutemetro a juntar deben ser de uno de los siguientes tipos symbol String integer floato instance-name
(str-cat parametro1 parametro2 parametroN )
Ejemplo
(str-cat IA nota 10) rarr IAnota10
4 Comparacioacuten de strings Funcioacuten que nos indica si dos strings son iguales
(str-compareltexpresioacuten-simboacutelica-o-de-cadenagtltexpresioacuten-simboacutelica-o-de-cadenagt
)
Esta funcioacuten devuelve
0 Si ambos strings son iguales1 Si el primer string es mayor que el segundo string-1 Si el primer string es menor que el segundo string
5 Longitud de un string Muchas veces es de gran utilidad saber que tamantildeo tiene un string
(str-length ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplo
(str-length Inteligencia Artificial) rarr 23
366 iquestCoacutemo obtener el contenido de una variable en un string
Para conseguir un string a partir de un integer float symbol instance-name debes utilizar el comandostr-cat Si a la funcioacuten le pasamos como paraacutemetros varios elementos los transformaraacute a string y losconcatenaraacute La sintaxis de esta funcioacuten es la siguiente (str-cat elementos) Esta funcioacuten la usaremossobre todo cuando queramos realizar comparaciones entre el contenido de una variable y un string ya quepreviamente necesitaremos usar la funcioacuten str-cat para pasar el contenido de la variable a string y realizarde este modo la comparacioacuten de forma correcta
367 iquestComo se crea una lista
Con create$ Todos los operadores sobre listas llevan el siacutembolo $ al final Igual que con las variables sedebe usar bind siempre que se desee modificar una lista
(bind lista (create$ a b c))
368 iquestComo borro un elemento de una lista
Con delete$Usa la siguiente sintaxis(delete$ ltlistagt ltindice-iniciogt ltindice-finalgt)Se borraraacuten todos los elementos del rango entre las posiciones inicio y final ambas incluidas Tambieacuten exis-
tedelete-member$ (delete-member$ ltlistagt ltelementogt) Borraraacute todas las apariciones del elemento enla lista
(delete$ (create$ a b c d e f) 3 5) minusrarr (a b f)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2459
35 Las clasesinstancias 21
Srsquoha drsquoanar amb cura per aquest tipus de regla ja que si la base de coneixement eacutes molt amplia pot acabarderivant amb problemes de memograveria
Per exemple si en comptes de preguntar per una instagravencia de Plat pregunteacutessim per dues instancies dePlat
1 (defrule platsCars2 plat1 lt- (object (is-a Plat) (Preu p1))3 plat2 lt- (object (is-a Plat) (Preu p2))4 (test (gt p1 30))5 (test (gt p2 30))6 =gt7 (print t (send plat1 get-nom) i (send plat1 get-nom) soacuten cars8 crlf)9 )
Faria unificacioacute amb totes les combinacions possibles (amb repeticions) de dos plats de tota la base deconeixement Aixograve es podria anar ampliant fins fer-se intractable
Si tenim drsquoalguna manera el nom de la instancia podem fer
1 (defrule platPicant2 (cuina (plat p))3 (object (name p) (picant pi))4 =gt5 (print t picant pi crlf)6 )
Aixoacute es pot servir per crear condicions que facin servir noms drsquoinstancies que tenim almacenats a slotsdrsquoaltres instancies per exemple
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send v get-Preu) crlf)6 )
Aquesta regla imprimiria el preu del vi asociat al plat si es negre
356 Tengo problemas en condiciones de reglas con slots de instancias obtenidos con send
A veces dan problemas las reglas en las que las condiciones sobre los valores de los slots de una instanciase escriben usando mensajes get sobre los atributos de una instancia en lugar de utilizar patrones paraobtenerlos por ejemplo la regla
1 (defrule platcar2 plat lt- (object (is-a Plat) )3 (test (gt (send plat get-Preu) 30))4 =gt5 (print t (send plat get-nom) es car6 crlf)7 )
No funciona correctamente en CLIPS pero la regla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2559
22 Capiacutetulo 3 CLIPS
1 (defrule platcar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Siacute lo haceEn el caso de que el valor del slot sea booleano se puede escribir la regla como
1 (defrule platpicant2 plat lt- (object (is-a Plat) (Picant TRUE))3 =gt4 (print t (send plat get-nom) es picant crlf)
En el caso de que el slot sea a su vez una instancia se puede utilizar para obtener los valores de estainstancia en la condicion como se explica en la pregunta anterior
357 Tengo problemas con instancias obtenidas del slot de otra instancia en el patroacuten de unaregla
Este problema aparece cuando el patron de una regla instancia una variable a un nombre de instancia yesta no esta definida en el modulo de la regla por ejemplo si la regla siguiente pertenece a un modulo queno es el de la instancia
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4
=gt5 (print t preu (send v get-Preu) crlf)6 )
La regla se quejaraacute de que la instancia no existe al enviarle el send ya que solo se busca la instancia dentrodel moacutedulo de la regla y no en los importados Para arreglar esto se puede usar la funcioacuten (instance-address[ltMODULOgt|] ltINSTANCIAgt) que busca la direccion de la instancia en un modulo concreto o en todos losmoacutedulos que se importan () Deberiacuteamos entonces escribir la regla
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send (instance-address v) get-Preu) crlf)6 )
358 iquestCoacutemo realizar una buacutesqueda de instancias que cumplan unas restricciones
CLIPS nos ofrece varias funciones de buacutesqueda de instancias que cumplan unas determinadas restriccionesque a nosotros nos interese
La funcioacuten find-instance Esta funcioacuten devuelve la primera instancia que cumple todas las restric-ciones indicadas
La funcioacuten find-all-instances Esta funcioacuten devuelve todas las instancias que cumplen las restric-ciones indicadas
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2659
35 Las clasesinstancias 23
La sintaxis de ambas funciones es igual exceptuando el nombre de la funcioacuten(find-all-instances (clase_instancias) (restricciones))A continuacioacuten se muestran varios ejemplos
(bind rectangulos (find-all-instances ((inst Rectangulo)) (gtinstaltura 10))) Des-pueacutes de ejecutar esta funcioacuten en la variable rectangulos habraacute una lista con todas las instancias de la
clase Rectangulo cuya altura sea superior a 10(bind rectangulos (find-all-instances ((inst Rectangulo)) (and (gtinstaltura 10) (=instanchura 7)))) Este trozo de coacutedigo hace que en la variable rectangulos se guarde una listade las instancias de la clase Rectangulo que tienen una altura superior a 10 y una anchura igual a 7
Estas funciones que CLIPS nos ofrece tienen otra funcionalidad y es que podemos realizar buacutesquedas deconjuntos de instancias
(bind rectangulos (find-all-instances ((a Rectangulo) (b Rectangulo)) (= aalturabaltura))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas de instancias de laclase Rectangulo que tienen la misma altura
Por uacuteltimo es necesario comentar que se pueden realizar buacutesquedas de conjuntos de instancias que seande distintas clases
(bind figuras (find-all-instances ((rect Rectangulo) (circ Circulo)) (= rectalturacircradio))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas ltrectangulocirculogtque cumplan que la altura del rectaacutengulo sea igual al radio del ciacuterculo
Existen maacutes comandos para obtener instancias pero son menos utilizadas a nivel baacutesico como pueden serany-instancep do-for-instance do-for-all-instances y delayed-do-for-all-instances
359 iquestCoacutemo se interactuacutea con objetos
La interaccioacuten con objetos se efectuacutea mediante lo que se denomina mensaje
(defmessage-handlerltnombre-clasegtltnombre-mensajegt[lttipo-handlergt] [ltcomentariogt]ltparaacutemetrogt [ltparaacutemetro-comodiacutengt])ltaccioacutengt
)
Un gestor de mensajes consta de 7 partes
1 Nombre de clase a la que el gestor estaraacute asociado
2 Nombre del mensaje
3 Tipo de gestor (Nosotros habitualmente usaremos primary que viene por defecto)
4 Comentario (opcional)
5 Lista de paraacutemetros6 Paraacutemetro comodiacuten (para gestionar muacuteltiples paraacutemetros)
7 Secuencia de acciones o expresiones que seraacuten ejecutadas por el gestor
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2759
24 Capiacutetulo 3 CLIPS
Enfocado a la praacutectica de CLIPS la maacutes comuacuten es que queramos interactuar con objetos para
1 Imprimir los objetos Un ejemplo
1 (defmessage-handler avion imprimir-beneficio ()
2 Para implementar funciones calculadas asociadas al objeto Un ejemplo
1 (defmessage-handler avion calcular-beneficio ()2 ( selfplazas-ocupadas selfprecio-billete))3 )
Como se puede observar el paraacutemetro impliacutecito self contiene la instancia activa para este mensaje
3510 iquestComo se interactuacutea con las instancias de los objetos
Podremos interactuar entre las instancias de los objetos mediante la funcioacuten send
(send ltexpresioacuten-de-objetogtltnombre-de-mensajegtltexpresioacutengt)Donde se toman como argumentos el objeto destino del mensaje el mensaje mismo y otros paraacutemetros
que debieran ser pasados a los gestoresParticularmente en el aacutembito de la praacutectica usualmente necesitaremos utilizar el envioacute de mensajes de
tipo get put and delete Estos mensajes tiene la siguiente sintaxis
get-ltnombre-atributogt
put-ltnombre-atributogt
delete
Aquiacute tenemos un ejemplo de como utilizarlo recordando que ponemos entre corchetes la instancia la cualse enviacutea el mensaje
(defclass avion (is-a USER)(role concrete)(slot precio-billete (create-accessor read) (default 34))(slot plazas-ocupadas (create-accessor write) (default 0)))
Clase creada
gt(make-instance a of avion) Creacioacuten de una instancia de avion[a]
gt(send [a] get-precio-billete) Obtencioacuten de un slot34 Resultado obtenidogt(send [a] put-plazas-ocupadas 100) Modificacioacuten de un slotgt(send [a] delete) Eliminacioacuten de la instanciaTrue
3511 Uso de make-instance
Cuando queremos crear una instancia de una clase para ir rellenandola con los resultados o datos quevayamos obteniendo se haria lo siguiente
(bind variable_instancia (make-instance nombre_instancia of nombre_clase))
Una vez creada podemos jugar con dicha instancia en las diferentes reglas siempre que la llamemos enlos activadores
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2859
35 Las clasesinstancias 25
(defrule reglavar_instancia lt- (object (is-a nombre_clase))=gt
)
De esta manera dentro de la regla podemos hacer acciones con la instancia por ejemplo(send var_instancia put-articulo articulo_ejemplo)
3512 Como generar automaacuteticamente nombres de instancia
En ocasiones queremos crear instancias en reglas y queremos que su nombre sea distinto del de otrasque ya tenemos Para ello podemos utilizar las funciones gensym y gensym La primera genera un siacutembolodel estilo genN donde N es un nuacutemero La segunda hace lo mismo pero aseguraacutendose de que ese siacutembolono exista ya Se puede reiniciar el contador que usan estas dos funciones con el operador (setgen ltnumgt)donde ltnumgt es el nuacutemero por el que queremos que empiecen ahora los siacutembolos
Para usar esto para generar el nombre de una instancia podemos hacer
(make-instance (gensym) of ltclasegt)
Cada vez que se ejecute se generaraacute un nombre de instancia nuevoSi creamos instancias de diferentes clases y queremos que las instancias tengan nombres que podamos
identificar podemos concatenar siacutembolos a los siacutembolos generados por gensym por ejemplo
(make-instance (sym-cat pepe- (gensym)) of ltclasegt)
generaraacute una instancia con el nombre pepe-genN
3513 Com fer un getset drsquoun slot drsquouna classe
Per consultar el valor drsquoun slot drsquouna classe ho podem fer enviant-li un missatge de la seguumlent manera
(send ltVARIABLEgt get-ltNOM_ATRIBUTgt)
Per exemple si tenim una instagravencia de la classe Plat ( instancia ) i volem saber el valor del seu slotnom
(send instancia get-nom)
Per assignar un valor a un slot drsquouna drsquoinstagravencia hem drsquoenviar-li un missatge de la seguumlent manera
(send ltVARIABLEgt put-ltNOM_ATRIBUTgt ltVALORgt)On ltVALORgt pot ser un valor o un megravetode que retorni un valor
(send instancia put-nom nom)
3514 iquestCoacutemo acceder a una instancia cuyo nombre conocemos
Si conocemos el nombre de una instancia y necesitamos acceder a ella es decir necesitamos enviarle alguacutenmensaje mediante la funcioacuten send podemos hacerlo directamente escribiendo en lugar de la variable quealmacena la instancia el nombre de la instancia entre corchetes [ ] A continuacioacuten se muestra un ejemplo
(bind altura_rect1 (send [rect1] get-altura))
En este caso se guardaraacute en la variable altura_rect1 el valor de la altura de la instancia que tiene comonombre rect1
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2959
26 Capiacutetulo 3 CLIPS
3515 Obtenir el nom drsquouna classe
Si tenim una instagravencia drsquouna classe i volem saber el nom de la classe (uacutetil si tenim una bona taxonomiade classes) ho podem fer amb el megravetode (class ltINSTANCIAgt)
Si per exemple imaginem que tenim la classe Actor la qual teacute com subclasses la classe APrincipalASecundari i ACameo Imaginem que estem tractant amb instancies drsquoactors i volem saber si la instanciaque estem tractant es de la classe APrincipal
Ho hauriacuteem de fer de la seguumlent manera
(eq (class instancia) APrincipal)
Fixem-nos que APrincipal eacutes un siacutembol no un String (un truco eacutes fixar-se en que no teacute cometes) Si vol-gueacutessim comparar-ho amb un String (per exemple un String introduiumlt per lrsquousuari) ho podriacuteem transformara un String amb el megravetode str-cat
(eq (str-cat (class instancia)) Principal)
3516 Como convierto un INSTANCE-ADRESS en un INSTANCE-NAME
En alguacuten momento nos podemos encontrar con la situacioacuten de que disponemos de un puntero a unainstancia y necesitamos su nombre o lo contrario En ambos casos podemos usar la funcioacuten instance-nameSu funcionamiento es bidireccional podemos introducirle un instance-name y nos devolveraacute un instance-adress y viceversa
1 (defrule imprimir-nombre2 estlt-(object (is-a Estudiante) (edad 25))3 =gt4 (printout t (instance-name est) crlf)5
)
3517 Com iterar a traveacutes drsquoun multi-slot
El seguumlent tambeacute eacutes vagravelid com exemple de com iterar a traveacutes drsquouna llistaImaginem que tenim una instagravencia de la classe Plat a la varible (plat) la qual teacute un multi-slot drsquoinstagravencies
de la classe Ingredient Imaginem que volem imprimir per pantalla el nom drsquoaquests ingredients (slot nomde la classe Ingredient) Necessitarem iterar sobre la llista drsquoingredients
1 (bind i 1)2 (while (lt= i (length$ (send plat get-ingredients)))3 do4 (bind ingredient (nth$ i (send plat get-ingredients)))5 (printout t (send ingredient get-nom) crlf)6 (bind i (+ i 1))7 )
El megravetode (nth$ ltINDEXgtltLLISTAgt) et retorna lrsquoelement situat a INDEX de LLISTAEl megravetode (length$ ltLLISTAgt) retorna el nuacutemero drsquoelements de LLISTA
3518 Coacutemo modificarinsertarborrar valores en un multislot
Los valores de un multislot se pueden cambiar usando la funcioacuten slot-replace$ La sintaxis es la siguiente
(slot-replace$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt ltvalorgt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3059
35 Las clasesinstancias 27
Donde ltiniciogt y ltfingt son el rango de posiciones del multislot que se quiere modificar y ltvalorgtson los valores que queremos reemplazar Obviamente deberaacute haber tantos valores como posiciones hayamosindicado en el rango
Para insertar nuevos valores podemos usar la funcioacuten slot-insert$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltposgt ltvalorgt)
El valor se inserta delante de la posicioacuten indicada si la posicioacuten es mayor que la longitud del multislot secolocaraacute al final
Para borrar elementos de un multislot podemos usar la funcioacuten slot-delete$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt)
Se borraraacuten los elementos que estaacuten en el rango indicado
3519 Coacutemo recorrer un atributo multievaluado
Supongamos que la variable respuesta tiene una lista de instancias
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 aquiacute hacemos lo que queramos4 )5 )
Loop-for-count funciona como un for primero la variable que haraacute de contador luego el valor de origeny luego el valor final Para controlar el final usamos la funcioacuten que he explicado antes i tomaraacute valoresdesde 1 hasta n asiacute que usando la funcioacuten nth$ obtendremos cada uno de los elementos La variable auxiraacute teniendo cada uno de los valores
3520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz)
Es igual que antes pero con dos bucles
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 (bind aux2 (send aux get-slot_que_queremos))4 (loop-for-count (j 1 (length$ aux2)) do5 (bind aux_final (nth$ j aux2))6 aquiacute ya podemos trabajar con el elemento en concreto7 )8 )
Supongamos que respuesta tiene una lista de instancias con el primer bucle haremos lo mismo que antes ir
iterando por esas instancias Una vez que tenemos cada instancia con aux2 con el segundo bucle iteraremosdentro de sus instancias interiores
Por ejemplo si tenemos varios equipos de fuacutetbol y cada equipo tiene varios jugadores en el primer bucleestamos iterando entre los equipos y en el segundo entre los jugadores de cada equipo en particular
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3159
28 Capiacutetulo 3 CLIPS
3521 Com puc esborrar una instagravencia
Per esborrar una instagravencia (per exemple segons la informacioacute que proporcioni lrsquousuari podem deduir queuna segraverie drsquoinstagravencies eacutes impossible que es facin servir per a la solucioacute) ho podem fer enviant un missatgedelete a la instagravencia eacutes a dir (send ltINSTANCIAgtdelete)
(send inst delete)
Un megravetode que podria ser uacutetil de la cara a la pragravectica podria ser el seguumlent
1 (defrule elimina-instancia2 (declare (salience 10))3 elimina-fact lt- (elimina-inst inst)4 =gt5 (send inst delete)6 (retract elimina-fact)
Imaginem que per exemple que volem eliminar una llista drsquoinstagravencies Per eliminar-les podriacuteem recoacuterrerel llistat marcant les instagravencies que volem esborrar afegint el seguumlent fet
(assert (elimina-instancia inst))
Aixiacute com que elimina-instancia teacute un salience alt esborraria les instagravencies marcades quan tingueacutes ocasioacuteDrsquoaquesta manera ens estalviem el problema de recoacuterrer un llistat drsquoinstagravencies amb un iterador mentre
anem eliminant els elements de la llista cosa que pot donar problemes amb lrsquoiterador
3522 Com imprimir una instagravencia
Per imprimir una classe (uacutetil per exemple per mostrar el resultat final) el millor eacutes definir message-handlersPer exemple imaginem que tenim una classe Plat la qual teacute un slot nom de tipus String Si volgueacutessimimprimir per pantalla un missatge que digueacutes
El nom del plat eacutes ndashltnom del platgtndash
Hauriacuteem de definir un message-handler que simplement imprimiacutes per pantalla el valor de lrsquoslot de laforma
(defmesssage-handler ltCLASSNAMEgt ltMESSAGENAMEgt primary ()ltCODIgt
)
Per el cas de lrsquoexemple
1 (defmessage-handler Plat print primary ()2 (printout t -- selfnom --) )3 )
Per cridar-ho nomeacutes caldragrave enviar-li un missatge a la instagravencia amb el nom del message-handler (enaquest cas print)
(send instancia print)
Un message-handler pot cridar a altres message-handlers amb el que es poden encadenar diverses instagraven-cies Per exemple imaginem que tenim la classe Menuacute la qual teacute un atribut plats que eacutes un llista drsquoinstagravenciesde la classe Plat Dintre del message-handler menuacute podriacuteem iterar a traveacutes de la llista de plats enviant elmissatge print que hem definit anteriorment
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3259
36 Programacioacuten 29
3523 Com es navega entre instagravencies relacionades
Per exemple tinc una instagravencia iA que teacute un slot anomenat slotB que eacutes una instagravencia drsquoun frame B Vullsaber el nom de la instagravencia associada al slotB de iA Ho pots fer aixiacute
(bind B (send iA get-slotB))(bind res (send B get-nom))
Si estagraves dins drsquouna condicioacute ho pots simplificar de la forma seguumlent
(bind res (send iAslotB get-nom)
Els dos punts soacuten equivalents al punt de Java
36 Programacioacuten
361 Com introduir un comentari
Els comentaris a CLIPS va darrere de un com per exemple
Comentari
Tambeacute podem afegir comentaris a les nostres regles deffacts deftemplates etc Generalment van darrereel nom de la estructura per exemple
1 (defrule neteja regla per la qual si la cuina estagrave bruta srsquoafegiragrave una tasca de2 neteja
3 (estat-cuina bruta)4 =gt5 (assert (tasca netejar))6 )
362 Referenciar el valor null a CLIPS
Per referenciar el valor null a clips es fa amb el simbol nil Per exemple si volem saber si una instagravenciainst es null ho podriacuteem fer de la seguumlent manera
(eq inst nil)
363 Formas de recorrer una lista
Para recorrer una lista disponemos de diferentes opciones en este FAQ explicaremos como crear unaestructura tipo ldquoWHILErdquo y tipo ldquoFORrdquo
1 While Esta regla se ejecuta hasta que la expresioacuten a evaluar sea falsa Este tipo de estructura se rigepor seguir la sintaxis while - do y se construiriacutea de la siguiente forma
(while ltexpresioacutengt[do] ltaccioacutengt)
Doacutende dependiendo del valor de ltexpresioacutengt
Valor TRUE Se realizaraacute la accioacuten ltaccioacutengt i se volveraacute a evaluar ltexpresioacutengt
Valor FALSE No se ejecutaraacute la accioacuten ltaccioacutengt
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3359
30 Capiacutetulo 3 CLIPS
2 For Esta regla sirve para ejecutar un bucle N (final - inicio) veces Este tipo de estructura se rige porseguir la sintaxis loop-for-count y se construiriacutea de la siguiente forma
(loop-for-count (ltvargtltiniciogtltfinalgt) [do] ltaccioacutengt)
Doacutende
ltvargt Variable que se usara como iacutendice
ltiniciogt Valor inicial que tendraacute ltvargt
ltfinalgt Ultimo valor que tendraacute la variable ltvargt
ltaccioacutengt Accioacuten que es realizaraacute hasta que ltvargt tenga el valor de ltfingt
364 Formas de elegir una opcioacuten
En este apartado explicaremos como crear una estructura if y una estructura switch
If Este tipo de estructura se rige por seguir la sintaxis if - then - else y se construiriacutea de lasiguiente forma
(if ltexpresioacutengtthen ltaccioacutengt[else ltaccioacuten2gt])
Doacutende dependiendo del valor de ltexpresioacutengt
bull Valor TRUE Se realizaraacute la accioacuten ltaccioacutengtbull Valor FALSE Se realizaraacute la accioacuten ltaccioacuten2gt (en caso de haber)
Switch Este tipo de estructura se rige por seguir la sintaxis switch - opciones y se construiriacutea dela siguiente forma
(switch ltexpresioacuten-testgt(case OPCION1 then ACCION1)(case OPCION2 then ACCION2)
([default] ACCION-DEFAULT)
)
Doacutende dependiendo del valor de ltexpresioacuten-casegt se ejecutaraacute una ltaccioacutengt en particular Si nin-guna ltopcioacutengt es correcta se ejecutara la ltaccioacuten-defaultgt
365 Funciones con la clase String
Habitualmente trabajaremos con Strings o cadena de Strings CLIPS proporciona una serie de herramien-tas para trabajar con esta clase
1 Convertir string a MAYUacuteSCULAS A veces es conveniente tener todos los caracteres en mayuacutesculaspara no tener problemas de comparaciones o simplemente por convenio Para ello CLIPS dispone dela funcioacuten upcase la cual convierte a mayuacutesculas un siacutembolo o string
(upcase ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplos
(upcase Ccedillips es divertido) rarr CcedilLIPS ES DIVERTIDO
(upcase Clips_es_divertido) rarr CLIPS_ES_DIVERTIDO
2 Convertir string a MINUacuteSCULAS la funcioacuten es downcase
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3459
36 Programacioacuten 31
3 Concatenacioacuten de strings Tambieacuten es de gran utilidad poder juntar dos o maacutes paraacutemetros en un solostring Todo paraacutemetro a juntar deben ser de uno de los siguientes tipos symbol String integer floato instance-name
(str-cat parametro1 parametro2 parametroN )
Ejemplo
(str-cat IA nota 10) rarr IAnota10
4 Comparacioacuten de strings Funcioacuten que nos indica si dos strings son iguales
(str-compareltexpresioacuten-simboacutelica-o-de-cadenagtltexpresioacuten-simboacutelica-o-de-cadenagt
)
Esta funcioacuten devuelve
0 Si ambos strings son iguales1 Si el primer string es mayor que el segundo string-1 Si el primer string es menor que el segundo string
5 Longitud de un string Muchas veces es de gran utilidad saber que tamantildeo tiene un string
(str-length ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplo
(str-length Inteligencia Artificial) rarr 23
366 iquestCoacutemo obtener el contenido de una variable en un string
Para conseguir un string a partir de un integer float symbol instance-name debes utilizar el comandostr-cat Si a la funcioacuten le pasamos como paraacutemetros varios elementos los transformaraacute a string y losconcatenaraacute La sintaxis de esta funcioacuten es la siguiente (str-cat elementos) Esta funcioacuten la usaremossobre todo cuando queramos realizar comparaciones entre el contenido de una variable y un string ya quepreviamente necesitaremos usar la funcioacuten str-cat para pasar el contenido de la variable a string y realizarde este modo la comparacioacuten de forma correcta
367 iquestComo se crea una lista
Con create$ Todos los operadores sobre listas llevan el siacutembolo $ al final Igual que con las variables sedebe usar bind siempre que se desee modificar una lista
(bind lista (create$ a b c))
368 iquestComo borro un elemento de una lista
Con delete$Usa la siguiente sintaxis(delete$ ltlistagt ltindice-iniciogt ltindice-finalgt)Se borraraacuten todos los elementos del rango entre las posiciones inicio y final ambas incluidas Tambieacuten exis-
tedelete-member$ (delete-member$ ltlistagt ltelementogt) Borraraacute todas las apariciones del elemento enla lista
(delete$ (create$ a b c d e f) 3 5) minusrarr (a b f)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2559
22 Capiacutetulo 3 CLIPS
1 (defrule platcar2 plat lt- (object (is-a Plat) (Preu p))3 (test (gt p 30))4 =gt5 (print t (send plat get-nom) es car crlf)
Siacute lo haceEn el caso de que el valor del slot sea booleano se puede escribir la regla como
1 (defrule platpicant2 plat lt- (object (is-a Plat) (Picant TRUE))3 =gt4 (print t (send plat get-nom) es picant crlf)
En el caso de que el slot sea a su vez una instancia se puede utilizar para obtener los valores de estainstancia en la condicion como se explica en la pregunta anterior
357 Tengo problemas con instancias obtenidas del slot de otra instancia en el patroacuten de unaregla
Este problema aparece cuando el patron de una regla instancia una variable a un nombre de instancia yesta no esta definida en el modulo de la regla por ejemplo si la regla siguiente pertenece a un modulo queno es el de la instancia
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4
=gt5 (print t preu (send v get-Preu) crlf)6 )
La regla se quejaraacute de que la instancia no existe al enviarle el send ya que solo se busca la instancia dentrodel moacutedulo de la regla y no en los importados Para arreglar esto se puede usar la funcioacuten (instance-address[ltMODULOgt|] ltINSTANCIAgt) que busca la direccion de la instancia en un modulo concreto o en todos losmoacutedulos que se importan () Deberiacuteamos entonces escribir la regla
1 (defrule platPreuViNegre2 (object (is-a Plat) (vi v))3 (object (name v) (tipus negre))4 =gt5 (print t preu (send (instance-address v) get-Preu) crlf)6 )
358 iquestCoacutemo realizar una buacutesqueda de instancias que cumplan unas restricciones
CLIPS nos ofrece varias funciones de buacutesqueda de instancias que cumplan unas determinadas restriccionesque a nosotros nos interese
La funcioacuten find-instance Esta funcioacuten devuelve la primera instancia que cumple todas las restric-ciones indicadas
La funcioacuten find-all-instances Esta funcioacuten devuelve todas las instancias que cumplen las restric-ciones indicadas
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2659
35 Las clasesinstancias 23
La sintaxis de ambas funciones es igual exceptuando el nombre de la funcioacuten(find-all-instances (clase_instancias) (restricciones))A continuacioacuten se muestran varios ejemplos
(bind rectangulos (find-all-instances ((inst Rectangulo)) (gtinstaltura 10))) Des-pueacutes de ejecutar esta funcioacuten en la variable rectangulos habraacute una lista con todas las instancias de la
clase Rectangulo cuya altura sea superior a 10(bind rectangulos (find-all-instances ((inst Rectangulo)) (and (gtinstaltura 10) (=instanchura 7)))) Este trozo de coacutedigo hace que en la variable rectangulos se guarde una listade las instancias de la clase Rectangulo que tienen una altura superior a 10 y una anchura igual a 7
Estas funciones que CLIPS nos ofrece tienen otra funcionalidad y es que podemos realizar buacutesquedas deconjuntos de instancias
(bind rectangulos (find-all-instances ((a Rectangulo) (b Rectangulo)) (= aalturabaltura))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas de instancias de laclase Rectangulo que tienen la misma altura
Por uacuteltimo es necesario comentar que se pueden realizar buacutesquedas de conjuntos de instancias que seande distintas clases
(bind figuras (find-all-instances ((rect Rectangulo) (circ Circulo)) (= rectalturacircradio))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas ltrectangulocirculogtque cumplan que la altura del rectaacutengulo sea igual al radio del ciacuterculo
Existen maacutes comandos para obtener instancias pero son menos utilizadas a nivel baacutesico como pueden serany-instancep do-for-instance do-for-all-instances y delayed-do-for-all-instances
359 iquestCoacutemo se interactuacutea con objetos
La interaccioacuten con objetos se efectuacutea mediante lo que se denomina mensaje
(defmessage-handlerltnombre-clasegtltnombre-mensajegt[lttipo-handlergt] [ltcomentariogt]ltparaacutemetrogt [ltparaacutemetro-comodiacutengt])ltaccioacutengt
)
Un gestor de mensajes consta de 7 partes
1 Nombre de clase a la que el gestor estaraacute asociado
2 Nombre del mensaje
3 Tipo de gestor (Nosotros habitualmente usaremos primary que viene por defecto)
4 Comentario (opcional)
5 Lista de paraacutemetros6 Paraacutemetro comodiacuten (para gestionar muacuteltiples paraacutemetros)
7 Secuencia de acciones o expresiones que seraacuten ejecutadas por el gestor
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2759
24 Capiacutetulo 3 CLIPS
Enfocado a la praacutectica de CLIPS la maacutes comuacuten es que queramos interactuar con objetos para
1 Imprimir los objetos Un ejemplo
1 (defmessage-handler avion imprimir-beneficio ()
2 Para implementar funciones calculadas asociadas al objeto Un ejemplo
1 (defmessage-handler avion calcular-beneficio ()2 ( selfplazas-ocupadas selfprecio-billete))3 )
Como se puede observar el paraacutemetro impliacutecito self contiene la instancia activa para este mensaje
3510 iquestComo se interactuacutea con las instancias de los objetos
Podremos interactuar entre las instancias de los objetos mediante la funcioacuten send
(send ltexpresioacuten-de-objetogtltnombre-de-mensajegtltexpresioacutengt)Donde se toman como argumentos el objeto destino del mensaje el mensaje mismo y otros paraacutemetros
que debieran ser pasados a los gestoresParticularmente en el aacutembito de la praacutectica usualmente necesitaremos utilizar el envioacute de mensajes de
tipo get put and delete Estos mensajes tiene la siguiente sintaxis
get-ltnombre-atributogt
put-ltnombre-atributogt
delete
Aquiacute tenemos un ejemplo de como utilizarlo recordando que ponemos entre corchetes la instancia la cualse enviacutea el mensaje
(defclass avion (is-a USER)(role concrete)(slot precio-billete (create-accessor read) (default 34))(slot plazas-ocupadas (create-accessor write) (default 0)))
Clase creada
gt(make-instance a of avion) Creacioacuten de una instancia de avion[a]
gt(send [a] get-precio-billete) Obtencioacuten de un slot34 Resultado obtenidogt(send [a] put-plazas-ocupadas 100) Modificacioacuten de un slotgt(send [a] delete) Eliminacioacuten de la instanciaTrue
3511 Uso de make-instance
Cuando queremos crear una instancia de una clase para ir rellenandola con los resultados o datos quevayamos obteniendo se haria lo siguiente
(bind variable_instancia (make-instance nombre_instancia of nombre_clase))
Una vez creada podemos jugar con dicha instancia en las diferentes reglas siempre que la llamemos enlos activadores
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2859
35 Las clasesinstancias 25
(defrule reglavar_instancia lt- (object (is-a nombre_clase))=gt
)
De esta manera dentro de la regla podemos hacer acciones con la instancia por ejemplo(send var_instancia put-articulo articulo_ejemplo)
3512 Como generar automaacuteticamente nombres de instancia
En ocasiones queremos crear instancias en reglas y queremos que su nombre sea distinto del de otrasque ya tenemos Para ello podemos utilizar las funciones gensym y gensym La primera genera un siacutembolodel estilo genN donde N es un nuacutemero La segunda hace lo mismo pero aseguraacutendose de que ese siacutembolono exista ya Se puede reiniciar el contador que usan estas dos funciones con el operador (setgen ltnumgt)donde ltnumgt es el nuacutemero por el que queremos que empiecen ahora los siacutembolos
Para usar esto para generar el nombre de una instancia podemos hacer
(make-instance (gensym) of ltclasegt)
Cada vez que se ejecute se generaraacute un nombre de instancia nuevoSi creamos instancias de diferentes clases y queremos que las instancias tengan nombres que podamos
identificar podemos concatenar siacutembolos a los siacutembolos generados por gensym por ejemplo
(make-instance (sym-cat pepe- (gensym)) of ltclasegt)
generaraacute una instancia con el nombre pepe-genN
3513 Com fer un getset drsquoun slot drsquouna classe
Per consultar el valor drsquoun slot drsquouna classe ho podem fer enviant-li un missatge de la seguumlent manera
(send ltVARIABLEgt get-ltNOM_ATRIBUTgt)
Per exemple si tenim una instagravencia de la classe Plat ( instancia ) i volem saber el valor del seu slotnom
(send instancia get-nom)
Per assignar un valor a un slot drsquouna drsquoinstagravencia hem drsquoenviar-li un missatge de la seguumlent manera
(send ltVARIABLEgt put-ltNOM_ATRIBUTgt ltVALORgt)On ltVALORgt pot ser un valor o un megravetode que retorni un valor
(send instancia put-nom nom)
3514 iquestCoacutemo acceder a una instancia cuyo nombre conocemos
Si conocemos el nombre de una instancia y necesitamos acceder a ella es decir necesitamos enviarle alguacutenmensaje mediante la funcioacuten send podemos hacerlo directamente escribiendo en lugar de la variable quealmacena la instancia el nombre de la instancia entre corchetes [ ] A continuacioacuten se muestra un ejemplo
(bind altura_rect1 (send [rect1] get-altura))
En este caso se guardaraacute en la variable altura_rect1 el valor de la altura de la instancia que tiene comonombre rect1
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2959
26 Capiacutetulo 3 CLIPS
3515 Obtenir el nom drsquouna classe
Si tenim una instagravencia drsquouna classe i volem saber el nom de la classe (uacutetil si tenim una bona taxonomiade classes) ho podem fer amb el megravetode (class ltINSTANCIAgt)
Si per exemple imaginem que tenim la classe Actor la qual teacute com subclasses la classe APrincipalASecundari i ACameo Imaginem que estem tractant amb instancies drsquoactors i volem saber si la instanciaque estem tractant es de la classe APrincipal
Ho hauriacuteem de fer de la seguumlent manera
(eq (class instancia) APrincipal)
Fixem-nos que APrincipal eacutes un siacutembol no un String (un truco eacutes fixar-se en que no teacute cometes) Si vol-gueacutessim comparar-ho amb un String (per exemple un String introduiumlt per lrsquousuari) ho podriacuteem transformara un String amb el megravetode str-cat
(eq (str-cat (class instancia)) Principal)
3516 Como convierto un INSTANCE-ADRESS en un INSTANCE-NAME
En alguacuten momento nos podemos encontrar con la situacioacuten de que disponemos de un puntero a unainstancia y necesitamos su nombre o lo contrario En ambos casos podemos usar la funcioacuten instance-nameSu funcionamiento es bidireccional podemos introducirle un instance-name y nos devolveraacute un instance-adress y viceversa
1 (defrule imprimir-nombre2 estlt-(object (is-a Estudiante) (edad 25))3 =gt4 (printout t (instance-name est) crlf)5
)
3517 Com iterar a traveacutes drsquoun multi-slot
El seguumlent tambeacute eacutes vagravelid com exemple de com iterar a traveacutes drsquouna llistaImaginem que tenim una instagravencia de la classe Plat a la varible (plat) la qual teacute un multi-slot drsquoinstagravencies
de la classe Ingredient Imaginem que volem imprimir per pantalla el nom drsquoaquests ingredients (slot nomde la classe Ingredient) Necessitarem iterar sobre la llista drsquoingredients
1 (bind i 1)2 (while (lt= i (length$ (send plat get-ingredients)))3 do4 (bind ingredient (nth$ i (send plat get-ingredients)))5 (printout t (send ingredient get-nom) crlf)6 (bind i (+ i 1))7 )
El megravetode (nth$ ltINDEXgtltLLISTAgt) et retorna lrsquoelement situat a INDEX de LLISTAEl megravetode (length$ ltLLISTAgt) retorna el nuacutemero drsquoelements de LLISTA
3518 Coacutemo modificarinsertarborrar valores en un multislot
Los valores de un multislot se pueden cambiar usando la funcioacuten slot-replace$ La sintaxis es la siguiente
(slot-replace$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt ltvalorgt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3059
35 Las clasesinstancias 27
Donde ltiniciogt y ltfingt son el rango de posiciones del multislot que se quiere modificar y ltvalorgtson los valores que queremos reemplazar Obviamente deberaacute haber tantos valores como posiciones hayamosindicado en el rango
Para insertar nuevos valores podemos usar la funcioacuten slot-insert$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltposgt ltvalorgt)
El valor se inserta delante de la posicioacuten indicada si la posicioacuten es mayor que la longitud del multislot secolocaraacute al final
Para borrar elementos de un multislot podemos usar la funcioacuten slot-delete$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt)
Se borraraacuten los elementos que estaacuten en el rango indicado
3519 Coacutemo recorrer un atributo multievaluado
Supongamos que la variable respuesta tiene una lista de instancias
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 aquiacute hacemos lo que queramos4 )5 )
Loop-for-count funciona como un for primero la variable que haraacute de contador luego el valor de origeny luego el valor final Para controlar el final usamos la funcioacuten que he explicado antes i tomaraacute valoresdesde 1 hasta n asiacute que usando la funcioacuten nth$ obtendremos cada uno de los elementos La variable auxiraacute teniendo cada uno de los valores
3520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz)
Es igual que antes pero con dos bucles
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 (bind aux2 (send aux get-slot_que_queremos))4 (loop-for-count (j 1 (length$ aux2)) do5 (bind aux_final (nth$ j aux2))6 aquiacute ya podemos trabajar con el elemento en concreto7 )8 )
Supongamos que respuesta tiene una lista de instancias con el primer bucle haremos lo mismo que antes ir
iterando por esas instancias Una vez que tenemos cada instancia con aux2 con el segundo bucle iteraremosdentro de sus instancias interiores
Por ejemplo si tenemos varios equipos de fuacutetbol y cada equipo tiene varios jugadores en el primer bucleestamos iterando entre los equipos y en el segundo entre los jugadores de cada equipo en particular
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3159
28 Capiacutetulo 3 CLIPS
3521 Com puc esborrar una instagravencia
Per esborrar una instagravencia (per exemple segons la informacioacute que proporcioni lrsquousuari podem deduir queuna segraverie drsquoinstagravencies eacutes impossible que es facin servir per a la solucioacute) ho podem fer enviant un missatgedelete a la instagravencia eacutes a dir (send ltINSTANCIAgtdelete)
(send inst delete)
Un megravetode que podria ser uacutetil de la cara a la pragravectica podria ser el seguumlent
1 (defrule elimina-instancia2 (declare (salience 10))3 elimina-fact lt- (elimina-inst inst)4 =gt5 (send inst delete)6 (retract elimina-fact)
Imaginem que per exemple que volem eliminar una llista drsquoinstagravencies Per eliminar-les podriacuteem recoacuterrerel llistat marcant les instagravencies que volem esborrar afegint el seguumlent fet
(assert (elimina-instancia inst))
Aixiacute com que elimina-instancia teacute un salience alt esborraria les instagravencies marcades quan tingueacutes ocasioacuteDrsquoaquesta manera ens estalviem el problema de recoacuterrer un llistat drsquoinstagravencies amb un iterador mentre
anem eliminant els elements de la llista cosa que pot donar problemes amb lrsquoiterador
3522 Com imprimir una instagravencia
Per imprimir una classe (uacutetil per exemple per mostrar el resultat final) el millor eacutes definir message-handlersPer exemple imaginem que tenim una classe Plat la qual teacute un slot nom de tipus String Si volgueacutessimimprimir per pantalla un missatge que digueacutes
El nom del plat eacutes ndashltnom del platgtndash
Hauriacuteem de definir un message-handler que simplement imprimiacutes per pantalla el valor de lrsquoslot de laforma
(defmesssage-handler ltCLASSNAMEgt ltMESSAGENAMEgt primary ()ltCODIgt
)
Per el cas de lrsquoexemple
1 (defmessage-handler Plat print primary ()2 (printout t -- selfnom --) )3 )
Per cridar-ho nomeacutes caldragrave enviar-li un missatge a la instagravencia amb el nom del message-handler (enaquest cas print)
(send instancia print)
Un message-handler pot cridar a altres message-handlers amb el que es poden encadenar diverses instagraven-cies Per exemple imaginem que tenim la classe Menuacute la qual teacute un atribut plats que eacutes un llista drsquoinstagravenciesde la classe Plat Dintre del message-handler menuacute podriacuteem iterar a traveacutes de la llista de plats enviant elmissatge print que hem definit anteriorment
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3259
36 Programacioacuten 29
3523 Com es navega entre instagravencies relacionades
Per exemple tinc una instagravencia iA que teacute un slot anomenat slotB que eacutes una instagravencia drsquoun frame B Vullsaber el nom de la instagravencia associada al slotB de iA Ho pots fer aixiacute
(bind B (send iA get-slotB))(bind res (send B get-nom))
Si estagraves dins drsquouna condicioacute ho pots simplificar de la forma seguumlent
(bind res (send iAslotB get-nom)
Els dos punts soacuten equivalents al punt de Java
36 Programacioacuten
361 Com introduir un comentari
Els comentaris a CLIPS va darrere de un com per exemple
Comentari
Tambeacute podem afegir comentaris a les nostres regles deffacts deftemplates etc Generalment van darrereel nom de la estructura per exemple
1 (defrule neteja regla per la qual si la cuina estagrave bruta srsquoafegiragrave una tasca de2 neteja
3 (estat-cuina bruta)4 =gt5 (assert (tasca netejar))6 )
362 Referenciar el valor null a CLIPS
Per referenciar el valor null a clips es fa amb el simbol nil Per exemple si volem saber si una instagravenciainst es null ho podriacuteem fer de la seguumlent manera
(eq inst nil)
363 Formas de recorrer una lista
Para recorrer una lista disponemos de diferentes opciones en este FAQ explicaremos como crear unaestructura tipo ldquoWHILErdquo y tipo ldquoFORrdquo
1 While Esta regla se ejecuta hasta que la expresioacuten a evaluar sea falsa Este tipo de estructura se rigepor seguir la sintaxis while - do y se construiriacutea de la siguiente forma
(while ltexpresioacutengt[do] ltaccioacutengt)
Doacutende dependiendo del valor de ltexpresioacutengt
Valor TRUE Se realizaraacute la accioacuten ltaccioacutengt i se volveraacute a evaluar ltexpresioacutengt
Valor FALSE No se ejecutaraacute la accioacuten ltaccioacutengt
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3359
30 Capiacutetulo 3 CLIPS
2 For Esta regla sirve para ejecutar un bucle N (final - inicio) veces Este tipo de estructura se rige porseguir la sintaxis loop-for-count y se construiriacutea de la siguiente forma
(loop-for-count (ltvargtltiniciogtltfinalgt) [do] ltaccioacutengt)
Doacutende
ltvargt Variable que se usara como iacutendice
ltiniciogt Valor inicial que tendraacute ltvargt
ltfinalgt Ultimo valor que tendraacute la variable ltvargt
ltaccioacutengt Accioacuten que es realizaraacute hasta que ltvargt tenga el valor de ltfingt
364 Formas de elegir una opcioacuten
En este apartado explicaremos como crear una estructura if y una estructura switch
If Este tipo de estructura se rige por seguir la sintaxis if - then - else y se construiriacutea de lasiguiente forma
(if ltexpresioacutengtthen ltaccioacutengt[else ltaccioacuten2gt])
Doacutende dependiendo del valor de ltexpresioacutengt
bull Valor TRUE Se realizaraacute la accioacuten ltaccioacutengtbull Valor FALSE Se realizaraacute la accioacuten ltaccioacuten2gt (en caso de haber)
Switch Este tipo de estructura se rige por seguir la sintaxis switch - opciones y se construiriacutea dela siguiente forma
(switch ltexpresioacuten-testgt(case OPCION1 then ACCION1)(case OPCION2 then ACCION2)
([default] ACCION-DEFAULT)
)
Doacutende dependiendo del valor de ltexpresioacuten-casegt se ejecutaraacute una ltaccioacutengt en particular Si nin-guna ltopcioacutengt es correcta se ejecutara la ltaccioacuten-defaultgt
365 Funciones con la clase String
Habitualmente trabajaremos con Strings o cadena de Strings CLIPS proporciona una serie de herramien-tas para trabajar con esta clase
1 Convertir string a MAYUacuteSCULAS A veces es conveniente tener todos los caracteres en mayuacutesculaspara no tener problemas de comparaciones o simplemente por convenio Para ello CLIPS dispone dela funcioacuten upcase la cual convierte a mayuacutesculas un siacutembolo o string
(upcase ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplos
(upcase Ccedillips es divertido) rarr CcedilLIPS ES DIVERTIDO
(upcase Clips_es_divertido) rarr CLIPS_ES_DIVERTIDO
2 Convertir string a MINUacuteSCULAS la funcioacuten es downcase
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3459
36 Programacioacuten 31
3 Concatenacioacuten de strings Tambieacuten es de gran utilidad poder juntar dos o maacutes paraacutemetros en un solostring Todo paraacutemetro a juntar deben ser de uno de los siguientes tipos symbol String integer floato instance-name
(str-cat parametro1 parametro2 parametroN )
Ejemplo
(str-cat IA nota 10) rarr IAnota10
4 Comparacioacuten de strings Funcioacuten que nos indica si dos strings son iguales
(str-compareltexpresioacuten-simboacutelica-o-de-cadenagtltexpresioacuten-simboacutelica-o-de-cadenagt
)
Esta funcioacuten devuelve
0 Si ambos strings son iguales1 Si el primer string es mayor que el segundo string-1 Si el primer string es menor que el segundo string
5 Longitud de un string Muchas veces es de gran utilidad saber que tamantildeo tiene un string
(str-length ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplo
(str-length Inteligencia Artificial) rarr 23
366 iquestCoacutemo obtener el contenido de una variable en un string
Para conseguir un string a partir de un integer float symbol instance-name debes utilizar el comandostr-cat Si a la funcioacuten le pasamos como paraacutemetros varios elementos los transformaraacute a string y losconcatenaraacute La sintaxis de esta funcioacuten es la siguiente (str-cat elementos) Esta funcioacuten la usaremossobre todo cuando queramos realizar comparaciones entre el contenido de una variable y un string ya quepreviamente necesitaremos usar la funcioacuten str-cat para pasar el contenido de la variable a string y realizarde este modo la comparacioacuten de forma correcta
367 iquestComo se crea una lista
Con create$ Todos los operadores sobre listas llevan el siacutembolo $ al final Igual que con las variables sedebe usar bind siempre que se desee modificar una lista
(bind lista (create$ a b c))
368 iquestComo borro un elemento de una lista
Con delete$Usa la siguiente sintaxis(delete$ ltlistagt ltindice-iniciogt ltindice-finalgt)Se borraraacuten todos los elementos del rango entre las posiciones inicio y final ambas incluidas Tambieacuten exis-
tedelete-member$ (delete-member$ ltlistagt ltelementogt) Borraraacute todas las apariciones del elemento enla lista
(delete$ (create$ a b c d e f) 3 5) minusrarr (a b f)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2659
35 Las clasesinstancias 23
La sintaxis de ambas funciones es igual exceptuando el nombre de la funcioacuten(find-all-instances (clase_instancias) (restricciones))A continuacioacuten se muestran varios ejemplos
(bind rectangulos (find-all-instances ((inst Rectangulo)) (gtinstaltura 10))) Des-pueacutes de ejecutar esta funcioacuten en la variable rectangulos habraacute una lista con todas las instancias de la
clase Rectangulo cuya altura sea superior a 10(bind rectangulos (find-all-instances ((inst Rectangulo)) (and (gtinstaltura 10) (=instanchura 7)))) Este trozo de coacutedigo hace que en la variable rectangulos se guarde una listade las instancias de la clase Rectangulo que tienen una altura superior a 10 y una anchura igual a 7
Estas funciones que CLIPS nos ofrece tienen otra funcionalidad y es que podemos realizar buacutesquedas deconjuntos de instancias
(bind rectangulos (find-all-instances ((a Rectangulo) (b Rectangulo)) (= aalturabaltura))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas de instancias de laclase Rectangulo que tienen la misma altura
Por uacuteltimo es necesario comentar que se pueden realizar buacutesquedas de conjuntos de instancias que seande distintas clases
(bind figuras (find-all-instances ((rect Rectangulo) (circ Circulo)) (= rectalturacircradio))) Con este trozo de coacutedigo conseguiriacuteamos obtener todas las parejas ltrectangulocirculogtque cumplan que la altura del rectaacutengulo sea igual al radio del ciacuterculo
Existen maacutes comandos para obtener instancias pero son menos utilizadas a nivel baacutesico como pueden serany-instancep do-for-instance do-for-all-instances y delayed-do-for-all-instances
359 iquestCoacutemo se interactuacutea con objetos
La interaccioacuten con objetos se efectuacutea mediante lo que se denomina mensaje
(defmessage-handlerltnombre-clasegtltnombre-mensajegt[lttipo-handlergt] [ltcomentariogt]ltparaacutemetrogt [ltparaacutemetro-comodiacutengt])ltaccioacutengt
)
Un gestor de mensajes consta de 7 partes
1 Nombre de clase a la que el gestor estaraacute asociado
2 Nombre del mensaje
3 Tipo de gestor (Nosotros habitualmente usaremos primary que viene por defecto)
4 Comentario (opcional)
5 Lista de paraacutemetros6 Paraacutemetro comodiacuten (para gestionar muacuteltiples paraacutemetros)
7 Secuencia de acciones o expresiones que seraacuten ejecutadas por el gestor
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2759
24 Capiacutetulo 3 CLIPS
Enfocado a la praacutectica de CLIPS la maacutes comuacuten es que queramos interactuar con objetos para
1 Imprimir los objetos Un ejemplo
1 (defmessage-handler avion imprimir-beneficio ()
2 Para implementar funciones calculadas asociadas al objeto Un ejemplo
1 (defmessage-handler avion calcular-beneficio ()2 ( selfplazas-ocupadas selfprecio-billete))3 )
Como se puede observar el paraacutemetro impliacutecito self contiene la instancia activa para este mensaje
3510 iquestComo se interactuacutea con las instancias de los objetos
Podremos interactuar entre las instancias de los objetos mediante la funcioacuten send
(send ltexpresioacuten-de-objetogtltnombre-de-mensajegtltexpresioacutengt)Donde se toman como argumentos el objeto destino del mensaje el mensaje mismo y otros paraacutemetros
que debieran ser pasados a los gestoresParticularmente en el aacutembito de la praacutectica usualmente necesitaremos utilizar el envioacute de mensajes de
tipo get put and delete Estos mensajes tiene la siguiente sintaxis
get-ltnombre-atributogt
put-ltnombre-atributogt
delete
Aquiacute tenemos un ejemplo de como utilizarlo recordando que ponemos entre corchetes la instancia la cualse enviacutea el mensaje
(defclass avion (is-a USER)(role concrete)(slot precio-billete (create-accessor read) (default 34))(slot plazas-ocupadas (create-accessor write) (default 0)))
Clase creada
gt(make-instance a of avion) Creacioacuten de una instancia de avion[a]
gt(send [a] get-precio-billete) Obtencioacuten de un slot34 Resultado obtenidogt(send [a] put-plazas-ocupadas 100) Modificacioacuten de un slotgt(send [a] delete) Eliminacioacuten de la instanciaTrue
3511 Uso de make-instance
Cuando queremos crear una instancia de una clase para ir rellenandola con los resultados o datos quevayamos obteniendo se haria lo siguiente
(bind variable_instancia (make-instance nombre_instancia of nombre_clase))
Una vez creada podemos jugar con dicha instancia en las diferentes reglas siempre que la llamemos enlos activadores
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2859
35 Las clasesinstancias 25
(defrule reglavar_instancia lt- (object (is-a nombre_clase))=gt
)
De esta manera dentro de la regla podemos hacer acciones con la instancia por ejemplo(send var_instancia put-articulo articulo_ejemplo)
3512 Como generar automaacuteticamente nombres de instancia
En ocasiones queremos crear instancias en reglas y queremos que su nombre sea distinto del de otrasque ya tenemos Para ello podemos utilizar las funciones gensym y gensym La primera genera un siacutembolodel estilo genN donde N es un nuacutemero La segunda hace lo mismo pero aseguraacutendose de que ese siacutembolono exista ya Se puede reiniciar el contador que usan estas dos funciones con el operador (setgen ltnumgt)donde ltnumgt es el nuacutemero por el que queremos que empiecen ahora los siacutembolos
Para usar esto para generar el nombre de una instancia podemos hacer
(make-instance (gensym) of ltclasegt)
Cada vez que se ejecute se generaraacute un nombre de instancia nuevoSi creamos instancias de diferentes clases y queremos que las instancias tengan nombres que podamos
identificar podemos concatenar siacutembolos a los siacutembolos generados por gensym por ejemplo
(make-instance (sym-cat pepe- (gensym)) of ltclasegt)
generaraacute una instancia con el nombre pepe-genN
3513 Com fer un getset drsquoun slot drsquouna classe
Per consultar el valor drsquoun slot drsquouna classe ho podem fer enviant-li un missatge de la seguumlent manera
(send ltVARIABLEgt get-ltNOM_ATRIBUTgt)
Per exemple si tenim una instagravencia de la classe Plat ( instancia ) i volem saber el valor del seu slotnom
(send instancia get-nom)
Per assignar un valor a un slot drsquouna drsquoinstagravencia hem drsquoenviar-li un missatge de la seguumlent manera
(send ltVARIABLEgt put-ltNOM_ATRIBUTgt ltVALORgt)On ltVALORgt pot ser un valor o un megravetode que retorni un valor
(send instancia put-nom nom)
3514 iquestCoacutemo acceder a una instancia cuyo nombre conocemos
Si conocemos el nombre de una instancia y necesitamos acceder a ella es decir necesitamos enviarle alguacutenmensaje mediante la funcioacuten send podemos hacerlo directamente escribiendo en lugar de la variable quealmacena la instancia el nombre de la instancia entre corchetes [ ] A continuacioacuten se muestra un ejemplo
(bind altura_rect1 (send [rect1] get-altura))
En este caso se guardaraacute en la variable altura_rect1 el valor de la altura de la instancia que tiene comonombre rect1
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2959
26 Capiacutetulo 3 CLIPS
3515 Obtenir el nom drsquouna classe
Si tenim una instagravencia drsquouna classe i volem saber el nom de la classe (uacutetil si tenim una bona taxonomiade classes) ho podem fer amb el megravetode (class ltINSTANCIAgt)
Si per exemple imaginem que tenim la classe Actor la qual teacute com subclasses la classe APrincipalASecundari i ACameo Imaginem que estem tractant amb instancies drsquoactors i volem saber si la instanciaque estem tractant es de la classe APrincipal
Ho hauriacuteem de fer de la seguumlent manera
(eq (class instancia) APrincipal)
Fixem-nos que APrincipal eacutes un siacutembol no un String (un truco eacutes fixar-se en que no teacute cometes) Si vol-gueacutessim comparar-ho amb un String (per exemple un String introduiumlt per lrsquousuari) ho podriacuteem transformara un String amb el megravetode str-cat
(eq (str-cat (class instancia)) Principal)
3516 Como convierto un INSTANCE-ADRESS en un INSTANCE-NAME
En alguacuten momento nos podemos encontrar con la situacioacuten de que disponemos de un puntero a unainstancia y necesitamos su nombre o lo contrario En ambos casos podemos usar la funcioacuten instance-nameSu funcionamiento es bidireccional podemos introducirle un instance-name y nos devolveraacute un instance-adress y viceversa
1 (defrule imprimir-nombre2 estlt-(object (is-a Estudiante) (edad 25))3 =gt4 (printout t (instance-name est) crlf)5
)
3517 Com iterar a traveacutes drsquoun multi-slot
El seguumlent tambeacute eacutes vagravelid com exemple de com iterar a traveacutes drsquouna llistaImaginem que tenim una instagravencia de la classe Plat a la varible (plat) la qual teacute un multi-slot drsquoinstagravencies
de la classe Ingredient Imaginem que volem imprimir per pantalla el nom drsquoaquests ingredients (slot nomde la classe Ingredient) Necessitarem iterar sobre la llista drsquoingredients
1 (bind i 1)2 (while (lt= i (length$ (send plat get-ingredients)))3 do4 (bind ingredient (nth$ i (send plat get-ingredients)))5 (printout t (send ingredient get-nom) crlf)6 (bind i (+ i 1))7 )
El megravetode (nth$ ltINDEXgtltLLISTAgt) et retorna lrsquoelement situat a INDEX de LLISTAEl megravetode (length$ ltLLISTAgt) retorna el nuacutemero drsquoelements de LLISTA
3518 Coacutemo modificarinsertarborrar valores en un multislot
Los valores de un multislot se pueden cambiar usando la funcioacuten slot-replace$ La sintaxis es la siguiente
(slot-replace$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt ltvalorgt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3059
35 Las clasesinstancias 27
Donde ltiniciogt y ltfingt son el rango de posiciones del multislot que se quiere modificar y ltvalorgtson los valores que queremos reemplazar Obviamente deberaacute haber tantos valores como posiciones hayamosindicado en el rango
Para insertar nuevos valores podemos usar la funcioacuten slot-insert$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltposgt ltvalorgt)
El valor se inserta delante de la posicioacuten indicada si la posicioacuten es mayor que la longitud del multislot secolocaraacute al final
Para borrar elementos de un multislot podemos usar la funcioacuten slot-delete$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt)
Se borraraacuten los elementos que estaacuten en el rango indicado
3519 Coacutemo recorrer un atributo multievaluado
Supongamos que la variable respuesta tiene una lista de instancias
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 aquiacute hacemos lo que queramos4 )5 )
Loop-for-count funciona como un for primero la variable que haraacute de contador luego el valor de origeny luego el valor final Para controlar el final usamos la funcioacuten que he explicado antes i tomaraacute valoresdesde 1 hasta n asiacute que usando la funcioacuten nth$ obtendremos cada uno de los elementos La variable auxiraacute teniendo cada uno de los valores
3520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz)
Es igual que antes pero con dos bucles
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 (bind aux2 (send aux get-slot_que_queremos))4 (loop-for-count (j 1 (length$ aux2)) do5 (bind aux_final (nth$ j aux2))6 aquiacute ya podemos trabajar con el elemento en concreto7 )8 )
Supongamos que respuesta tiene una lista de instancias con el primer bucle haremos lo mismo que antes ir
iterando por esas instancias Una vez que tenemos cada instancia con aux2 con el segundo bucle iteraremosdentro de sus instancias interiores
Por ejemplo si tenemos varios equipos de fuacutetbol y cada equipo tiene varios jugadores en el primer bucleestamos iterando entre los equipos y en el segundo entre los jugadores de cada equipo en particular
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3159
28 Capiacutetulo 3 CLIPS
3521 Com puc esborrar una instagravencia
Per esborrar una instagravencia (per exemple segons la informacioacute que proporcioni lrsquousuari podem deduir queuna segraverie drsquoinstagravencies eacutes impossible que es facin servir per a la solucioacute) ho podem fer enviant un missatgedelete a la instagravencia eacutes a dir (send ltINSTANCIAgtdelete)
(send inst delete)
Un megravetode que podria ser uacutetil de la cara a la pragravectica podria ser el seguumlent
1 (defrule elimina-instancia2 (declare (salience 10))3 elimina-fact lt- (elimina-inst inst)4 =gt5 (send inst delete)6 (retract elimina-fact)
Imaginem que per exemple que volem eliminar una llista drsquoinstagravencies Per eliminar-les podriacuteem recoacuterrerel llistat marcant les instagravencies que volem esborrar afegint el seguumlent fet
(assert (elimina-instancia inst))
Aixiacute com que elimina-instancia teacute un salience alt esborraria les instagravencies marcades quan tingueacutes ocasioacuteDrsquoaquesta manera ens estalviem el problema de recoacuterrer un llistat drsquoinstagravencies amb un iterador mentre
anem eliminant els elements de la llista cosa que pot donar problemes amb lrsquoiterador
3522 Com imprimir una instagravencia
Per imprimir una classe (uacutetil per exemple per mostrar el resultat final) el millor eacutes definir message-handlersPer exemple imaginem que tenim una classe Plat la qual teacute un slot nom de tipus String Si volgueacutessimimprimir per pantalla un missatge que digueacutes
El nom del plat eacutes ndashltnom del platgtndash
Hauriacuteem de definir un message-handler que simplement imprimiacutes per pantalla el valor de lrsquoslot de laforma
(defmesssage-handler ltCLASSNAMEgt ltMESSAGENAMEgt primary ()ltCODIgt
)
Per el cas de lrsquoexemple
1 (defmessage-handler Plat print primary ()2 (printout t -- selfnom --) )3 )
Per cridar-ho nomeacutes caldragrave enviar-li un missatge a la instagravencia amb el nom del message-handler (enaquest cas print)
(send instancia print)
Un message-handler pot cridar a altres message-handlers amb el que es poden encadenar diverses instagraven-cies Per exemple imaginem que tenim la classe Menuacute la qual teacute un atribut plats que eacutes un llista drsquoinstagravenciesde la classe Plat Dintre del message-handler menuacute podriacuteem iterar a traveacutes de la llista de plats enviant elmissatge print que hem definit anteriorment
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3259
36 Programacioacuten 29
3523 Com es navega entre instagravencies relacionades
Per exemple tinc una instagravencia iA que teacute un slot anomenat slotB que eacutes una instagravencia drsquoun frame B Vullsaber el nom de la instagravencia associada al slotB de iA Ho pots fer aixiacute
(bind B (send iA get-slotB))(bind res (send B get-nom))
Si estagraves dins drsquouna condicioacute ho pots simplificar de la forma seguumlent
(bind res (send iAslotB get-nom)
Els dos punts soacuten equivalents al punt de Java
36 Programacioacuten
361 Com introduir un comentari
Els comentaris a CLIPS va darrere de un com per exemple
Comentari
Tambeacute podem afegir comentaris a les nostres regles deffacts deftemplates etc Generalment van darrereel nom de la estructura per exemple
1 (defrule neteja regla per la qual si la cuina estagrave bruta srsquoafegiragrave una tasca de2 neteja
3 (estat-cuina bruta)4 =gt5 (assert (tasca netejar))6 )
362 Referenciar el valor null a CLIPS
Per referenciar el valor null a clips es fa amb el simbol nil Per exemple si volem saber si una instagravenciainst es null ho podriacuteem fer de la seguumlent manera
(eq inst nil)
363 Formas de recorrer una lista
Para recorrer una lista disponemos de diferentes opciones en este FAQ explicaremos como crear unaestructura tipo ldquoWHILErdquo y tipo ldquoFORrdquo
1 While Esta regla se ejecuta hasta que la expresioacuten a evaluar sea falsa Este tipo de estructura se rigepor seguir la sintaxis while - do y se construiriacutea de la siguiente forma
(while ltexpresioacutengt[do] ltaccioacutengt)
Doacutende dependiendo del valor de ltexpresioacutengt
Valor TRUE Se realizaraacute la accioacuten ltaccioacutengt i se volveraacute a evaluar ltexpresioacutengt
Valor FALSE No se ejecutaraacute la accioacuten ltaccioacutengt
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3359
30 Capiacutetulo 3 CLIPS
2 For Esta regla sirve para ejecutar un bucle N (final - inicio) veces Este tipo de estructura se rige porseguir la sintaxis loop-for-count y se construiriacutea de la siguiente forma
(loop-for-count (ltvargtltiniciogtltfinalgt) [do] ltaccioacutengt)
Doacutende
ltvargt Variable que se usara como iacutendice
ltiniciogt Valor inicial que tendraacute ltvargt
ltfinalgt Ultimo valor que tendraacute la variable ltvargt
ltaccioacutengt Accioacuten que es realizaraacute hasta que ltvargt tenga el valor de ltfingt
364 Formas de elegir una opcioacuten
En este apartado explicaremos como crear una estructura if y una estructura switch
If Este tipo de estructura se rige por seguir la sintaxis if - then - else y se construiriacutea de lasiguiente forma
(if ltexpresioacutengtthen ltaccioacutengt[else ltaccioacuten2gt])
Doacutende dependiendo del valor de ltexpresioacutengt
bull Valor TRUE Se realizaraacute la accioacuten ltaccioacutengtbull Valor FALSE Se realizaraacute la accioacuten ltaccioacuten2gt (en caso de haber)
Switch Este tipo de estructura se rige por seguir la sintaxis switch - opciones y se construiriacutea dela siguiente forma
(switch ltexpresioacuten-testgt(case OPCION1 then ACCION1)(case OPCION2 then ACCION2)
([default] ACCION-DEFAULT)
)
Doacutende dependiendo del valor de ltexpresioacuten-casegt se ejecutaraacute una ltaccioacutengt en particular Si nin-guna ltopcioacutengt es correcta se ejecutara la ltaccioacuten-defaultgt
365 Funciones con la clase String
Habitualmente trabajaremos con Strings o cadena de Strings CLIPS proporciona una serie de herramien-tas para trabajar con esta clase
1 Convertir string a MAYUacuteSCULAS A veces es conveniente tener todos los caracteres en mayuacutesculaspara no tener problemas de comparaciones o simplemente por convenio Para ello CLIPS dispone dela funcioacuten upcase la cual convierte a mayuacutesculas un siacutembolo o string
(upcase ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplos
(upcase Ccedillips es divertido) rarr CcedilLIPS ES DIVERTIDO
(upcase Clips_es_divertido) rarr CLIPS_ES_DIVERTIDO
2 Convertir string a MINUacuteSCULAS la funcioacuten es downcase
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3459
36 Programacioacuten 31
3 Concatenacioacuten de strings Tambieacuten es de gran utilidad poder juntar dos o maacutes paraacutemetros en un solostring Todo paraacutemetro a juntar deben ser de uno de los siguientes tipos symbol String integer floato instance-name
(str-cat parametro1 parametro2 parametroN )
Ejemplo
(str-cat IA nota 10) rarr IAnota10
4 Comparacioacuten de strings Funcioacuten que nos indica si dos strings son iguales
(str-compareltexpresioacuten-simboacutelica-o-de-cadenagtltexpresioacuten-simboacutelica-o-de-cadenagt
)
Esta funcioacuten devuelve
0 Si ambos strings son iguales1 Si el primer string es mayor que el segundo string-1 Si el primer string es menor que el segundo string
5 Longitud de un string Muchas veces es de gran utilidad saber que tamantildeo tiene un string
(str-length ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplo
(str-length Inteligencia Artificial) rarr 23
366 iquestCoacutemo obtener el contenido de una variable en un string
Para conseguir un string a partir de un integer float symbol instance-name debes utilizar el comandostr-cat Si a la funcioacuten le pasamos como paraacutemetros varios elementos los transformaraacute a string y losconcatenaraacute La sintaxis de esta funcioacuten es la siguiente (str-cat elementos) Esta funcioacuten la usaremossobre todo cuando queramos realizar comparaciones entre el contenido de una variable y un string ya quepreviamente necesitaremos usar la funcioacuten str-cat para pasar el contenido de la variable a string y realizarde este modo la comparacioacuten de forma correcta
367 iquestComo se crea una lista
Con create$ Todos los operadores sobre listas llevan el siacutembolo $ al final Igual que con las variables sedebe usar bind siempre que se desee modificar una lista
(bind lista (create$ a b c))
368 iquestComo borro un elemento de una lista
Con delete$Usa la siguiente sintaxis(delete$ ltlistagt ltindice-iniciogt ltindice-finalgt)Se borraraacuten todos los elementos del rango entre las posiciones inicio y final ambas incluidas Tambieacuten exis-
tedelete-member$ (delete-member$ ltlistagt ltelementogt) Borraraacute todas las apariciones del elemento enla lista
(delete$ (create$ a b c d e f) 3 5) minusrarr (a b f)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2759
24 Capiacutetulo 3 CLIPS
Enfocado a la praacutectica de CLIPS la maacutes comuacuten es que queramos interactuar con objetos para
1 Imprimir los objetos Un ejemplo
1 (defmessage-handler avion imprimir-beneficio ()
2 Para implementar funciones calculadas asociadas al objeto Un ejemplo
1 (defmessage-handler avion calcular-beneficio ()2 ( selfplazas-ocupadas selfprecio-billete))3 )
Como se puede observar el paraacutemetro impliacutecito self contiene la instancia activa para este mensaje
3510 iquestComo se interactuacutea con las instancias de los objetos
Podremos interactuar entre las instancias de los objetos mediante la funcioacuten send
(send ltexpresioacuten-de-objetogtltnombre-de-mensajegtltexpresioacutengt)Donde se toman como argumentos el objeto destino del mensaje el mensaje mismo y otros paraacutemetros
que debieran ser pasados a los gestoresParticularmente en el aacutembito de la praacutectica usualmente necesitaremos utilizar el envioacute de mensajes de
tipo get put and delete Estos mensajes tiene la siguiente sintaxis
get-ltnombre-atributogt
put-ltnombre-atributogt
delete
Aquiacute tenemos un ejemplo de como utilizarlo recordando que ponemos entre corchetes la instancia la cualse enviacutea el mensaje
(defclass avion (is-a USER)(role concrete)(slot precio-billete (create-accessor read) (default 34))(slot plazas-ocupadas (create-accessor write) (default 0)))
Clase creada
gt(make-instance a of avion) Creacioacuten de una instancia de avion[a]
gt(send [a] get-precio-billete) Obtencioacuten de un slot34 Resultado obtenidogt(send [a] put-plazas-ocupadas 100) Modificacioacuten de un slotgt(send [a] delete) Eliminacioacuten de la instanciaTrue
3511 Uso de make-instance
Cuando queremos crear una instancia de una clase para ir rellenandola con los resultados o datos quevayamos obteniendo se haria lo siguiente
(bind variable_instancia (make-instance nombre_instancia of nombre_clase))
Una vez creada podemos jugar con dicha instancia en las diferentes reglas siempre que la llamemos enlos activadores
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2859
35 Las clasesinstancias 25
(defrule reglavar_instancia lt- (object (is-a nombre_clase))=gt
)
De esta manera dentro de la regla podemos hacer acciones con la instancia por ejemplo(send var_instancia put-articulo articulo_ejemplo)
3512 Como generar automaacuteticamente nombres de instancia
En ocasiones queremos crear instancias en reglas y queremos que su nombre sea distinto del de otrasque ya tenemos Para ello podemos utilizar las funciones gensym y gensym La primera genera un siacutembolodel estilo genN donde N es un nuacutemero La segunda hace lo mismo pero aseguraacutendose de que ese siacutembolono exista ya Se puede reiniciar el contador que usan estas dos funciones con el operador (setgen ltnumgt)donde ltnumgt es el nuacutemero por el que queremos que empiecen ahora los siacutembolos
Para usar esto para generar el nombre de una instancia podemos hacer
(make-instance (gensym) of ltclasegt)
Cada vez que se ejecute se generaraacute un nombre de instancia nuevoSi creamos instancias de diferentes clases y queremos que las instancias tengan nombres que podamos
identificar podemos concatenar siacutembolos a los siacutembolos generados por gensym por ejemplo
(make-instance (sym-cat pepe- (gensym)) of ltclasegt)
generaraacute una instancia con el nombre pepe-genN
3513 Com fer un getset drsquoun slot drsquouna classe
Per consultar el valor drsquoun slot drsquouna classe ho podem fer enviant-li un missatge de la seguumlent manera
(send ltVARIABLEgt get-ltNOM_ATRIBUTgt)
Per exemple si tenim una instagravencia de la classe Plat ( instancia ) i volem saber el valor del seu slotnom
(send instancia get-nom)
Per assignar un valor a un slot drsquouna drsquoinstagravencia hem drsquoenviar-li un missatge de la seguumlent manera
(send ltVARIABLEgt put-ltNOM_ATRIBUTgt ltVALORgt)On ltVALORgt pot ser un valor o un megravetode que retorni un valor
(send instancia put-nom nom)
3514 iquestCoacutemo acceder a una instancia cuyo nombre conocemos
Si conocemos el nombre de una instancia y necesitamos acceder a ella es decir necesitamos enviarle alguacutenmensaje mediante la funcioacuten send podemos hacerlo directamente escribiendo en lugar de la variable quealmacena la instancia el nombre de la instancia entre corchetes [ ] A continuacioacuten se muestra un ejemplo
(bind altura_rect1 (send [rect1] get-altura))
En este caso se guardaraacute en la variable altura_rect1 el valor de la altura de la instancia que tiene comonombre rect1
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2959
26 Capiacutetulo 3 CLIPS
3515 Obtenir el nom drsquouna classe
Si tenim una instagravencia drsquouna classe i volem saber el nom de la classe (uacutetil si tenim una bona taxonomiade classes) ho podem fer amb el megravetode (class ltINSTANCIAgt)
Si per exemple imaginem que tenim la classe Actor la qual teacute com subclasses la classe APrincipalASecundari i ACameo Imaginem que estem tractant amb instancies drsquoactors i volem saber si la instanciaque estem tractant es de la classe APrincipal
Ho hauriacuteem de fer de la seguumlent manera
(eq (class instancia) APrincipal)
Fixem-nos que APrincipal eacutes un siacutembol no un String (un truco eacutes fixar-se en que no teacute cometes) Si vol-gueacutessim comparar-ho amb un String (per exemple un String introduiumlt per lrsquousuari) ho podriacuteem transformara un String amb el megravetode str-cat
(eq (str-cat (class instancia)) Principal)
3516 Como convierto un INSTANCE-ADRESS en un INSTANCE-NAME
En alguacuten momento nos podemos encontrar con la situacioacuten de que disponemos de un puntero a unainstancia y necesitamos su nombre o lo contrario En ambos casos podemos usar la funcioacuten instance-nameSu funcionamiento es bidireccional podemos introducirle un instance-name y nos devolveraacute un instance-adress y viceversa
1 (defrule imprimir-nombre2 estlt-(object (is-a Estudiante) (edad 25))3 =gt4 (printout t (instance-name est) crlf)5
)
3517 Com iterar a traveacutes drsquoun multi-slot
El seguumlent tambeacute eacutes vagravelid com exemple de com iterar a traveacutes drsquouna llistaImaginem que tenim una instagravencia de la classe Plat a la varible (plat) la qual teacute un multi-slot drsquoinstagravencies
de la classe Ingredient Imaginem que volem imprimir per pantalla el nom drsquoaquests ingredients (slot nomde la classe Ingredient) Necessitarem iterar sobre la llista drsquoingredients
1 (bind i 1)2 (while (lt= i (length$ (send plat get-ingredients)))3 do4 (bind ingredient (nth$ i (send plat get-ingredients)))5 (printout t (send ingredient get-nom) crlf)6 (bind i (+ i 1))7 )
El megravetode (nth$ ltINDEXgtltLLISTAgt) et retorna lrsquoelement situat a INDEX de LLISTAEl megravetode (length$ ltLLISTAgt) retorna el nuacutemero drsquoelements de LLISTA
3518 Coacutemo modificarinsertarborrar valores en un multislot
Los valores de un multislot se pueden cambiar usando la funcioacuten slot-replace$ La sintaxis es la siguiente
(slot-replace$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt ltvalorgt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3059
35 Las clasesinstancias 27
Donde ltiniciogt y ltfingt son el rango de posiciones del multislot que se quiere modificar y ltvalorgtson los valores que queremos reemplazar Obviamente deberaacute haber tantos valores como posiciones hayamosindicado en el rango
Para insertar nuevos valores podemos usar la funcioacuten slot-insert$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltposgt ltvalorgt)
El valor se inserta delante de la posicioacuten indicada si la posicioacuten es mayor que la longitud del multislot secolocaraacute al final
Para borrar elementos de un multislot podemos usar la funcioacuten slot-delete$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt)
Se borraraacuten los elementos que estaacuten en el rango indicado
3519 Coacutemo recorrer un atributo multievaluado
Supongamos que la variable respuesta tiene una lista de instancias
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 aquiacute hacemos lo que queramos4 )5 )
Loop-for-count funciona como un for primero la variable que haraacute de contador luego el valor de origeny luego el valor final Para controlar el final usamos la funcioacuten que he explicado antes i tomaraacute valoresdesde 1 hasta n asiacute que usando la funcioacuten nth$ obtendremos cada uno de los elementos La variable auxiraacute teniendo cada uno de los valores
3520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz)
Es igual que antes pero con dos bucles
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 (bind aux2 (send aux get-slot_que_queremos))4 (loop-for-count (j 1 (length$ aux2)) do5 (bind aux_final (nth$ j aux2))6 aquiacute ya podemos trabajar con el elemento en concreto7 )8 )
Supongamos que respuesta tiene una lista de instancias con el primer bucle haremos lo mismo que antes ir
iterando por esas instancias Una vez que tenemos cada instancia con aux2 con el segundo bucle iteraremosdentro de sus instancias interiores
Por ejemplo si tenemos varios equipos de fuacutetbol y cada equipo tiene varios jugadores en el primer bucleestamos iterando entre los equipos y en el segundo entre los jugadores de cada equipo en particular
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3159
28 Capiacutetulo 3 CLIPS
3521 Com puc esborrar una instagravencia
Per esborrar una instagravencia (per exemple segons la informacioacute que proporcioni lrsquousuari podem deduir queuna segraverie drsquoinstagravencies eacutes impossible que es facin servir per a la solucioacute) ho podem fer enviant un missatgedelete a la instagravencia eacutes a dir (send ltINSTANCIAgtdelete)
(send inst delete)
Un megravetode que podria ser uacutetil de la cara a la pragravectica podria ser el seguumlent
1 (defrule elimina-instancia2 (declare (salience 10))3 elimina-fact lt- (elimina-inst inst)4 =gt5 (send inst delete)6 (retract elimina-fact)
Imaginem que per exemple que volem eliminar una llista drsquoinstagravencies Per eliminar-les podriacuteem recoacuterrerel llistat marcant les instagravencies que volem esborrar afegint el seguumlent fet
(assert (elimina-instancia inst))
Aixiacute com que elimina-instancia teacute un salience alt esborraria les instagravencies marcades quan tingueacutes ocasioacuteDrsquoaquesta manera ens estalviem el problema de recoacuterrer un llistat drsquoinstagravencies amb un iterador mentre
anem eliminant els elements de la llista cosa que pot donar problemes amb lrsquoiterador
3522 Com imprimir una instagravencia
Per imprimir una classe (uacutetil per exemple per mostrar el resultat final) el millor eacutes definir message-handlersPer exemple imaginem que tenim una classe Plat la qual teacute un slot nom de tipus String Si volgueacutessimimprimir per pantalla un missatge que digueacutes
El nom del plat eacutes ndashltnom del platgtndash
Hauriacuteem de definir un message-handler que simplement imprimiacutes per pantalla el valor de lrsquoslot de laforma
(defmesssage-handler ltCLASSNAMEgt ltMESSAGENAMEgt primary ()ltCODIgt
)
Per el cas de lrsquoexemple
1 (defmessage-handler Plat print primary ()2 (printout t -- selfnom --) )3 )
Per cridar-ho nomeacutes caldragrave enviar-li un missatge a la instagravencia amb el nom del message-handler (enaquest cas print)
(send instancia print)
Un message-handler pot cridar a altres message-handlers amb el que es poden encadenar diverses instagraven-cies Per exemple imaginem que tenim la classe Menuacute la qual teacute un atribut plats que eacutes un llista drsquoinstagravenciesde la classe Plat Dintre del message-handler menuacute podriacuteem iterar a traveacutes de la llista de plats enviant elmissatge print que hem definit anteriorment
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3259
36 Programacioacuten 29
3523 Com es navega entre instagravencies relacionades
Per exemple tinc una instagravencia iA que teacute un slot anomenat slotB que eacutes una instagravencia drsquoun frame B Vullsaber el nom de la instagravencia associada al slotB de iA Ho pots fer aixiacute
(bind B (send iA get-slotB))(bind res (send B get-nom))
Si estagraves dins drsquouna condicioacute ho pots simplificar de la forma seguumlent
(bind res (send iAslotB get-nom)
Els dos punts soacuten equivalents al punt de Java
36 Programacioacuten
361 Com introduir un comentari
Els comentaris a CLIPS va darrere de un com per exemple
Comentari
Tambeacute podem afegir comentaris a les nostres regles deffacts deftemplates etc Generalment van darrereel nom de la estructura per exemple
1 (defrule neteja regla per la qual si la cuina estagrave bruta srsquoafegiragrave una tasca de2 neteja
3 (estat-cuina bruta)4 =gt5 (assert (tasca netejar))6 )
362 Referenciar el valor null a CLIPS
Per referenciar el valor null a clips es fa amb el simbol nil Per exemple si volem saber si una instagravenciainst es null ho podriacuteem fer de la seguumlent manera
(eq inst nil)
363 Formas de recorrer una lista
Para recorrer una lista disponemos de diferentes opciones en este FAQ explicaremos como crear unaestructura tipo ldquoWHILErdquo y tipo ldquoFORrdquo
1 While Esta regla se ejecuta hasta que la expresioacuten a evaluar sea falsa Este tipo de estructura se rigepor seguir la sintaxis while - do y se construiriacutea de la siguiente forma
(while ltexpresioacutengt[do] ltaccioacutengt)
Doacutende dependiendo del valor de ltexpresioacutengt
Valor TRUE Se realizaraacute la accioacuten ltaccioacutengt i se volveraacute a evaluar ltexpresioacutengt
Valor FALSE No se ejecutaraacute la accioacuten ltaccioacutengt
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3359
30 Capiacutetulo 3 CLIPS
2 For Esta regla sirve para ejecutar un bucle N (final - inicio) veces Este tipo de estructura se rige porseguir la sintaxis loop-for-count y se construiriacutea de la siguiente forma
(loop-for-count (ltvargtltiniciogtltfinalgt) [do] ltaccioacutengt)
Doacutende
ltvargt Variable que se usara como iacutendice
ltiniciogt Valor inicial que tendraacute ltvargt
ltfinalgt Ultimo valor que tendraacute la variable ltvargt
ltaccioacutengt Accioacuten que es realizaraacute hasta que ltvargt tenga el valor de ltfingt
364 Formas de elegir una opcioacuten
En este apartado explicaremos como crear una estructura if y una estructura switch
If Este tipo de estructura se rige por seguir la sintaxis if - then - else y se construiriacutea de lasiguiente forma
(if ltexpresioacutengtthen ltaccioacutengt[else ltaccioacuten2gt])
Doacutende dependiendo del valor de ltexpresioacutengt
bull Valor TRUE Se realizaraacute la accioacuten ltaccioacutengtbull Valor FALSE Se realizaraacute la accioacuten ltaccioacuten2gt (en caso de haber)
Switch Este tipo de estructura se rige por seguir la sintaxis switch - opciones y se construiriacutea dela siguiente forma
(switch ltexpresioacuten-testgt(case OPCION1 then ACCION1)(case OPCION2 then ACCION2)
([default] ACCION-DEFAULT)
)
Doacutende dependiendo del valor de ltexpresioacuten-casegt se ejecutaraacute una ltaccioacutengt en particular Si nin-guna ltopcioacutengt es correcta se ejecutara la ltaccioacuten-defaultgt
365 Funciones con la clase String
Habitualmente trabajaremos con Strings o cadena de Strings CLIPS proporciona una serie de herramien-tas para trabajar con esta clase
1 Convertir string a MAYUacuteSCULAS A veces es conveniente tener todos los caracteres en mayuacutesculaspara no tener problemas de comparaciones o simplemente por convenio Para ello CLIPS dispone dela funcioacuten upcase la cual convierte a mayuacutesculas un siacutembolo o string
(upcase ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplos
(upcase Ccedillips es divertido) rarr CcedilLIPS ES DIVERTIDO
(upcase Clips_es_divertido) rarr CLIPS_ES_DIVERTIDO
2 Convertir string a MINUacuteSCULAS la funcioacuten es downcase
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3459
36 Programacioacuten 31
3 Concatenacioacuten de strings Tambieacuten es de gran utilidad poder juntar dos o maacutes paraacutemetros en un solostring Todo paraacutemetro a juntar deben ser de uno de los siguientes tipos symbol String integer floato instance-name
(str-cat parametro1 parametro2 parametroN )
Ejemplo
(str-cat IA nota 10) rarr IAnota10
4 Comparacioacuten de strings Funcioacuten que nos indica si dos strings son iguales
(str-compareltexpresioacuten-simboacutelica-o-de-cadenagtltexpresioacuten-simboacutelica-o-de-cadenagt
)
Esta funcioacuten devuelve
0 Si ambos strings son iguales1 Si el primer string es mayor que el segundo string-1 Si el primer string es menor que el segundo string
5 Longitud de un string Muchas veces es de gran utilidad saber que tamantildeo tiene un string
(str-length ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplo
(str-length Inteligencia Artificial) rarr 23
366 iquestCoacutemo obtener el contenido de una variable en un string
Para conseguir un string a partir de un integer float symbol instance-name debes utilizar el comandostr-cat Si a la funcioacuten le pasamos como paraacutemetros varios elementos los transformaraacute a string y losconcatenaraacute La sintaxis de esta funcioacuten es la siguiente (str-cat elementos) Esta funcioacuten la usaremossobre todo cuando queramos realizar comparaciones entre el contenido de una variable y un string ya quepreviamente necesitaremos usar la funcioacuten str-cat para pasar el contenido de la variable a string y realizarde este modo la comparacioacuten de forma correcta
367 iquestComo se crea una lista
Con create$ Todos los operadores sobre listas llevan el siacutembolo $ al final Igual que con las variables sedebe usar bind siempre que se desee modificar una lista
(bind lista (create$ a b c))
368 iquestComo borro un elemento de una lista
Con delete$Usa la siguiente sintaxis(delete$ ltlistagt ltindice-iniciogt ltindice-finalgt)Se borraraacuten todos los elementos del rango entre las posiciones inicio y final ambas incluidas Tambieacuten exis-
tedelete-member$ (delete-member$ ltlistagt ltelementogt) Borraraacute todas las apariciones del elemento enla lista
(delete$ (create$ a b c d e f) 3 5) minusrarr (a b f)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2859
35 Las clasesinstancias 25
(defrule reglavar_instancia lt- (object (is-a nombre_clase))=gt
)
De esta manera dentro de la regla podemos hacer acciones con la instancia por ejemplo(send var_instancia put-articulo articulo_ejemplo)
3512 Como generar automaacuteticamente nombres de instancia
En ocasiones queremos crear instancias en reglas y queremos que su nombre sea distinto del de otrasque ya tenemos Para ello podemos utilizar las funciones gensym y gensym La primera genera un siacutembolodel estilo genN donde N es un nuacutemero La segunda hace lo mismo pero aseguraacutendose de que ese siacutembolono exista ya Se puede reiniciar el contador que usan estas dos funciones con el operador (setgen ltnumgt)donde ltnumgt es el nuacutemero por el que queremos que empiecen ahora los siacutembolos
Para usar esto para generar el nombre de una instancia podemos hacer
(make-instance (gensym) of ltclasegt)
Cada vez que se ejecute se generaraacute un nombre de instancia nuevoSi creamos instancias de diferentes clases y queremos que las instancias tengan nombres que podamos
identificar podemos concatenar siacutembolos a los siacutembolos generados por gensym por ejemplo
(make-instance (sym-cat pepe- (gensym)) of ltclasegt)
generaraacute una instancia con el nombre pepe-genN
3513 Com fer un getset drsquoun slot drsquouna classe
Per consultar el valor drsquoun slot drsquouna classe ho podem fer enviant-li un missatge de la seguumlent manera
(send ltVARIABLEgt get-ltNOM_ATRIBUTgt)
Per exemple si tenim una instagravencia de la classe Plat ( instancia ) i volem saber el valor del seu slotnom
(send instancia get-nom)
Per assignar un valor a un slot drsquouna drsquoinstagravencia hem drsquoenviar-li un missatge de la seguumlent manera
(send ltVARIABLEgt put-ltNOM_ATRIBUTgt ltVALORgt)On ltVALORgt pot ser un valor o un megravetode que retorni un valor
(send instancia put-nom nom)
3514 iquestCoacutemo acceder a una instancia cuyo nombre conocemos
Si conocemos el nombre de una instancia y necesitamos acceder a ella es decir necesitamos enviarle alguacutenmensaje mediante la funcioacuten send podemos hacerlo directamente escribiendo en lugar de la variable quealmacena la instancia el nombre de la instancia entre corchetes [ ] A continuacioacuten se muestra un ejemplo
(bind altura_rect1 (send [rect1] get-altura))
En este caso se guardaraacute en la variable altura_rect1 el valor de la altura de la instancia que tiene comonombre rect1
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2959
26 Capiacutetulo 3 CLIPS
3515 Obtenir el nom drsquouna classe
Si tenim una instagravencia drsquouna classe i volem saber el nom de la classe (uacutetil si tenim una bona taxonomiade classes) ho podem fer amb el megravetode (class ltINSTANCIAgt)
Si per exemple imaginem que tenim la classe Actor la qual teacute com subclasses la classe APrincipalASecundari i ACameo Imaginem que estem tractant amb instancies drsquoactors i volem saber si la instanciaque estem tractant es de la classe APrincipal
Ho hauriacuteem de fer de la seguumlent manera
(eq (class instancia) APrincipal)
Fixem-nos que APrincipal eacutes un siacutembol no un String (un truco eacutes fixar-se en que no teacute cometes) Si vol-gueacutessim comparar-ho amb un String (per exemple un String introduiumlt per lrsquousuari) ho podriacuteem transformara un String amb el megravetode str-cat
(eq (str-cat (class instancia)) Principal)
3516 Como convierto un INSTANCE-ADRESS en un INSTANCE-NAME
En alguacuten momento nos podemos encontrar con la situacioacuten de que disponemos de un puntero a unainstancia y necesitamos su nombre o lo contrario En ambos casos podemos usar la funcioacuten instance-nameSu funcionamiento es bidireccional podemos introducirle un instance-name y nos devolveraacute un instance-adress y viceversa
1 (defrule imprimir-nombre2 estlt-(object (is-a Estudiante) (edad 25))3 =gt4 (printout t (instance-name est) crlf)5
)
3517 Com iterar a traveacutes drsquoun multi-slot
El seguumlent tambeacute eacutes vagravelid com exemple de com iterar a traveacutes drsquouna llistaImaginem que tenim una instagravencia de la classe Plat a la varible (plat) la qual teacute un multi-slot drsquoinstagravencies
de la classe Ingredient Imaginem que volem imprimir per pantalla el nom drsquoaquests ingredients (slot nomde la classe Ingredient) Necessitarem iterar sobre la llista drsquoingredients
1 (bind i 1)2 (while (lt= i (length$ (send plat get-ingredients)))3 do4 (bind ingredient (nth$ i (send plat get-ingredients)))5 (printout t (send ingredient get-nom) crlf)6 (bind i (+ i 1))7 )
El megravetode (nth$ ltINDEXgtltLLISTAgt) et retorna lrsquoelement situat a INDEX de LLISTAEl megravetode (length$ ltLLISTAgt) retorna el nuacutemero drsquoelements de LLISTA
3518 Coacutemo modificarinsertarborrar valores en un multislot
Los valores de un multislot se pueden cambiar usando la funcioacuten slot-replace$ La sintaxis es la siguiente
(slot-replace$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt ltvalorgt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3059
35 Las clasesinstancias 27
Donde ltiniciogt y ltfingt son el rango de posiciones del multislot que se quiere modificar y ltvalorgtson los valores que queremos reemplazar Obviamente deberaacute haber tantos valores como posiciones hayamosindicado en el rango
Para insertar nuevos valores podemos usar la funcioacuten slot-insert$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltposgt ltvalorgt)
El valor se inserta delante de la posicioacuten indicada si la posicioacuten es mayor que la longitud del multislot secolocaraacute al final
Para borrar elementos de un multislot podemos usar la funcioacuten slot-delete$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt)
Se borraraacuten los elementos que estaacuten en el rango indicado
3519 Coacutemo recorrer un atributo multievaluado
Supongamos que la variable respuesta tiene una lista de instancias
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 aquiacute hacemos lo que queramos4 )5 )
Loop-for-count funciona como un for primero la variable que haraacute de contador luego el valor de origeny luego el valor final Para controlar el final usamos la funcioacuten que he explicado antes i tomaraacute valoresdesde 1 hasta n asiacute que usando la funcioacuten nth$ obtendremos cada uno de los elementos La variable auxiraacute teniendo cada uno de los valores
3520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz)
Es igual que antes pero con dos bucles
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 (bind aux2 (send aux get-slot_que_queremos))4 (loop-for-count (j 1 (length$ aux2)) do5 (bind aux_final (nth$ j aux2))6 aquiacute ya podemos trabajar con el elemento en concreto7 )8 )
Supongamos que respuesta tiene una lista de instancias con el primer bucle haremos lo mismo que antes ir
iterando por esas instancias Una vez que tenemos cada instancia con aux2 con el segundo bucle iteraremosdentro de sus instancias interiores
Por ejemplo si tenemos varios equipos de fuacutetbol y cada equipo tiene varios jugadores en el primer bucleestamos iterando entre los equipos y en el segundo entre los jugadores de cada equipo en particular
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3159
28 Capiacutetulo 3 CLIPS
3521 Com puc esborrar una instagravencia
Per esborrar una instagravencia (per exemple segons la informacioacute que proporcioni lrsquousuari podem deduir queuna segraverie drsquoinstagravencies eacutes impossible que es facin servir per a la solucioacute) ho podem fer enviant un missatgedelete a la instagravencia eacutes a dir (send ltINSTANCIAgtdelete)
(send inst delete)
Un megravetode que podria ser uacutetil de la cara a la pragravectica podria ser el seguumlent
1 (defrule elimina-instancia2 (declare (salience 10))3 elimina-fact lt- (elimina-inst inst)4 =gt5 (send inst delete)6 (retract elimina-fact)
Imaginem que per exemple que volem eliminar una llista drsquoinstagravencies Per eliminar-les podriacuteem recoacuterrerel llistat marcant les instagravencies que volem esborrar afegint el seguumlent fet
(assert (elimina-instancia inst))
Aixiacute com que elimina-instancia teacute un salience alt esborraria les instagravencies marcades quan tingueacutes ocasioacuteDrsquoaquesta manera ens estalviem el problema de recoacuterrer un llistat drsquoinstagravencies amb un iterador mentre
anem eliminant els elements de la llista cosa que pot donar problemes amb lrsquoiterador
3522 Com imprimir una instagravencia
Per imprimir una classe (uacutetil per exemple per mostrar el resultat final) el millor eacutes definir message-handlersPer exemple imaginem que tenim una classe Plat la qual teacute un slot nom de tipus String Si volgueacutessimimprimir per pantalla un missatge que digueacutes
El nom del plat eacutes ndashltnom del platgtndash
Hauriacuteem de definir un message-handler que simplement imprimiacutes per pantalla el valor de lrsquoslot de laforma
(defmesssage-handler ltCLASSNAMEgt ltMESSAGENAMEgt primary ()ltCODIgt
)
Per el cas de lrsquoexemple
1 (defmessage-handler Plat print primary ()2 (printout t -- selfnom --) )3 )
Per cridar-ho nomeacutes caldragrave enviar-li un missatge a la instagravencia amb el nom del message-handler (enaquest cas print)
(send instancia print)
Un message-handler pot cridar a altres message-handlers amb el que es poden encadenar diverses instagraven-cies Per exemple imaginem que tenim la classe Menuacute la qual teacute un atribut plats que eacutes un llista drsquoinstagravenciesde la classe Plat Dintre del message-handler menuacute podriacuteem iterar a traveacutes de la llista de plats enviant elmissatge print que hem definit anteriorment
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3259
36 Programacioacuten 29
3523 Com es navega entre instagravencies relacionades
Per exemple tinc una instagravencia iA que teacute un slot anomenat slotB que eacutes una instagravencia drsquoun frame B Vullsaber el nom de la instagravencia associada al slotB de iA Ho pots fer aixiacute
(bind B (send iA get-slotB))(bind res (send B get-nom))
Si estagraves dins drsquouna condicioacute ho pots simplificar de la forma seguumlent
(bind res (send iAslotB get-nom)
Els dos punts soacuten equivalents al punt de Java
36 Programacioacuten
361 Com introduir un comentari
Els comentaris a CLIPS va darrere de un com per exemple
Comentari
Tambeacute podem afegir comentaris a les nostres regles deffacts deftemplates etc Generalment van darrereel nom de la estructura per exemple
1 (defrule neteja regla per la qual si la cuina estagrave bruta srsquoafegiragrave una tasca de2 neteja
3 (estat-cuina bruta)4 =gt5 (assert (tasca netejar))6 )
362 Referenciar el valor null a CLIPS
Per referenciar el valor null a clips es fa amb el simbol nil Per exemple si volem saber si una instagravenciainst es null ho podriacuteem fer de la seguumlent manera
(eq inst nil)
363 Formas de recorrer una lista
Para recorrer una lista disponemos de diferentes opciones en este FAQ explicaremos como crear unaestructura tipo ldquoWHILErdquo y tipo ldquoFORrdquo
1 While Esta regla se ejecuta hasta que la expresioacuten a evaluar sea falsa Este tipo de estructura se rigepor seguir la sintaxis while - do y se construiriacutea de la siguiente forma
(while ltexpresioacutengt[do] ltaccioacutengt)
Doacutende dependiendo del valor de ltexpresioacutengt
Valor TRUE Se realizaraacute la accioacuten ltaccioacutengt i se volveraacute a evaluar ltexpresioacutengt
Valor FALSE No se ejecutaraacute la accioacuten ltaccioacutengt
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3359
30 Capiacutetulo 3 CLIPS
2 For Esta regla sirve para ejecutar un bucle N (final - inicio) veces Este tipo de estructura se rige porseguir la sintaxis loop-for-count y se construiriacutea de la siguiente forma
(loop-for-count (ltvargtltiniciogtltfinalgt) [do] ltaccioacutengt)
Doacutende
ltvargt Variable que se usara como iacutendice
ltiniciogt Valor inicial que tendraacute ltvargt
ltfinalgt Ultimo valor que tendraacute la variable ltvargt
ltaccioacutengt Accioacuten que es realizaraacute hasta que ltvargt tenga el valor de ltfingt
364 Formas de elegir una opcioacuten
En este apartado explicaremos como crear una estructura if y una estructura switch
If Este tipo de estructura se rige por seguir la sintaxis if - then - else y se construiriacutea de lasiguiente forma
(if ltexpresioacutengtthen ltaccioacutengt[else ltaccioacuten2gt])
Doacutende dependiendo del valor de ltexpresioacutengt
bull Valor TRUE Se realizaraacute la accioacuten ltaccioacutengtbull Valor FALSE Se realizaraacute la accioacuten ltaccioacuten2gt (en caso de haber)
Switch Este tipo de estructura se rige por seguir la sintaxis switch - opciones y se construiriacutea dela siguiente forma
(switch ltexpresioacuten-testgt(case OPCION1 then ACCION1)(case OPCION2 then ACCION2)
([default] ACCION-DEFAULT)
)
Doacutende dependiendo del valor de ltexpresioacuten-casegt se ejecutaraacute una ltaccioacutengt en particular Si nin-guna ltopcioacutengt es correcta se ejecutara la ltaccioacuten-defaultgt
365 Funciones con la clase String
Habitualmente trabajaremos con Strings o cadena de Strings CLIPS proporciona una serie de herramien-tas para trabajar con esta clase
1 Convertir string a MAYUacuteSCULAS A veces es conveniente tener todos los caracteres en mayuacutesculaspara no tener problemas de comparaciones o simplemente por convenio Para ello CLIPS dispone dela funcioacuten upcase la cual convierte a mayuacutesculas un siacutembolo o string
(upcase ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplos
(upcase Ccedillips es divertido) rarr CcedilLIPS ES DIVERTIDO
(upcase Clips_es_divertido) rarr CLIPS_ES_DIVERTIDO
2 Convertir string a MINUacuteSCULAS la funcioacuten es downcase
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3459
36 Programacioacuten 31
3 Concatenacioacuten de strings Tambieacuten es de gran utilidad poder juntar dos o maacutes paraacutemetros en un solostring Todo paraacutemetro a juntar deben ser de uno de los siguientes tipos symbol String integer floato instance-name
(str-cat parametro1 parametro2 parametroN )
Ejemplo
(str-cat IA nota 10) rarr IAnota10
4 Comparacioacuten de strings Funcioacuten que nos indica si dos strings son iguales
(str-compareltexpresioacuten-simboacutelica-o-de-cadenagtltexpresioacuten-simboacutelica-o-de-cadenagt
)
Esta funcioacuten devuelve
0 Si ambos strings son iguales1 Si el primer string es mayor que el segundo string-1 Si el primer string es menor que el segundo string
5 Longitud de un string Muchas veces es de gran utilidad saber que tamantildeo tiene un string
(str-length ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplo
(str-length Inteligencia Artificial) rarr 23
366 iquestCoacutemo obtener el contenido de una variable en un string
Para conseguir un string a partir de un integer float symbol instance-name debes utilizar el comandostr-cat Si a la funcioacuten le pasamos como paraacutemetros varios elementos los transformaraacute a string y losconcatenaraacute La sintaxis de esta funcioacuten es la siguiente (str-cat elementos) Esta funcioacuten la usaremossobre todo cuando queramos realizar comparaciones entre el contenido de una variable y un string ya quepreviamente necesitaremos usar la funcioacuten str-cat para pasar el contenido de la variable a string y realizarde este modo la comparacioacuten de forma correcta
367 iquestComo se crea una lista
Con create$ Todos los operadores sobre listas llevan el siacutembolo $ al final Igual que con las variables sedebe usar bind siempre que se desee modificar una lista
(bind lista (create$ a b c))
368 iquestComo borro un elemento de una lista
Con delete$Usa la siguiente sintaxis(delete$ ltlistagt ltindice-iniciogt ltindice-finalgt)Se borraraacuten todos los elementos del rango entre las posiciones inicio y final ambas incluidas Tambieacuten exis-
tedelete-member$ (delete-member$ ltlistagt ltelementogt) Borraraacute todas las apariciones del elemento enla lista
(delete$ (create$ a b c d e f) 3 5) minusrarr (a b f)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 2959
26 Capiacutetulo 3 CLIPS
3515 Obtenir el nom drsquouna classe
Si tenim una instagravencia drsquouna classe i volem saber el nom de la classe (uacutetil si tenim una bona taxonomiade classes) ho podem fer amb el megravetode (class ltINSTANCIAgt)
Si per exemple imaginem que tenim la classe Actor la qual teacute com subclasses la classe APrincipalASecundari i ACameo Imaginem que estem tractant amb instancies drsquoactors i volem saber si la instanciaque estem tractant es de la classe APrincipal
Ho hauriacuteem de fer de la seguumlent manera
(eq (class instancia) APrincipal)
Fixem-nos que APrincipal eacutes un siacutembol no un String (un truco eacutes fixar-se en que no teacute cometes) Si vol-gueacutessim comparar-ho amb un String (per exemple un String introduiumlt per lrsquousuari) ho podriacuteem transformara un String amb el megravetode str-cat
(eq (str-cat (class instancia)) Principal)
3516 Como convierto un INSTANCE-ADRESS en un INSTANCE-NAME
En alguacuten momento nos podemos encontrar con la situacioacuten de que disponemos de un puntero a unainstancia y necesitamos su nombre o lo contrario En ambos casos podemos usar la funcioacuten instance-nameSu funcionamiento es bidireccional podemos introducirle un instance-name y nos devolveraacute un instance-adress y viceversa
1 (defrule imprimir-nombre2 estlt-(object (is-a Estudiante) (edad 25))3 =gt4 (printout t (instance-name est) crlf)5
)
3517 Com iterar a traveacutes drsquoun multi-slot
El seguumlent tambeacute eacutes vagravelid com exemple de com iterar a traveacutes drsquouna llistaImaginem que tenim una instagravencia de la classe Plat a la varible (plat) la qual teacute un multi-slot drsquoinstagravencies
de la classe Ingredient Imaginem que volem imprimir per pantalla el nom drsquoaquests ingredients (slot nomde la classe Ingredient) Necessitarem iterar sobre la llista drsquoingredients
1 (bind i 1)2 (while (lt= i (length$ (send plat get-ingredients)))3 do4 (bind ingredient (nth$ i (send plat get-ingredients)))5 (printout t (send ingredient get-nom) crlf)6 (bind i (+ i 1))7 )
El megravetode (nth$ ltINDEXgtltLLISTAgt) et retorna lrsquoelement situat a INDEX de LLISTAEl megravetode (length$ ltLLISTAgt) retorna el nuacutemero drsquoelements de LLISTA
3518 Coacutemo modificarinsertarborrar valores en un multislot
Los valores de un multislot se pueden cambiar usando la funcioacuten slot-replace$ La sintaxis es la siguiente
(slot-replace$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt ltvalorgt)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3059
35 Las clasesinstancias 27
Donde ltiniciogt y ltfingt son el rango de posiciones del multislot que se quiere modificar y ltvalorgtson los valores que queremos reemplazar Obviamente deberaacute haber tantos valores como posiciones hayamosindicado en el rango
Para insertar nuevos valores podemos usar la funcioacuten slot-insert$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltposgt ltvalorgt)
El valor se inserta delante de la posicioacuten indicada si la posicioacuten es mayor que la longitud del multislot secolocaraacute al final
Para borrar elementos de un multislot podemos usar la funcioacuten slot-delete$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt)
Se borraraacuten los elementos que estaacuten en el rango indicado
3519 Coacutemo recorrer un atributo multievaluado
Supongamos que la variable respuesta tiene una lista de instancias
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 aquiacute hacemos lo que queramos4 )5 )
Loop-for-count funciona como un for primero la variable que haraacute de contador luego el valor de origeny luego el valor final Para controlar el final usamos la funcioacuten que he explicado antes i tomaraacute valoresdesde 1 hasta n asiacute que usando la funcioacuten nth$ obtendremos cada uno de los elementos La variable auxiraacute teniendo cada uno de los valores
3520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz)
Es igual que antes pero con dos bucles
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 (bind aux2 (send aux get-slot_que_queremos))4 (loop-for-count (j 1 (length$ aux2)) do5 (bind aux_final (nth$ j aux2))6 aquiacute ya podemos trabajar con el elemento en concreto7 )8 )
Supongamos que respuesta tiene una lista de instancias con el primer bucle haremos lo mismo que antes ir
iterando por esas instancias Una vez que tenemos cada instancia con aux2 con el segundo bucle iteraremosdentro de sus instancias interiores
Por ejemplo si tenemos varios equipos de fuacutetbol y cada equipo tiene varios jugadores en el primer bucleestamos iterando entre los equipos y en el segundo entre los jugadores de cada equipo en particular
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3159
28 Capiacutetulo 3 CLIPS
3521 Com puc esborrar una instagravencia
Per esborrar una instagravencia (per exemple segons la informacioacute que proporcioni lrsquousuari podem deduir queuna segraverie drsquoinstagravencies eacutes impossible que es facin servir per a la solucioacute) ho podem fer enviant un missatgedelete a la instagravencia eacutes a dir (send ltINSTANCIAgtdelete)
(send inst delete)
Un megravetode que podria ser uacutetil de la cara a la pragravectica podria ser el seguumlent
1 (defrule elimina-instancia2 (declare (salience 10))3 elimina-fact lt- (elimina-inst inst)4 =gt5 (send inst delete)6 (retract elimina-fact)
Imaginem que per exemple que volem eliminar una llista drsquoinstagravencies Per eliminar-les podriacuteem recoacuterrerel llistat marcant les instagravencies que volem esborrar afegint el seguumlent fet
(assert (elimina-instancia inst))
Aixiacute com que elimina-instancia teacute un salience alt esborraria les instagravencies marcades quan tingueacutes ocasioacuteDrsquoaquesta manera ens estalviem el problema de recoacuterrer un llistat drsquoinstagravencies amb un iterador mentre
anem eliminant els elements de la llista cosa que pot donar problemes amb lrsquoiterador
3522 Com imprimir una instagravencia
Per imprimir una classe (uacutetil per exemple per mostrar el resultat final) el millor eacutes definir message-handlersPer exemple imaginem que tenim una classe Plat la qual teacute un slot nom de tipus String Si volgueacutessimimprimir per pantalla un missatge que digueacutes
El nom del plat eacutes ndashltnom del platgtndash
Hauriacuteem de definir un message-handler que simplement imprimiacutes per pantalla el valor de lrsquoslot de laforma
(defmesssage-handler ltCLASSNAMEgt ltMESSAGENAMEgt primary ()ltCODIgt
)
Per el cas de lrsquoexemple
1 (defmessage-handler Plat print primary ()2 (printout t -- selfnom --) )3 )
Per cridar-ho nomeacutes caldragrave enviar-li un missatge a la instagravencia amb el nom del message-handler (enaquest cas print)
(send instancia print)
Un message-handler pot cridar a altres message-handlers amb el que es poden encadenar diverses instagraven-cies Per exemple imaginem que tenim la classe Menuacute la qual teacute un atribut plats que eacutes un llista drsquoinstagravenciesde la classe Plat Dintre del message-handler menuacute podriacuteem iterar a traveacutes de la llista de plats enviant elmissatge print que hem definit anteriorment
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3259
36 Programacioacuten 29
3523 Com es navega entre instagravencies relacionades
Per exemple tinc una instagravencia iA que teacute un slot anomenat slotB que eacutes una instagravencia drsquoun frame B Vullsaber el nom de la instagravencia associada al slotB de iA Ho pots fer aixiacute
(bind B (send iA get-slotB))(bind res (send B get-nom))
Si estagraves dins drsquouna condicioacute ho pots simplificar de la forma seguumlent
(bind res (send iAslotB get-nom)
Els dos punts soacuten equivalents al punt de Java
36 Programacioacuten
361 Com introduir un comentari
Els comentaris a CLIPS va darrere de un com per exemple
Comentari
Tambeacute podem afegir comentaris a les nostres regles deffacts deftemplates etc Generalment van darrereel nom de la estructura per exemple
1 (defrule neteja regla per la qual si la cuina estagrave bruta srsquoafegiragrave una tasca de2 neteja
3 (estat-cuina bruta)4 =gt5 (assert (tasca netejar))6 )
362 Referenciar el valor null a CLIPS
Per referenciar el valor null a clips es fa amb el simbol nil Per exemple si volem saber si una instagravenciainst es null ho podriacuteem fer de la seguumlent manera
(eq inst nil)
363 Formas de recorrer una lista
Para recorrer una lista disponemos de diferentes opciones en este FAQ explicaremos como crear unaestructura tipo ldquoWHILErdquo y tipo ldquoFORrdquo
1 While Esta regla se ejecuta hasta que la expresioacuten a evaluar sea falsa Este tipo de estructura se rigepor seguir la sintaxis while - do y se construiriacutea de la siguiente forma
(while ltexpresioacutengt[do] ltaccioacutengt)
Doacutende dependiendo del valor de ltexpresioacutengt
Valor TRUE Se realizaraacute la accioacuten ltaccioacutengt i se volveraacute a evaluar ltexpresioacutengt
Valor FALSE No se ejecutaraacute la accioacuten ltaccioacutengt
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3359
30 Capiacutetulo 3 CLIPS
2 For Esta regla sirve para ejecutar un bucle N (final - inicio) veces Este tipo de estructura se rige porseguir la sintaxis loop-for-count y se construiriacutea de la siguiente forma
(loop-for-count (ltvargtltiniciogtltfinalgt) [do] ltaccioacutengt)
Doacutende
ltvargt Variable que se usara como iacutendice
ltiniciogt Valor inicial que tendraacute ltvargt
ltfinalgt Ultimo valor que tendraacute la variable ltvargt
ltaccioacutengt Accioacuten que es realizaraacute hasta que ltvargt tenga el valor de ltfingt
364 Formas de elegir una opcioacuten
En este apartado explicaremos como crear una estructura if y una estructura switch
If Este tipo de estructura se rige por seguir la sintaxis if - then - else y se construiriacutea de lasiguiente forma
(if ltexpresioacutengtthen ltaccioacutengt[else ltaccioacuten2gt])
Doacutende dependiendo del valor de ltexpresioacutengt
bull Valor TRUE Se realizaraacute la accioacuten ltaccioacutengtbull Valor FALSE Se realizaraacute la accioacuten ltaccioacuten2gt (en caso de haber)
Switch Este tipo de estructura se rige por seguir la sintaxis switch - opciones y se construiriacutea dela siguiente forma
(switch ltexpresioacuten-testgt(case OPCION1 then ACCION1)(case OPCION2 then ACCION2)
([default] ACCION-DEFAULT)
)
Doacutende dependiendo del valor de ltexpresioacuten-casegt se ejecutaraacute una ltaccioacutengt en particular Si nin-guna ltopcioacutengt es correcta se ejecutara la ltaccioacuten-defaultgt
365 Funciones con la clase String
Habitualmente trabajaremos con Strings o cadena de Strings CLIPS proporciona una serie de herramien-tas para trabajar con esta clase
1 Convertir string a MAYUacuteSCULAS A veces es conveniente tener todos los caracteres en mayuacutesculaspara no tener problemas de comparaciones o simplemente por convenio Para ello CLIPS dispone dela funcioacuten upcase la cual convierte a mayuacutesculas un siacutembolo o string
(upcase ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplos
(upcase Ccedillips es divertido) rarr CcedilLIPS ES DIVERTIDO
(upcase Clips_es_divertido) rarr CLIPS_ES_DIVERTIDO
2 Convertir string a MINUacuteSCULAS la funcioacuten es downcase
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3459
36 Programacioacuten 31
3 Concatenacioacuten de strings Tambieacuten es de gran utilidad poder juntar dos o maacutes paraacutemetros en un solostring Todo paraacutemetro a juntar deben ser de uno de los siguientes tipos symbol String integer floato instance-name
(str-cat parametro1 parametro2 parametroN )
Ejemplo
(str-cat IA nota 10) rarr IAnota10
4 Comparacioacuten de strings Funcioacuten que nos indica si dos strings son iguales
(str-compareltexpresioacuten-simboacutelica-o-de-cadenagtltexpresioacuten-simboacutelica-o-de-cadenagt
)
Esta funcioacuten devuelve
0 Si ambos strings son iguales1 Si el primer string es mayor que el segundo string-1 Si el primer string es menor que el segundo string
5 Longitud de un string Muchas veces es de gran utilidad saber que tamantildeo tiene un string
(str-length ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplo
(str-length Inteligencia Artificial) rarr 23
366 iquestCoacutemo obtener el contenido de una variable en un string
Para conseguir un string a partir de un integer float symbol instance-name debes utilizar el comandostr-cat Si a la funcioacuten le pasamos como paraacutemetros varios elementos los transformaraacute a string y losconcatenaraacute La sintaxis de esta funcioacuten es la siguiente (str-cat elementos) Esta funcioacuten la usaremossobre todo cuando queramos realizar comparaciones entre el contenido de una variable y un string ya quepreviamente necesitaremos usar la funcioacuten str-cat para pasar el contenido de la variable a string y realizarde este modo la comparacioacuten de forma correcta
367 iquestComo se crea una lista
Con create$ Todos los operadores sobre listas llevan el siacutembolo $ al final Igual que con las variables sedebe usar bind siempre que se desee modificar una lista
(bind lista (create$ a b c))
368 iquestComo borro un elemento de una lista
Con delete$Usa la siguiente sintaxis(delete$ ltlistagt ltindice-iniciogt ltindice-finalgt)Se borraraacuten todos los elementos del rango entre las posiciones inicio y final ambas incluidas Tambieacuten exis-
tedelete-member$ (delete-member$ ltlistagt ltelementogt) Borraraacute todas las apariciones del elemento enla lista
(delete$ (create$ a b c d e f) 3 5) minusrarr (a b f)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3059
35 Las clasesinstancias 27
Donde ltiniciogt y ltfingt son el rango de posiciones del multislot que se quiere modificar y ltvalorgtson los valores que queremos reemplazar Obviamente deberaacute haber tantos valores como posiciones hayamosindicado en el rango
Para insertar nuevos valores podemos usar la funcioacuten slot-insert$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltposgt ltvalorgt)
El valor se inserta delante de la posicioacuten indicada si la posicioacuten es mayor que la longitud del multislot secolocaraacute al final
Para borrar elementos de un multislot podemos usar la funcioacuten slot-delete$ La sintaxis es la siguiente
(slot-insert$ ltnom-instanciagt ltnom-multislotgt ltiniciogt ltfingt)
Se borraraacuten los elementos que estaacuten en el rango indicado
3519 Coacutemo recorrer un atributo multievaluado
Supongamos que la variable respuesta tiene una lista de instancias
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 aquiacute hacemos lo que queramos4 )5 )
Loop-for-count funciona como un for primero la variable que haraacute de contador luego el valor de origeny luego el valor final Para controlar el final usamos la funcioacuten que he explicado antes i tomaraacute valoresdesde 1 hasta n asiacute que usando la funcioacuten nth$ obtendremos cada uno de los elementos La variable auxiraacute teniendo cada uno de los valores
3520 Coacutemo recorrer un atributo multievaluado de un atributo multievaluado (una matriz)
Es igual que antes pero con dos bucles
1 (loop-for-count (i 1 (length$ respuesta)) do2 (bind aux (nth$ i respuesta))3 (bind aux2 (send aux get-slot_que_queremos))4 (loop-for-count (j 1 (length$ aux2)) do5 (bind aux_final (nth$ j aux2))6 aquiacute ya podemos trabajar con el elemento en concreto7 )8 )
Supongamos que respuesta tiene una lista de instancias con el primer bucle haremos lo mismo que antes ir
iterando por esas instancias Una vez que tenemos cada instancia con aux2 con el segundo bucle iteraremosdentro de sus instancias interiores
Por ejemplo si tenemos varios equipos de fuacutetbol y cada equipo tiene varios jugadores en el primer bucleestamos iterando entre los equipos y en el segundo entre los jugadores de cada equipo en particular
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3159
28 Capiacutetulo 3 CLIPS
3521 Com puc esborrar una instagravencia
Per esborrar una instagravencia (per exemple segons la informacioacute que proporcioni lrsquousuari podem deduir queuna segraverie drsquoinstagravencies eacutes impossible que es facin servir per a la solucioacute) ho podem fer enviant un missatgedelete a la instagravencia eacutes a dir (send ltINSTANCIAgtdelete)
(send inst delete)
Un megravetode que podria ser uacutetil de la cara a la pragravectica podria ser el seguumlent
1 (defrule elimina-instancia2 (declare (salience 10))3 elimina-fact lt- (elimina-inst inst)4 =gt5 (send inst delete)6 (retract elimina-fact)
Imaginem que per exemple que volem eliminar una llista drsquoinstagravencies Per eliminar-les podriacuteem recoacuterrerel llistat marcant les instagravencies que volem esborrar afegint el seguumlent fet
(assert (elimina-instancia inst))
Aixiacute com que elimina-instancia teacute un salience alt esborraria les instagravencies marcades quan tingueacutes ocasioacuteDrsquoaquesta manera ens estalviem el problema de recoacuterrer un llistat drsquoinstagravencies amb un iterador mentre
anem eliminant els elements de la llista cosa que pot donar problemes amb lrsquoiterador
3522 Com imprimir una instagravencia
Per imprimir una classe (uacutetil per exemple per mostrar el resultat final) el millor eacutes definir message-handlersPer exemple imaginem que tenim una classe Plat la qual teacute un slot nom de tipus String Si volgueacutessimimprimir per pantalla un missatge que digueacutes
El nom del plat eacutes ndashltnom del platgtndash
Hauriacuteem de definir un message-handler que simplement imprimiacutes per pantalla el valor de lrsquoslot de laforma
(defmesssage-handler ltCLASSNAMEgt ltMESSAGENAMEgt primary ()ltCODIgt
)
Per el cas de lrsquoexemple
1 (defmessage-handler Plat print primary ()2 (printout t -- selfnom --) )3 )
Per cridar-ho nomeacutes caldragrave enviar-li un missatge a la instagravencia amb el nom del message-handler (enaquest cas print)
(send instancia print)
Un message-handler pot cridar a altres message-handlers amb el que es poden encadenar diverses instagraven-cies Per exemple imaginem que tenim la classe Menuacute la qual teacute un atribut plats que eacutes un llista drsquoinstagravenciesde la classe Plat Dintre del message-handler menuacute podriacuteem iterar a traveacutes de la llista de plats enviant elmissatge print que hem definit anteriorment
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3259
36 Programacioacuten 29
3523 Com es navega entre instagravencies relacionades
Per exemple tinc una instagravencia iA que teacute un slot anomenat slotB que eacutes una instagravencia drsquoun frame B Vullsaber el nom de la instagravencia associada al slotB de iA Ho pots fer aixiacute
(bind B (send iA get-slotB))(bind res (send B get-nom))
Si estagraves dins drsquouna condicioacute ho pots simplificar de la forma seguumlent
(bind res (send iAslotB get-nom)
Els dos punts soacuten equivalents al punt de Java
36 Programacioacuten
361 Com introduir un comentari
Els comentaris a CLIPS va darrere de un com per exemple
Comentari
Tambeacute podem afegir comentaris a les nostres regles deffacts deftemplates etc Generalment van darrereel nom de la estructura per exemple
1 (defrule neteja regla per la qual si la cuina estagrave bruta srsquoafegiragrave una tasca de2 neteja
3 (estat-cuina bruta)4 =gt5 (assert (tasca netejar))6 )
362 Referenciar el valor null a CLIPS
Per referenciar el valor null a clips es fa amb el simbol nil Per exemple si volem saber si una instagravenciainst es null ho podriacuteem fer de la seguumlent manera
(eq inst nil)
363 Formas de recorrer una lista
Para recorrer una lista disponemos de diferentes opciones en este FAQ explicaremos como crear unaestructura tipo ldquoWHILErdquo y tipo ldquoFORrdquo
1 While Esta regla se ejecuta hasta que la expresioacuten a evaluar sea falsa Este tipo de estructura se rigepor seguir la sintaxis while - do y se construiriacutea de la siguiente forma
(while ltexpresioacutengt[do] ltaccioacutengt)
Doacutende dependiendo del valor de ltexpresioacutengt
Valor TRUE Se realizaraacute la accioacuten ltaccioacutengt i se volveraacute a evaluar ltexpresioacutengt
Valor FALSE No se ejecutaraacute la accioacuten ltaccioacutengt
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3359
30 Capiacutetulo 3 CLIPS
2 For Esta regla sirve para ejecutar un bucle N (final - inicio) veces Este tipo de estructura se rige porseguir la sintaxis loop-for-count y se construiriacutea de la siguiente forma
(loop-for-count (ltvargtltiniciogtltfinalgt) [do] ltaccioacutengt)
Doacutende
ltvargt Variable que se usara como iacutendice
ltiniciogt Valor inicial que tendraacute ltvargt
ltfinalgt Ultimo valor que tendraacute la variable ltvargt
ltaccioacutengt Accioacuten que es realizaraacute hasta que ltvargt tenga el valor de ltfingt
364 Formas de elegir una opcioacuten
En este apartado explicaremos como crear una estructura if y una estructura switch
If Este tipo de estructura se rige por seguir la sintaxis if - then - else y se construiriacutea de lasiguiente forma
(if ltexpresioacutengtthen ltaccioacutengt[else ltaccioacuten2gt])
Doacutende dependiendo del valor de ltexpresioacutengt
bull Valor TRUE Se realizaraacute la accioacuten ltaccioacutengtbull Valor FALSE Se realizaraacute la accioacuten ltaccioacuten2gt (en caso de haber)
Switch Este tipo de estructura se rige por seguir la sintaxis switch - opciones y se construiriacutea dela siguiente forma
(switch ltexpresioacuten-testgt(case OPCION1 then ACCION1)(case OPCION2 then ACCION2)
([default] ACCION-DEFAULT)
)
Doacutende dependiendo del valor de ltexpresioacuten-casegt se ejecutaraacute una ltaccioacutengt en particular Si nin-guna ltopcioacutengt es correcta se ejecutara la ltaccioacuten-defaultgt
365 Funciones con la clase String
Habitualmente trabajaremos con Strings o cadena de Strings CLIPS proporciona una serie de herramien-tas para trabajar con esta clase
1 Convertir string a MAYUacuteSCULAS A veces es conveniente tener todos los caracteres en mayuacutesculaspara no tener problemas de comparaciones o simplemente por convenio Para ello CLIPS dispone dela funcioacuten upcase la cual convierte a mayuacutesculas un siacutembolo o string
(upcase ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplos
(upcase Ccedillips es divertido) rarr CcedilLIPS ES DIVERTIDO
(upcase Clips_es_divertido) rarr CLIPS_ES_DIVERTIDO
2 Convertir string a MINUacuteSCULAS la funcioacuten es downcase
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3459
36 Programacioacuten 31
3 Concatenacioacuten de strings Tambieacuten es de gran utilidad poder juntar dos o maacutes paraacutemetros en un solostring Todo paraacutemetro a juntar deben ser de uno de los siguientes tipos symbol String integer floato instance-name
(str-cat parametro1 parametro2 parametroN )
Ejemplo
(str-cat IA nota 10) rarr IAnota10
4 Comparacioacuten de strings Funcioacuten que nos indica si dos strings son iguales
(str-compareltexpresioacuten-simboacutelica-o-de-cadenagtltexpresioacuten-simboacutelica-o-de-cadenagt
)
Esta funcioacuten devuelve
0 Si ambos strings son iguales1 Si el primer string es mayor que el segundo string-1 Si el primer string es menor que el segundo string
5 Longitud de un string Muchas veces es de gran utilidad saber que tamantildeo tiene un string
(str-length ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplo
(str-length Inteligencia Artificial) rarr 23
366 iquestCoacutemo obtener el contenido de una variable en un string
Para conseguir un string a partir de un integer float symbol instance-name debes utilizar el comandostr-cat Si a la funcioacuten le pasamos como paraacutemetros varios elementos los transformaraacute a string y losconcatenaraacute La sintaxis de esta funcioacuten es la siguiente (str-cat elementos) Esta funcioacuten la usaremossobre todo cuando queramos realizar comparaciones entre el contenido de una variable y un string ya quepreviamente necesitaremos usar la funcioacuten str-cat para pasar el contenido de la variable a string y realizarde este modo la comparacioacuten de forma correcta
367 iquestComo se crea una lista
Con create$ Todos los operadores sobre listas llevan el siacutembolo $ al final Igual que con las variables sedebe usar bind siempre que se desee modificar una lista
(bind lista (create$ a b c))
368 iquestComo borro un elemento de una lista
Con delete$Usa la siguiente sintaxis(delete$ ltlistagt ltindice-iniciogt ltindice-finalgt)Se borraraacuten todos los elementos del rango entre las posiciones inicio y final ambas incluidas Tambieacuten exis-
tedelete-member$ (delete-member$ ltlistagt ltelementogt) Borraraacute todas las apariciones del elemento enla lista
(delete$ (create$ a b c d e f) 3 5) minusrarr (a b f)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3159
28 Capiacutetulo 3 CLIPS
3521 Com puc esborrar una instagravencia
Per esborrar una instagravencia (per exemple segons la informacioacute que proporcioni lrsquousuari podem deduir queuna segraverie drsquoinstagravencies eacutes impossible que es facin servir per a la solucioacute) ho podem fer enviant un missatgedelete a la instagravencia eacutes a dir (send ltINSTANCIAgtdelete)
(send inst delete)
Un megravetode que podria ser uacutetil de la cara a la pragravectica podria ser el seguumlent
1 (defrule elimina-instancia2 (declare (salience 10))3 elimina-fact lt- (elimina-inst inst)4 =gt5 (send inst delete)6 (retract elimina-fact)
Imaginem que per exemple que volem eliminar una llista drsquoinstagravencies Per eliminar-les podriacuteem recoacuterrerel llistat marcant les instagravencies que volem esborrar afegint el seguumlent fet
(assert (elimina-instancia inst))
Aixiacute com que elimina-instancia teacute un salience alt esborraria les instagravencies marcades quan tingueacutes ocasioacuteDrsquoaquesta manera ens estalviem el problema de recoacuterrer un llistat drsquoinstagravencies amb un iterador mentre
anem eliminant els elements de la llista cosa que pot donar problemes amb lrsquoiterador
3522 Com imprimir una instagravencia
Per imprimir una classe (uacutetil per exemple per mostrar el resultat final) el millor eacutes definir message-handlersPer exemple imaginem que tenim una classe Plat la qual teacute un slot nom de tipus String Si volgueacutessimimprimir per pantalla un missatge que digueacutes
El nom del plat eacutes ndashltnom del platgtndash
Hauriacuteem de definir un message-handler que simplement imprimiacutes per pantalla el valor de lrsquoslot de laforma
(defmesssage-handler ltCLASSNAMEgt ltMESSAGENAMEgt primary ()ltCODIgt
)
Per el cas de lrsquoexemple
1 (defmessage-handler Plat print primary ()2 (printout t -- selfnom --) )3 )
Per cridar-ho nomeacutes caldragrave enviar-li un missatge a la instagravencia amb el nom del message-handler (enaquest cas print)
(send instancia print)
Un message-handler pot cridar a altres message-handlers amb el que es poden encadenar diverses instagraven-cies Per exemple imaginem que tenim la classe Menuacute la qual teacute un atribut plats que eacutes un llista drsquoinstagravenciesde la classe Plat Dintre del message-handler menuacute podriacuteem iterar a traveacutes de la llista de plats enviant elmissatge print que hem definit anteriorment
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3259
36 Programacioacuten 29
3523 Com es navega entre instagravencies relacionades
Per exemple tinc una instagravencia iA que teacute un slot anomenat slotB que eacutes una instagravencia drsquoun frame B Vullsaber el nom de la instagravencia associada al slotB de iA Ho pots fer aixiacute
(bind B (send iA get-slotB))(bind res (send B get-nom))
Si estagraves dins drsquouna condicioacute ho pots simplificar de la forma seguumlent
(bind res (send iAslotB get-nom)
Els dos punts soacuten equivalents al punt de Java
36 Programacioacuten
361 Com introduir un comentari
Els comentaris a CLIPS va darrere de un com per exemple
Comentari
Tambeacute podem afegir comentaris a les nostres regles deffacts deftemplates etc Generalment van darrereel nom de la estructura per exemple
1 (defrule neteja regla per la qual si la cuina estagrave bruta srsquoafegiragrave una tasca de2 neteja
3 (estat-cuina bruta)4 =gt5 (assert (tasca netejar))6 )
362 Referenciar el valor null a CLIPS
Per referenciar el valor null a clips es fa amb el simbol nil Per exemple si volem saber si una instagravenciainst es null ho podriacuteem fer de la seguumlent manera
(eq inst nil)
363 Formas de recorrer una lista
Para recorrer una lista disponemos de diferentes opciones en este FAQ explicaremos como crear unaestructura tipo ldquoWHILErdquo y tipo ldquoFORrdquo
1 While Esta regla se ejecuta hasta que la expresioacuten a evaluar sea falsa Este tipo de estructura se rigepor seguir la sintaxis while - do y se construiriacutea de la siguiente forma
(while ltexpresioacutengt[do] ltaccioacutengt)
Doacutende dependiendo del valor de ltexpresioacutengt
Valor TRUE Se realizaraacute la accioacuten ltaccioacutengt i se volveraacute a evaluar ltexpresioacutengt
Valor FALSE No se ejecutaraacute la accioacuten ltaccioacutengt
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3359
30 Capiacutetulo 3 CLIPS
2 For Esta regla sirve para ejecutar un bucle N (final - inicio) veces Este tipo de estructura se rige porseguir la sintaxis loop-for-count y se construiriacutea de la siguiente forma
(loop-for-count (ltvargtltiniciogtltfinalgt) [do] ltaccioacutengt)
Doacutende
ltvargt Variable que se usara como iacutendice
ltiniciogt Valor inicial que tendraacute ltvargt
ltfinalgt Ultimo valor que tendraacute la variable ltvargt
ltaccioacutengt Accioacuten que es realizaraacute hasta que ltvargt tenga el valor de ltfingt
364 Formas de elegir una opcioacuten
En este apartado explicaremos como crear una estructura if y una estructura switch
If Este tipo de estructura se rige por seguir la sintaxis if - then - else y se construiriacutea de lasiguiente forma
(if ltexpresioacutengtthen ltaccioacutengt[else ltaccioacuten2gt])
Doacutende dependiendo del valor de ltexpresioacutengt
bull Valor TRUE Se realizaraacute la accioacuten ltaccioacutengtbull Valor FALSE Se realizaraacute la accioacuten ltaccioacuten2gt (en caso de haber)
Switch Este tipo de estructura se rige por seguir la sintaxis switch - opciones y se construiriacutea dela siguiente forma
(switch ltexpresioacuten-testgt(case OPCION1 then ACCION1)(case OPCION2 then ACCION2)
([default] ACCION-DEFAULT)
)
Doacutende dependiendo del valor de ltexpresioacuten-casegt se ejecutaraacute una ltaccioacutengt en particular Si nin-guna ltopcioacutengt es correcta se ejecutara la ltaccioacuten-defaultgt
365 Funciones con la clase String
Habitualmente trabajaremos con Strings o cadena de Strings CLIPS proporciona una serie de herramien-tas para trabajar con esta clase
1 Convertir string a MAYUacuteSCULAS A veces es conveniente tener todos los caracteres en mayuacutesculaspara no tener problemas de comparaciones o simplemente por convenio Para ello CLIPS dispone dela funcioacuten upcase la cual convierte a mayuacutesculas un siacutembolo o string
(upcase ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplos
(upcase Ccedillips es divertido) rarr CcedilLIPS ES DIVERTIDO
(upcase Clips_es_divertido) rarr CLIPS_ES_DIVERTIDO
2 Convertir string a MINUacuteSCULAS la funcioacuten es downcase
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3459
36 Programacioacuten 31
3 Concatenacioacuten de strings Tambieacuten es de gran utilidad poder juntar dos o maacutes paraacutemetros en un solostring Todo paraacutemetro a juntar deben ser de uno de los siguientes tipos symbol String integer floato instance-name
(str-cat parametro1 parametro2 parametroN )
Ejemplo
(str-cat IA nota 10) rarr IAnota10
4 Comparacioacuten de strings Funcioacuten que nos indica si dos strings son iguales
(str-compareltexpresioacuten-simboacutelica-o-de-cadenagtltexpresioacuten-simboacutelica-o-de-cadenagt
)
Esta funcioacuten devuelve
0 Si ambos strings son iguales1 Si el primer string es mayor que el segundo string-1 Si el primer string es menor que el segundo string
5 Longitud de un string Muchas veces es de gran utilidad saber que tamantildeo tiene un string
(str-length ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplo
(str-length Inteligencia Artificial) rarr 23
366 iquestCoacutemo obtener el contenido de una variable en un string
Para conseguir un string a partir de un integer float symbol instance-name debes utilizar el comandostr-cat Si a la funcioacuten le pasamos como paraacutemetros varios elementos los transformaraacute a string y losconcatenaraacute La sintaxis de esta funcioacuten es la siguiente (str-cat elementos) Esta funcioacuten la usaremossobre todo cuando queramos realizar comparaciones entre el contenido de una variable y un string ya quepreviamente necesitaremos usar la funcioacuten str-cat para pasar el contenido de la variable a string y realizarde este modo la comparacioacuten de forma correcta
367 iquestComo se crea una lista
Con create$ Todos los operadores sobre listas llevan el siacutembolo $ al final Igual que con las variables sedebe usar bind siempre que se desee modificar una lista
(bind lista (create$ a b c))
368 iquestComo borro un elemento de una lista
Con delete$Usa la siguiente sintaxis(delete$ ltlistagt ltindice-iniciogt ltindice-finalgt)Se borraraacuten todos los elementos del rango entre las posiciones inicio y final ambas incluidas Tambieacuten exis-
tedelete-member$ (delete-member$ ltlistagt ltelementogt) Borraraacute todas las apariciones del elemento enla lista
(delete$ (create$ a b c d e f) 3 5) minusrarr (a b f)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3259
36 Programacioacuten 29
3523 Com es navega entre instagravencies relacionades
Per exemple tinc una instagravencia iA que teacute un slot anomenat slotB que eacutes una instagravencia drsquoun frame B Vullsaber el nom de la instagravencia associada al slotB de iA Ho pots fer aixiacute
(bind B (send iA get-slotB))(bind res (send B get-nom))
Si estagraves dins drsquouna condicioacute ho pots simplificar de la forma seguumlent
(bind res (send iAslotB get-nom)
Els dos punts soacuten equivalents al punt de Java
36 Programacioacuten
361 Com introduir un comentari
Els comentaris a CLIPS va darrere de un com per exemple
Comentari
Tambeacute podem afegir comentaris a les nostres regles deffacts deftemplates etc Generalment van darrereel nom de la estructura per exemple
1 (defrule neteja regla per la qual si la cuina estagrave bruta srsquoafegiragrave una tasca de2 neteja
3 (estat-cuina bruta)4 =gt5 (assert (tasca netejar))6 )
362 Referenciar el valor null a CLIPS
Per referenciar el valor null a clips es fa amb el simbol nil Per exemple si volem saber si una instagravenciainst es null ho podriacuteem fer de la seguumlent manera
(eq inst nil)
363 Formas de recorrer una lista
Para recorrer una lista disponemos de diferentes opciones en este FAQ explicaremos como crear unaestructura tipo ldquoWHILErdquo y tipo ldquoFORrdquo
1 While Esta regla se ejecuta hasta que la expresioacuten a evaluar sea falsa Este tipo de estructura se rigepor seguir la sintaxis while - do y se construiriacutea de la siguiente forma
(while ltexpresioacutengt[do] ltaccioacutengt)
Doacutende dependiendo del valor de ltexpresioacutengt
Valor TRUE Se realizaraacute la accioacuten ltaccioacutengt i se volveraacute a evaluar ltexpresioacutengt
Valor FALSE No se ejecutaraacute la accioacuten ltaccioacutengt
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3359
30 Capiacutetulo 3 CLIPS
2 For Esta regla sirve para ejecutar un bucle N (final - inicio) veces Este tipo de estructura se rige porseguir la sintaxis loop-for-count y se construiriacutea de la siguiente forma
(loop-for-count (ltvargtltiniciogtltfinalgt) [do] ltaccioacutengt)
Doacutende
ltvargt Variable que se usara como iacutendice
ltiniciogt Valor inicial que tendraacute ltvargt
ltfinalgt Ultimo valor que tendraacute la variable ltvargt
ltaccioacutengt Accioacuten que es realizaraacute hasta que ltvargt tenga el valor de ltfingt
364 Formas de elegir una opcioacuten
En este apartado explicaremos como crear una estructura if y una estructura switch
If Este tipo de estructura se rige por seguir la sintaxis if - then - else y se construiriacutea de lasiguiente forma
(if ltexpresioacutengtthen ltaccioacutengt[else ltaccioacuten2gt])
Doacutende dependiendo del valor de ltexpresioacutengt
bull Valor TRUE Se realizaraacute la accioacuten ltaccioacutengtbull Valor FALSE Se realizaraacute la accioacuten ltaccioacuten2gt (en caso de haber)
Switch Este tipo de estructura se rige por seguir la sintaxis switch - opciones y se construiriacutea dela siguiente forma
(switch ltexpresioacuten-testgt(case OPCION1 then ACCION1)(case OPCION2 then ACCION2)
([default] ACCION-DEFAULT)
)
Doacutende dependiendo del valor de ltexpresioacuten-casegt se ejecutaraacute una ltaccioacutengt en particular Si nin-guna ltopcioacutengt es correcta se ejecutara la ltaccioacuten-defaultgt
365 Funciones con la clase String
Habitualmente trabajaremos con Strings o cadena de Strings CLIPS proporciona una serie de herramien-tas para trabajar con esta clase
1 Convertir string a MAYUacuteSCULAS A veces es conveniente tener todos los caracteres en mayuacutesculaspara no tener problemas de comparaciones o simplemente por convenio Para ello CLIPS dispone dela funcioacuten upcase la cual convierte a mayuacutesculas un siacutembolo o string
(upcase ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplos
(upcase Ccedillips es divertido) rarr CcedilLIPS ES DIVERTIDO
(upcase Clips_es_divertido) rarr CLIPS_ES_DIVERTIDO
2 Convertir string a MINUacuteSCULAS la funcioacuten es downcase
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3459
36 Programacioacuten 31
3 Concatenacioacuten de strings Tambieacuten es de gran utilidad poder juntar dos o maacutes paraacutemetros en un solostring Todo paraacutemetro a juntar deben ser de uno de los siguientes tipos symbol String integer floato instance-name
(str-cat parametro1 parametro2 parametroN )
Ejemplo
(str-cat IA nota 10) rarr IAnota10
4 Comparacioacuten de strings Funcioacuten que nos indica si dos strings son iguales
(str-compareltexpresioacuten-simboacutelica-o-de-cadenagtltexpresioacuten-simboacutelica-o-de-cadenagt
)
Esta funcioacuten devuelve
0 Si ambos strings son iguales1 Si el primer string es mayor que el segundo string-1 Si el primer string es menor que el segundo string
5 Longitud de un string Muchas veces es de gran utilidad saber que tamantildeo tiene un string
(str-length ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplo
(str-length Inteligencia Artificial) rarr 23
366 iquestCoacutemo obtener el contenido de una variable en un string
Para conseguir un string a partir de un integer float symbol instance-name debes utilizar el comandostr-cat Si a la funcioacuten le pasamos como paraacutemetros varios elementos los transformaraacute a string y losconcatenaraacute La sintaxis de esta funcioacuten es la siguiente (str-cat elementos) Esta funcioacuten la usaremossobre todo cuando queramos realizar comparaciones entre el contenido de una variable y un string ya quepreviamente necesitaremos usar la funcioacuten str-cat para pasar el contenido de la variable a string y realizarde este modo la comparacioacuten de forma correcta
367 iquestComo se crea una lista
Con create$ Todos los operadores sobre listas llevan el siacutembolo $ al final Igual que con las variables sedebe usar bind siempre que se desee modificar una lista
(bind lista (create$ a b c))
368 iquestComo borro un elemento de una lista
Con delete$Usa la siguiente sintaxis(delete$ ltlistagt ltindice-iniciogt ltindice-finalgt)Se borraraacuten todos los elementos del rango entre las posiciones inicio y final ambas incluidas Tambieacuten exis-
tedelete-member$ (delete-member$ ltlistagt ltelementogt) Borraraacute todas las apariciones del elemento enla lista
(delete$ (create$ a b c d e f) 3 5) minusrarr (a b f)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3359
30 Capiacutetulo 3 CLIPS
2 For Esta regla sirve para ejecutar un bucle N (final - inicio) veces Este tipo de estructura se rige porseguir la sintaxis loop-for-count y se construiriacutea de la siguiente forma
(loop-for-count (ltvargtltiniciogtltfinalgt) [do] ltaccioacutengt)
Doacutende
ltvargt Variable que se usara como iacutendice
ltiniciogt Valor inicial que tendraacute ltvargt
ltfinalgt Ultimo valor que tendraacute la variable ltvargt
ltaccioacutengt Accioacuten que es realizaraacute hasta que ltvargt tenga el valor de ltfingt
364 Formas de elegir una opcioacuten
En este apartado explicaremos como crear una estructura if y una estructura switch
If Este tipo de estructura se rige por seguir la sintaxis if - then - else y se construiriacutea de lasiguiente forma
(if ltexpresioacutengtthen ltaccioacutengt[else ltaccioacuten2gt])
Doacutende dependiendo del valor de ltexpresioacutengt
bull Valor TRUE Se realizaraacute la accioacuten ltaccioacutengtbull Valor FALSE Se realizaraacute la accioacuten ltaccioacuten2gt (en caso de haber)
Switch Este tipo de estructura se rige por seguir la sintaxis switch - opciones y se construiriacutea dela siguiente forma
(switch ltexpresioacuten-testgt(case OPCION1 then ACCION1)(case OPCION2 then ACCION2)
([default] ACCION-DEFAULT)
)
Doacutende dependiendo del valor de ltexpresioacuten-casegt se ejecutaraacute una ltaccioacutengt en particular Si nin-guna ltopcioacutengt es correcta se ejecutara la ltaccioacuten-defaultgt
365 Funciones con la clase String
Habitualmente trabajaremos con Strings o cadena de Strings CLIPS proporciona una serie de herramien-tas para trabajar con esta clase
1 Convertir string a MAYUacuteSCULAS A veces es conveniente tener todos los caracteres en mayuacutesculaspara no tener problemas de comparaciones o simplemente por convenio Para ello CLIPS dispone dela funcioacuten upcase la cual convierte a mayuacutesculas un siacutembolo o string
(upcase ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplos
(upcase Ccedillips es divertido) rarr CcedilLIPS ES DIVERTIDO
(upcase Clips_es_divertido) rarr CLIPS_ES_DIVERTIDO
2 Convertir string a MINUacuteSCULAS la funcioacuten es downcase
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3459
36 Programacioacuten 31
3 Concatenacioacuten de strings Tambieacuten es de gran utilidad poder juntar dos o maacutes paraacutemetros en un solostring Todo paraacutemetro a juntar deben ser de uno de los siguientes tipos symbol String integer floato instance-name
(str-cat parametro1 parametro2 parametroN )
Ejemplo
(str-cat IA nota 10) rarr IAnota10
4 Comparacioacuten de strings Funcioacuten que nos indica si dos strings son iguales
(str-compareltexpresioacuten-simboacutelica-o-de-cadenagtltexpresioacuten-simboacutelica-o-de-cadenagt
)
Esta funcioacuten devuelve
0 Si ambos strings son iguales1 Si el primer string es mayor que el segundo string-1 Si el primer string es menor que el segundo string
5 Longitud de un string Muchas veces es de gran utilidad saber que tamantildeo tiene un string
(str-length ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplo
(str-length Inteligencia Artificial) rarr 23
366 iquestCoacutemo obtener el contenido de una variable en un string
Para conseguir un string a partir de un integer float symbol instance-name debes utilizar el comandostr-cat Si a la funcioacuten le pasamos como paraacutemetros varios elementos los transformaraacute a string y losconcatenaraacute La sintaxis de esta funcioacuten es la siguiente (str-cat elementos) Esta funcioacuten la usaremossobre todo cuando queramos realizar comparaciones entre el contenido de una variable y un string ya quepreviamente necesitaremos usar la funcioacuten str-cat para pasar el contenido de la variable a string y realizarde este modo la comparacioacuten de forma correcta
367 iquestComo se crea una lista
Con create$ Todos los operadores sobre listas llevan el siacutembolo $ al final Igual que con las variables sedebe usar bind siempre que se desee modificar una lista
(bind lista (create$ a b c))
368 iquestComo borro un elemento de una lista
Con delete$Usa la siguiente sintaxis(delete$ ltlistagt ltindice-iniciogt ltindice-finalgt)Se borraraacuten todos los elementos del rango entre las posiciones inicio y final ambas incluidas Tambieacuten exis-
tedelete-member$ (delete-member$ ltlistagt ltelementogt) Borraraacute todas las apariciones del elemento enla lista
(delete$ (create$ a b c d e f) 3 5) minusrarr (a b f)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3459
36 Programacioacuten 31
3 Concatenacioacuten de strings Tambieacuten es de gran utilidad poder juntar dos o maacutes paraacutemetros en un solostring Todo paraacutemetro a juntar deben ser de uno de los siguientes tipos symbol String integer floato instance-name
(str-cat parametro1 parametro2 parametroN )
Ejemplo
(str-cat IA nota 10) rarr IAnota10
4 Comparacioacuten de strings Funcioacuten que nos indica si dos strings son iguales
(str-compareltexpresioacuten-simboacutelica-o-de-cadenagtltexpresioacuten-simboacutelica-o-de-cadenagt
)
Esta funcioacuten devuelve
0 Si ambos strings son iguales1 Si el primer string es mayor que el segundo string-1 Si el primer string es menor que el segundo string
5 Longitud de un string Muchas veces es de gran utilidad saber que tamantildeo tiene un string
(str-length ltexpresioacuten-simboacutelica-o-de-cadenagt)
Ejemplo
(str-length Inteligencia Artificial) rarr 23
366 iquestCoacutemo obtener el contenido de una variable en un string
Para conseguir un string a partir de un integer float symbol instance-name debes utilizar el comandostr-cat Si a la funcioacuten le pasamos como paraacutemetros varios elementos los transformaraacute a string y losconcatenaraacute La sintaxis de esta funcioacuten es la siguiente (str-cat elementos) Esta funcioacuten la usaremossobre todo cuando queramos realizar comparaciones entre el contenido de una variable y un string ya quepreviamente necesitaremos usar la funcioacuten str-cat para pasar el contenido de la variable a string y realizarde este modo la comparacioacuten de forma correcta
367 iquestComo se crea una lista
Con create$ Todos los operadores sobre listas llevan el siacutembolo $ al final Igual que con las variables sedebe usar bind siempre que se desee modificar una lista
(bind lista (create$ a b c))
368 iquestComo borro un elemento de una lista
Con delete$Usa la siguiente sintaxis(delete$ ltlistagt ltindice-iniciogt ltindice-finalgt)Se borraraacuten todos los elementos del rango entre las posiciones inicio y final ambas incluidas Tambieacuten exis-
tedelete-member$ (delete-member$ ltlistagt ltelementogt) Borraraacute todas las apariciones del elemento enla lista
(delete$ (create$ a b c d e f) 3 5) minusrarr (a b f)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3559
32 Capiacutetulo 3 CLIPS
369 iquestComo inserto elementos en una lista
Con insert$ Sintaxis(insert$ ltlistagtltindicegtltexpresioacuten simple o listagt)Inserta todos los valores simples o de multicampo en la lista antes del iacutendice-eacutesimo valor (ltiacutendicegt debe
ser un entero) de la lista dada
(insert$ (create$ a b c d) 1 x) minusrarr (x a b c d)
3610 iquestComo modifico elementos de una lista
Con replace$ Sintaxis(replace$ ltlista-a-modifcargt ltiniciogt ltfinalgt ltlista-nuevos-valoresgt)Los valores entre las posiciones inicio y final seraacuten substituidos por la nueva lista Recordar que el uso de
bind es imprescindible si queremos conservar los cambios
(replace$ (create$ a b c) 3 3 x)minusrarr
(a b x)
3611 iquestComo averiguo el nuacutemero de elementos de una lista
Con length$ Sintaxis (length$ ltlistagt)
3612 iquestComo consulto un valor de la lista a traveacutes de su posicioacuten
A traveacutes de nth$ Sintaxis (nth$ ltiacutendicegtltlistagt)
3613 iquestComo recorro todos los elementos de una lista
Manualmente con un bucle y nth$ o con progn$ Sintaxis(progn$ (ltvargtltlistagt)) La variable iteraraacutesobre todos los valores de la lista ordenadamente
(progn$ (var (create$ abc def ghi))(printout t --gt var lt-- crlf))--gt abc lt----gt def lt--
--gt ghi lt--
3614 Com trobar si un element forma part drsquouna llista
Per comprovar que un element formi part de la llista (seguint lrsquoexemple anterior com saber si un ingredientforma part de la llista drsquoingredients) podem fer servir (member ltELEMENTgt ltLLISTAgt) el qual retorna unbooleagrave indicant si lrsquoelement pertany a la llista o no
3615 Tinc un conjunt de siacutembols perograve estan tots junts en un string iquestCom ho faig perseparar-los i posar-los en un multislot
Has drsquoutilitzar la funcioacute explode$ de CLIPS amb la sintaxi seguumlent
(explode$ string)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3659
37 Los moacutedulos 33
Per exemple si tenim una data en un string i volem extreure el dia
(bind dia (nth$ 1 (explode$ data)))
3616 I si tinc un multislot i el vull transformar en un string
Has drsquoutilitzar la funcioacute implode$ de CLIPS amb la sintaxi seguumlent
(implode$ multislot)
Per exemple si volem crear un string que conteacute una data
(bind data (implode$ (create$ 12 1 2008)))
3617 iquestCoacutemo obtener un valor aleatorio
Es probable que en algunos casos necesitemos obtener un valor aleatorio para realizar alguacuten tipo de accioacutenCLIPS nos ofrece esta posibilidad mediante la funcioacuten random que retorna un nuacutemero entero aleatorio
(bind rand (random))
3618 Comparaciones
Para comparar dos elementos (operador elemento1 elemento2) Siendo operador eq lt = gt Porejemplo
(eq nuevo TRUE)
(lt precio saldo)Un caso especiacutefico es la igualdad ya que variacutea en funcioacuten del tipo de los elementos comparados Si se trata
de un nuacutemero se utilizaraacute el operador = en caso de que los elementos sean objetos o siacutembolos eq Finalmentesi estamos tratando cadenas debemos utilizar la funcioacuten str-compare Esta devuelve un nuacutemero entero querepresenta el resultado de la comparacioacuten 0 (son ideacutenticos) 1 (elemento1 gt elemento2) o -1 (elemento1 ltelemento2)
De esta forma si por ejemplo queremos comparar si dos cadenas son iguales la condicioacuten seriacutea
(= (str-compare verano verano) 0)
37 Los moacutedulos
371 Quegrave eacutes un mogravedul en CLIPS
Els mograveduls en clips soacuten el mecanisme que ens proporciona aquest per tal de dividir organitzar i en algunscasos fer meacutes eficient la execucioacute de les nostres bases de coneixement Ens poden ser uacutetils per exempleper dividir un problema en diversos subproblemes com per exemple per dividir un problema en un primersubproblema drsquoanagravelisis i un segon de construccioacute de la solucioacute
Els mograveduls es defineixen de la seguumlent manera
(defmodule ltnom-mogravedulgt)
Un mogravedul nomeacutes pot ser definit un cop i no podragrave ser tornat a definir mai a excepcioacute del mogravedul MAINque es pot redefinir tan sols un cop Cal tenir en compte que cada mogravedul teacute la seva progravepia agenda
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3759
34 Capiacutetulo 3 CLIPS
372 Particioacuten en modulos
Para que el sistema experto sea mucho maacutes sencillo de actualizar y de comprender es muy aconsejablehacer una particioacuten en moacutedulos Lo que hacemos con esto es agrupar las reglas que busquen un objetivo en co-muacuten La construccioacuten de un moacutedulo se hace poniendo (defmodule nombre_del_modulo La descripcioacutendel moacutedulo(import ) (export )) Un moacutedulo termina en donde empieza otro moacutedulo asiacute queno hay que cerrar declaracioacuten sino que se hace implicitamente En los apartados de import deberemos deponer todos aquellos moacutedulos de los cuales queramos obtener y usar sus reglas Los export son para indicara los demaacutes moacutedulos que se puede usar de si mismo Definir los moacutedulos si luego no se puede navegar porellos no sirve para nada Para eso estaacute el comando focus el cual seguido de un nombre de moacutedulo sirvepara especificar que el sistema va a estar centrado focalizado en el moacutedulo especificado El uso de focus esmuy adecuado como consecuente de una regla por ejemplo
1 (defrule cambio-modulo-estilo-menu2 (Evento nombre_reserva ok)3 (Evento numero_comensales ok)4 (Evento temporada )5 (Evento presupuesto ok)6 =gt7 (focus preguntas-estilo-menu)8 )
Cuando una regla no estaacute en ninguacuten moacutedulo es decir el usuario no la ha incluido en ningun moacutedulodecimos que estaacute en el moacutedulo MAIN
373 iquestCoacutemo asignar una construccioacuten en un moacutedulo
Existen dos formas para incluir una construccioacuten en un moacuteduloExpliacutecita se escribe el nombre del moacutedulo (que es un siacutembolo) seguido de dos puntos() que representan
el siacutembolo separador de moacutedulos y a continuacioacuten el nombre Ej (MOacuteDULOconstruccioacuten)
Impliacutecita sin especificar el nombre del moacutedulo ni los dos puntos ya que siempre existe un moacuteduloldquoactualrdquo El moacutedulo actual cambia siempre que
se defina una construccioacuten defmodulese especifica el nombre de un moacutedulo en una construccioacuten (usando )se utilice la funcioacuten set-current-module ltnombre-moacutedulogt
374 Com funcionen les clagraveusules export i import
Abans de res cal advertir que nomeacutes es poden exportar i importar deftemplate defclass defglobaldeffunction i defgeneric
Hi ha 3 maneres drsquoexportar o importar construccions
1 Exportantimportant el conjunt global de totes les construccions drsquoun mogravedul
(defmodule modulA (export ALL) )(defmodule modulB (import modulA ALL) )
2 Exportantimportant totes les construccions drsquoun mogravedul que soacuten drsquoun tipus particular
(defmodule modulA (export deftemplate ALL) )(defmodule modulB (import modulA deftemplate ALL) )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3859
37 Los moacutedulos 35
3 Exportantimportant construccions especiacutefiques
(defmodule modulA (export deffunction funcio-util-1 funcio-util-2) )(defmodule modulB (import modulA deffunction funcio-util-1 funcio-util-2) )
Per poder importar construccions drsquoun altre mogravedul eacutes un requisit que aquest mogravedul estigui definit abans
del mogravedul on estem definint la importacioacute i que el mogravedul estigui exportant les consrtuccions que voldremusar en el nou mogravedulExemple
1 (defmodule modulA (export deffunction funcioAdeu))2 exportem nomeacutes la funcioacute funcioAdeu3
4 (deffunction modulAfuncioAdeu ()5 (printout t Bye from ModuleA crlf)6 )7
8
(defmodule MAIN (import modulA ALL))9 importem totes les construccions de modulA
10
11 (defrule MAINinicio12 (initial-fact)13 =gt14 (printout t Hello from MAIN module crlf)15 (funcioAdeu)16 )
Si executem aquest codi obtindrem la seguumlent sortida
CLIPSgt (run)Hello from MAIN moduleBye from ModuleACLIPSgt
375 iquestCoacutemo cambio el moacutedulo actual
El moacutedulo MAIN es definido automaacuteticamente por CLIPS y es el moacutedulo actual por defecto cuando se iniciapor primera vez o despueacutes de un comando clear Cada moacutedulo tiene su propia agenda (conjunto conflicto)Entonces la ejecucioacuten puede controlarse seleccionando una agenda y en eacutesta se elegiraacuten reglas para ejecutar
Se puede cambiar el moacutedulo actual mediante el comando focusSintaxis (focus ltnombre-moacutedulogt+)
CLIPS mantiene una pila de focos y cada vez que se hace un cambio de moacutedulo se antildeade el foco actualen el top de la pila La ejecucioacuten de las reglas continuacutea hasta que cambia el foco a otro moacutedulo no hayareglas en la agenda oacute se ejecute return en la RHS de una regla
En las reglas existe la propiedad auto-focus que permite ejecutar automaacuteticamente un comando focuscuando la regla se activa
Sintaxis (auto-focus TRUE | FALSE)
376 iquestComo deberiacutea utilizar las focos en la practica de CLIPS
La manera maacutes natural de organizar los moacutedulos en la praacutectica de clips es de manera lineal y con unorden de ejecucioacuten consecutiva Esto quiere decir que si nuestra praacutectica tiene 5 moacutedulos estaraacuten escritos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 3959
36 Capiacutetulo 3 CLIPS
de manera lineal m1 m2 m3 m4 y m5 y querremos que se ejecuten de manera consecutiva Primerom1 despueacutes m2 asiacute consecutivamente hasta llegar a m5 De esto se deduce que al final de cada moacutedulocolocaremos un foco que nos redirija al siguiente moacutedulo
La redireccioacuten o salto al siguiente moacutedulo puede ser de dos tipos
1 Incondicional
Queremos que independiente de que reglas se hayan cumplido el foco nos redireccione al siguientemodulo En este caso seraacute suficiente con la sentencia
(focus modulo-siguiente)
2 Condicional Lo maacutes habitual es queramos saltar al siguiente moacutedulo solo si se han cumplido una seriede reglas La solucioacuten en este caso es incorporar el foco en la parte derecha de la regla
1 (defrule saltar-siguiente-modulo2 (declare (salience 0))3 (r1 )4 (r2 )5 (r3 )6 (r4 )7 (r5 )8 -gt9 (focus modulo-siguiente)10 )
Como podraacute apreciar el lector se ha incluido una sentencia condicional en la parte izquierda es (declare(salience 0)) Mediante esta instruccioacuten podemos asignar una prioridad en el orden de ejecucioacuten a laregla En este caso se ha asignado prioridad 0 suponiendo que todas las reglas restantes del moacutedulo tienenuna prioridad maacutes alta (por ejemplo 10) aseguraacutendonos que seraacute la uacuteltima en ejecutarse
38 Funciones
381 iquestCoacutemo se crea una funcioacuten en CLIPS
Una deffunction se compone de cinco elementos
1 Un nombre que debe ser un siacutembolo
2 Un comentario que es opcional
3 Una lista de cero o maacutes paraacutemetros requeridos que deben ser variables simples)
4 Un paraacutemetro comodiacuten opcional que sirve para manejar un nuacutemero variable de argumentos
5 Una secuencia de acciones o expresiones que seraacuten ejecutadas en orden cuando se llame a la funcioacuten
(deffunctionltnombregt (1)[ltcomentariogt] (2)
(ltparaacutemetrogt (3)[ltparaacutemetro-comodiacutengt]) (4)ltaccioacutengt (5)
)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4059
38 Funciones 37
El valor devuelto por la funcioacuten es la uacuteltima accioacuten o expresioacuten evaluada dentro de la funcioacuten Si unadeffunction no tiene acciones devolveraacute el siacutembolo FALSE Si se produce alguacuten error mientras se ejecuta lafuncioacuten cualquier otra accioacuten de la funcioacuten auacuten no ejecutada se abortaraacute y la funcioacuten devolveraacute el siacutemboloFALSE
Ejemplo
1 (deffunction2 mostrar-params Nombre (1)3 (a b Paraacutemetro simples (3)4 $c) Paraacutemetro muacuteltiple (4)5 (printout t a b and (length c)6 extras c crlf) Accioacuten (5)
La funcioacuten anterior guarda los dos primeros paraacutemetros dentro de las variables a y b y el resto (en casode haber) en $c Esta funcioacuten realiza la accioacuten de imprimir por pantalla un mensaje formado por
Los valores de las variables a y b + and + longitud de la variable c + extras + valores de cSi ejecutamos la funcioacuten definida anteriormente con dos paraacutemetros (mostrar-params 1 2) el valor de
cada variable seraacutea = 1
b = 2
c = Vacio
E imprimiraacute 1 2 and 0 extras ()Si ejecutamos la funcioacuten definida anteriormente con cuatro paraacutemetros (mostrar-par a b c d) el valor de
cada variable seraacute
a = a
b = b
c = c d
E imprimiraacute 1 2 and 2 extras (c d)
382 Explicacioacuten de la estructura de una funcioacuten en general
Hacer una funcioacuten en CLIPS es igual que en cualquier otro lenguaje Se ha de tener en cuenta que lafuncioacuten no tiene activadores como en una regla Uacutenicamente eacutesta tiene que ser colocada dentro del moacutedulo
donde va a ser utilizada y siempre tiene que devolver algo (tal como se veraacute en el ejemplo de estructurasiguiente) Ejemplo
Si en pseudocoacutedigo tuvieacutesemos
1 funcion devuelvo_boolean (lista L1 lista L2)2 3 boolean b = false4 int i = 15 mientras(ilt=N ampamp b)6 7 8 i++9
10 return b11
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4159
38 Capiacutetulo 3 CLIPS
En CLIPS quedaria asiacute
1 (deffunction devuelvo_boolean (L1 L2)2 (bind b FALSE)3 (bind i 1)4 (while (and (lt= i N) (not b))5
do6 7 (bind i (+ i 1))8 )9 b
10 )
383 Com definir un paragravemetre drsquouna funcioacute com una llista
Si volem que un paragravemetre de la funcioacute sigui una llista ho haurem drsquoindicar amb un $ Per exemple
(deffunction pertany (var $llista) (member var llista))
Retornaria si var forma part drsquouna llistaLa manera drsquoindicar que un paragravemetre eacutes una llista seria la mateixa per els fets a la part esquerre drsquouna
regla
384 Com puc utilitzar una funcioacute a la part esquerra de les regles
Fent servir la instruccioacute test test es satisfagrave si la funcioacute retorna qualsevol valor diferent de FALSE
(test (estaALaLlista persona1 $personesConvidades ))
39 Entrada salida
391 iquestCoacutemo se imprime por pantalla
Para imprimir por pantalla sin especificar el formato de cada paraacutemetro se usa la funcioacuten printout( printout nombre-logico ltparaacutemetrogt+ )
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateadobull T Se imprime en la salida estaacutendar
Paraacutemetros Los paraacutemetros pueden ser
bull Variables Si queremos imprimir el valor de una variable debemos escribir un interrogante y sunombre nombreVariable
bull Resultado de funciones Si queremos escribir el valor de retorno de una funcioacuten deberemosescribir entre pareacutentesis la funcioacuten a ejecutar (nombreFuncion)
bull Strings Si queremos escribir una cadena des Strings deberemos poner la cadena de strings entrecomillas loQueQuieraEscribir
Si por el contrario queremos especificar el tipo de cada paraacutemetro a imprimir usaremos la funcioacuten format( format ltnombre-logicogtltstring-controlgtltparaacutemetrosgt )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4259
39 Entrada salida 39
Nombre-loacutegico Enviacutea al dispositivo asociado con el nombre loacutegico especificado un string formateadoPuede tener uno de los siguientes valores
bull Nil No se produce salida pero devuelve el string formateado
bull T Se imprime en la salida estaacutendar
String-Control El string de control contiene unos flags de formato que indican coacutemo seraacuten impresoslos paraacutemetros Estos flags son de la forma [-][M][N]x donde
bull - Es opcional y significa justificado a la izquierda (por defecto derecha)
bull M Indica la anchura del campo en columnas Como miacutenimo se imprimiraacuten M caracteres
bull N Especiacutefica el numero de diacutegitos a la derecha del punto decimal y es opcional Por defecto setoman 6 para los nuacutemeros reales
bull X Especifica el formato de impresioacuten y puede ser
d Entero f Decimal e Exponencial (potencias de 10)
g General (numeacuterico) Imprimir con el formato mas corto o Octal Numero sin signo (N no se aplica) x Hexadecimal S String N Salto de liacutenea R Retorno de carro el caraacutecter ldquordquo
Paraacutemetros Paraacutemetros a imprimir
392 iquestAl imprimir por pantalla como hago un salto de liacutenea
Con crlf
393 Com imprimeixo una liacutenia en blanc
Sense escriure cap text
(printout t crlf)
394 Com llegir de la entrada standard
Per llegir de lrsquoentrada estagravendard CLIPS ofereix el megravetode (read) Generalment per llegir el que vol entrarun usuari farem
(bind text (read))
Aixograve deixaragrave a la variable text el que escrigui lrsquousuari fins que faci un retorn de carroSi volem comprovar que la resposta sigui un String podem fer servir (lexemep ltVALORgt) el qual comprova
que VALOR sigui un String o un SymbolSi el que volem eacutes un enter podem fer servir (integerp ltVALORgt) que comprova que VALOR sigui un
enter
395 Vull llegir un nuacutemero (o conjunt de nuacutemeros) com un string perograve CLIPS mersquols llegeixcom un enter
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4359
40 Capiacutetulo 3 CLIPS
Utilitza la funcioacute (readline) en lloc de la funcioacute (read)
nota adicional Las funciones (read) y (readline) tienen un comportamiento diferente La funcioacuten(read) espera un elemento vaacutelido de CLIPS en la entrada (un entero un real un string un siacutembolo unainstancia incluso una lista) e ignora todo lo que queda en la entrada una vez ha reconocido el elemento
vaacutelido Este comportamiento es habitual en muchos lenguajes de programacioacuten no imperativos (funcionales ydeclarativos) como por ejemplo LISP o Prolog donde los procedimientos de lectura no se limitan a reconocercaracteres sino que son conscientes de las estructuras del lenguaje La funcioacuten (readline) es la funcioacuten detratamiento de lectura de caracteres habitual en los lenguajes imperativos
396 Haig de fer una pregunta a lrsquousuari i la resposta eacutes un conjunt drsquoelements (no seacutedrsquoentrada quants) com ho faig per assignar-los a un multislot
Per fer aixograve primer necessites definir una funcioacute que llegeixi un string drsquoentrada (que contindragrave el conjuntdrsquoelements) i despreacutes trencar la cadena per poder distingir cada element individualment (ldquopasta marisc
fruitardquominus gt
ldquopastardquo ldquomariscrdquo ldquofruitardquo) A lrsquoexemple seguumlent es veu com fer-ho1 Fa una pregunta sobre una llista drsquoelements2 (deffunction pregunta-llista (pregunta)3 (format t iquests pregunta)4 Llegim una liacutenea sencera (Ex Pasta Marisc Fruita)5 (bind resposta (readline))6 Separem lrsquostring (Ex Pasta Marisc Fruita)7 (bind res (str-explode resposta))8 Retornem els diferents camps (Ex Pasta Marisc Fruita)9 res
Un cop tenim la funcioacute lrsquouacutenic que hem de fer eacutes assignar els valors que hem llegit i processat a la variableque ens interessi Per exemple suposem que volem assignar la resposta a una variable anomenada ingredients
(bind ingredients(pregunta-llista Hi ha algun ingredient que no desitgi incloure al menu))
310 Funciones uacutetiles
3101 Obtener una respuesta de un conjunto predefinido de respuestas posibles
1 (deffunction pregunta (pregunta $valores-permitidos)2 (progn$3 (var valores-permitidos)4 (lowcase var))5 (format t iquests (s) pregunta (implode$ valores-permitidos))6 (bind respuesta (read))7 (while (not (member (lowcase respuesta) valores-permitidos)) do8 (format t iquests (s) pregunta (implode$ valores-permitidos))9 (bind respuesta (read))
10 )11 respuesta12 )
Esta funcioacuten guarda en el paraacutemetro respuesta la respuesta elegida La funcioacuten es muy simple
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4459
310 Funciones uacutetiles 41
1 Convierte a minuacutesculas el conjunto de valores permitidos para prevenir errores de comparacioacuten
2 Lee de teclado y guarda la respuesta en la variable respuesta
3 Mientras la respuesta no sea una de las permitidas sigue haciendo la pregunta
4 Devuelve la respuesta correcta
3102 Obtener un valor numeacuterico comprendido en un rango
1 (deffunction pregunta-numerica (pregunta rangini rangfi)2 (format t iquests [d d] pregunta rangini rangfi)3 (bind respuesta (read))4 (while (not(and(gt respuesta rangini)(lt respuesta rangfi))) do5 (format t iquests [d d] pregunta rangini rangfi)6 (bind respuesta (read))7 )8 respuesta
Esta funcioacuten guarda en el paraacutemetro respuesta el valor elegido La funcioacuten es muy simple
1 Lee de teclado y guarda la respuesta en la variable respuesta
2 Mientras el valor no este contenido dentro del rango deseado sigue haciendo la pregunta
3 Devuelve la respuesta correcta
3103 Realizar una pregunta general
1 (deffunction pregunta-general (pregunta)2 (format t iquests pregunta)3 (bind respuesta (read))4 respuesta
Realiza una pregunta y almacena la respuesta en respuesta
3104 iquestCoacutemo se realiza una pregunta binaria
1 (deffunction si-o-no-p (pregunta)2 (bind respuesta (pregunta pregunta si no s n))3 (if (or (eq (lowcase respuesta) si) (eq (lowcase respuesta) s))4 then TRUE5 else FALSE6 )
Devuelve cierto si se escribe s o si y falso en caso contrario
3105 Encuentra la instancia con valor miacutenimo para un slot
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4559
42 Capiacutetulo 3 CLIPS
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista estaacute vaciacutea
1 (deffunction minimum-slot (li sl init)2 (bind encontrado FALSE)
3 (if (neq li FALSE) then4 (bind li (create$ li))5
6 (if (gt (length li) 0) then7
8 (bind min init)9 (loop-for-count (i 1 (length li))
10
11 (bind v (send (nth$ i li) sl))12
13 (if (lt v min) then
14
15 (bind encontrado TRUE)16 (bind min v)17 (bind ins (nth$ i li))18
19 )20 )21 )22 )23 (if (eq encontrado FALSE) then24 (bind ins FALSE)25 )26 (return ins)27 )
3106 Elimina de la lista de instancias aquellas que por el multislot sl no contengan valorconst
El primer paraacutemetro es la lista de instancia
El segundo paraacutemetro es el meacutetodo con el que se accede al slot
El tercer paraacutemetro es el valor con que se inicializa la instancia
Devuelve FALSE si no encuentra ninguno o si la lista esta vaciacutea
1 (deffunction filtrar-multi-por (li sl const)2
3 (bind encontrado FALSE)4 (if (neq li FALSE) then5
6 (bind li (create$ li))7
8 (if (gt (length li) 0) then9 (loop-for-count (i 1 (length li))
10 (bind $v (send (nth$ i li) sl))11 (if (member$ const $v) then
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4659
311 Ejecucioacuten de un programa CLIPS 43
12 (if (eq encontrado FALSE) then13 (bind encontrado TRUE)14 (bind ins (nth$ i li))15 else16 (bind ins (create$ ins (nth$ i li)))17 )18 )19 )20 )21 )22 (if (eq encontrado FALSE) then23 (bind ins FALSE)24 )25 (return ins)26 )
3107 Random slot Devuelve una instancia aleatoria de entre las que hay en la lista li
1 (deffunction random-slot ( li )2 (bind li (create$ li))3 (bind max (length li))4 (bind r (random 1 max))5 (bind ins (nth$ r li))6 (return ins)7 )
3108 Recorre todos los elementos del slot que recibe por paraacutemetro y los imprime por pantalla
1 (deffunction imprime-todo (v)2 (if (gt (length$ v) 0) then3 (loop-for-count (i 1 (length v))4 (send (nth$ i v) print)5 (printout t crlf)6 )7 )
311 Ejecucioacuten de un programa CLIPS
3111 iquestCoacutemo cargamos un programa
Para programar en CLIPS utilizaremos ficheros con extensioacuten CLP que contendraacuten el conjunto de ins-trucciones ha ejecutar
Entorno Windows Mac OS X
Cargar por comandos Debemos escribir (load PATHnombreficheroclp)
Cargar por entorno grafico Debemos ir al menuacute -gt load -gt seleccionar el fichero
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4759
44 Capiacutetulo 3 CLIPS
Entorno Linux
Cargar por comandos Debemos escribir (load ldquoPATHnombreficheroclprdquo)
3112 iquestCoacutemo probar tu coacutedigo en CLIPS
Tienes que abrir la aplicacioacuten CLIPS y escribir (clear) en el Dialog Window Posteriormente necesitascargar los ficheros clips Si tienes la ontologiacutea y las reglas por separado tendras que cargar primero el ficherocon la ontologiacutea y despues el de las reglas Esto lo puedes hacer desde File-gtLoad y seleccionando el ficheroclp en cuestioacuten A continuacioacuten debes escribir (reset) en el Dialog Window y ahora CLIPS ya estaraacutepreparado para ejecutar tu coacutedigo En concreto lo haraacute cuando escribas (run)
3113 iquestQueacute es necesario hacer entre ejecucioacuten y ejecucioacuten
Una vez has acabado una ejecucioacuten de tu coacutedigo si por el motivo que sea quieres realizar otra es impres-cindible que escribas (reset) en el Dialog Window ya que asiacute borras todas las reglas activadas y los hechosintroducidos en la anterior ejecucioacuten A continuacioacuten podriacuteas empezar la ejecucioacuten con el comando (run) Sial finalizar una ejecucioacuten introduces alguacuten cambio en el coacutedigo y quieres probarlo debes seguir lo explicadoen la pregunta iquestCoacutemo probar tu coacutedigo en CLIPS pero sin tener que abrir el CLIPS de nuevo
3114 iquestCoacutemo parar una ejecucioacuten
Para detener la activacioacuten de reglas se usa el comando (halt) La agenda permanece intacta y la ejecucioacutenpuede reanudarse con el comando (run) No devuelve ninguacuten valor
3115 iquestComo vuelvo al estado inicial y queacute contendraacute eacuteste
Con la funcioacuten reset Eacuteste contendraacute todos los hechos declarados con deffacts las instancias de defins-tances y las reglas (empezando desde cero obviamente)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4859
4 Consejos praacutecticos
41 Tinc el disseny de la pragravectica fet perograve a lrsquohora drsquoimplementar tot aixograve noseacute ni per on comenccedilar Algun consell
Beacute tothom teacute formes de treballar diferents perograve un bon sistema pot ser el seguumlentComenccedila amb una ontologia molt reduiumlda que tingui un parell de classes i molt poques instagravencies a cada
classe (per poder provar coses) Despreacutes fes funcions io regles senzilles amb CLIPS que et permetin obtenirinformacioacute de lrsquoontologia que has creat Pots comenccedilar amb regles que et retornin totes les instagravencies drsquounadeterminada classe Segurament aixograve al principi tambeacute et pot ser confoacutes aquiacute tens un exemple molt bagravesic
1 (defrule retorna_instancies2
(not retorna_instancies ok)3 =gt4 (bind llista_instancies (find-all-instances ((instancia Nom_Classe)) TRUE))5 (assert retorna_instancies ok)6 )
Un cop tinguis una regla que funciona i que saps com funciona es tracta drsquoanar-hi afegint coses a poc apoc (tant a les regles com a lrsquoontologia) Com ara canviant el TRUE de lrsquoexemple anterior per alguna condicioacutede lrsquoestil
(eq instancianom nom_de_la_instancia_que_vull)
42 iquestComo estructuro una practica de CLIPS
A continuacioacuten se presenta una propuesta de estructura para facilitar el comienzo de la misma El disentildeoesta sacado de la praacutectica MIKEO cedida por EVA Pallareacutes
1 Definicioacuten de las clases
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pont
2 Instancias
Aquiacute deberiacuteamos hacer un cortar y pegar de todo el contenido de fichero pins
3 Exportacioacuten del MAIN
(defmodule MAIN (export ALL))
4 Templates
Incluimos posibles templeates que tengamos que utilizar
5 Mensajes
En esta parte incluiremos la comunicacioacuten (envioacute de mensajes) con las clases Como habitualmente enla praacutectica de CLIPS la utilizacioacuten de enviacuteo de mensajes se suele utilizar para imprimir el contenido
de una clase podriacuteamos decir que aquiacute incluiremos el coacutedigo de impresioacuten de clases
6 Funciones
Aquiacute incluiremos todas las funciones que vayamos a utilizar
45
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 4959
46 Capiacutetulo 4 Consejos praacutecticos
7 Reglas
La parte de reglas como hemos comentado anteriormente estaraacuten agrupadas en moacutedulos La organi-zacioacuten de los moacutedulos depende mucho del programador y el problema a resolver De todas formasexisten algunos moacutedulos que se suelen repetir como
a ) Moacutedulos de preguntas
Seraacute totalmente necesario obtener informacioacuten sobre las preferencias y restricciones del usuariob) Moacutedulo de seleccioacuten
Suele ser habitual hacer seleccioacuten de instancias que cumplan las restricciones impuestas por elusuario
c) Moacutedulo de construccioacutenSeraacute necesario que nuestro SBC construya una solucioacuten a nuestro problema
d ) Moacutedulo de impresioacuten de resultadosNecesitaremos un moacutedulo final para imprimir la solucioacuten encontrada
43 Com crear un flux de preguntesEn la majoria de sistemes experts hi ha una primera fase de recopilacioacute drsquoinformacioacuteAquesta recopilacioacute es pot fer a traveacutes de preguntes a lrsquousuari Aquestes preguntes poden tenir dependegravencies
entre elles per exemple si un client ens diu que teacute telegravefon mogravebil procedirem a preguntar-li el nuacutemerodrsquoaquest mogravebil perograve si ens diu que no no li preguntarem el nuacutemero Aixiacute el fet que el client tingui mogravebileacutes un prerequisit per preguntar-li quin eacutes el nuacutemero de telegravefon del seu mogravebil
Per aixograve usem el sistema de regles que ens proporciona CLIPS i introduirem aquest prerequisit a la partesquerra de la regla
1 (defrule preguntar-numero-mobil2
(mobil si)3 =gt4 (printout t Quin eacutes el teu nuacutemero de mogravebil)5 (bind numero-mobil (read))6 (assert numero-mobil numero-mobil)7 )
Drsquoaquesta manera la regla preguntar-numero-mobil nomeacutes srsquoactivaragrave si lrsquousuari ha contestat que siacute ala pregunta ldquotens mogravebilrdquo
431 Com puc ordenar aquest flux de preguntes
Per altra banda ens pot interessar fer que les preguntes que fem a lrsquousuari tinguin un cert ordre Perexemple ens pot interessar preguntar-li a lrsquousuari primer el seu nom i posteriorment preguntar-li si teacutetelegravefon mogravebil En aquest cas la primera pregunta no eacutes un prerequisit per preguntar la segona perograve eacutes desentit comuacute que tinguin aquest ordre Per traduir aixograve a clips podem fer
1 (defrule preguntar-mobil2 (nom nom-usuari)3 =gt4 (5 if (yes-or-no-p Tens telegravefon mogravebil)6 then (assert (mobil si))7 else (assert (mobil no))8 )9 )
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5059
43 Com crear un flux de preguntes 47
Drsquoaquesta manera la pregunta sobre el mogravebil nomeacutes es dispararagrave quan lrsquousuari hagi contestat a la preguntadel seu nom
432 I si vull saltar-me una pregunta
En alguns casos ens podem trobar amb la situacioacute de tenir una pregunta ja resolta impliacutecitament enla resposta drsquoalguna pregunta pregravevia Per exemple suposem que volem preguntar-li a una persona si volprendre alguna beguda alcohogravelica perograve pregraveviament li hem preguntat la edat en aquesta persona Podriacuteemfer-ho de dues maneres
1 Com fins ara amb
1 (defrule preguntar-alcohol2 (edat major-edat)3 =gt4 (5 if (yes-or-no-p Vols prendre alguna beguda alcoholica)6 then (assert (alcohol si))7 else (assert (alcohol no))8 )9 )
Aquesta solucioacute funcionaria perograve imaginem que tambeacute hem preguntat a lrsquousuari quina eacutes la seva religioacuteSi lrsquousuari ha contestat ldquoreligioacute musulmanardquo aleshores tampoc li haurem de preguntar si vol prendrealcohol Haurem drsquoafegir a la part esquerra de la regla una sentencia com
(not (religio musulmana))
com a prerequisit i haurem de fer el mateix amb cadascun dels fets o motius que impliquin que lapersona no pot beure alcohol
2 Una altra manera eacutes ldquoenganyarrdquo al sistema i fer-li creure que lrsquousuari ja ha respost la pregunta sobrelrsquoalcohol actuant en el moment de preguntar per la religioacute Aixiacute
1 (defrule preguntar-religio2 =gt3 (bind religio4 (ask-question Quina religioacute practiques catogravelica musulmana budista cap))5 (if (eq religio musulmana)6 then (assert (alcohol no)) (assert (porc no)))
I despreacutes
1 (defrule preguntar-alcohol2 (not (alcohol si_o_no)3 =gt4
I ja posats tambeacute
1 (defrule preguntar-porc2 (not (porc si_o_no))3 =gt4
Drsquoaquesta manera aconseguim que el sistema no pregunti a lrsquousuari si vol prendre alcohol o si volmenjar porc perquegrave en el moment de preguntar-li la religioacute hem tingut en compte aquests valors Ameacutes hem trobat una manera de implementar un flux de preguntes en el qual alhora drsquoobtenir lesrespostes no hem de modificar regles ldquofuturesrdquo (dins del flux drsquoexecucioacute de preguntes)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5159
48 Capiacutetulo 4 Consejos praacutecticos
433 Com inicialitzar el flux del programa
Per inicialitzar el flux drsquoexecucioacute tenim varies possibilitatsAlgunes drsquoelles soacuten
Definir un fet per defecte (deffact) el qual faci saltar una regla inicial per defecte (que podriacuteem definir
amb un salience alt)Per exemple
1 (deffacts tipus-usuari2 (us desconegut)3 )
Que faria saltar la regla inicial
1 (defrule inici2 (declare (salience 10))3 us lt- (us desconegut)4 =gt5 (printout t Benvingut crlf)6
Una regla inicial podria preguntar per si no existeix un fet que acabaragrave inicialitzant
Per exemple
1 (defrule inici2 (not (flor tipus))3 =gt4 (printout t Benvingut crlf)
5 6 (assert (flor rosa))
44 Uso de la funcioacuten modify para ir guardando resultados preferidos
Para empezar hemos de tener una plantilla que en el caso de un sistema para escoger platos sea dondecoloquemos los platos que se van ajustando a nuestra Esta seria su estructura
(deftemplate platos-apropiados(slot estado)
(multislot lista-platos1)(multislot lista-platos2)(multislot lista-postres)
)
Entonces cuando vayamos obteniendo resultados para ir guardandalos en los diferentes multislots tendre-mos que llamar a la instancia de dicha plantilla desde los activadores de las reglas usando como guiacutea el slotestado
paprop lt- (platos-apropiados (estado empezado))En este caso recuperariamos la instancia de platos-apropiados que ha sido inicializada en otra regla pero
mantendriamos la misma con los resultados ya guardados hasta el momento Si en esta regla quisieramos
insertar datos en otro multslot de dicha instancia (por ejemplo lista-platos2) tendriamos el siguientecoacutedigo
(modify paprop (estado empezado)(lista-platos2 $lista2))Donde lista2 seria el resultado de hacer un find-all-instances por ejemplo
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5259
45 Creacioacuten de la plantilla de recomendacioacuten 49
45 Creacioacuten de la plantilla de recomendacioacuten
Una vez aplicadas todas las reglas necesarias y manipulado todo el conocimiento que hayamos tenidoque usar en el problema deberemos mostrar los resultados al usuario Para ello si partimos de que hemostenido que construir un resultado a partir de ciertas preferencias o restricciones lo maacutes adecuado es usaruna plantilla para poner el resultado y tenerlo estructurado En este caso lo que se debe hacer es partir
de una plantilla vacia la cual se iraacute rellenando conforme calculemos los resultados La plantilla seraacute undeftemplate con los atributos que va a tener el resultado final y deberaacute estar en un aacutembito visible para todoslos moacutedulos para que asiacute la puedan ir modificando y completando
Ejemplo de plantilla de recomendacioacuten para menuacutes de restaurante
(deftemplate recomendacion Recomendacion resultante del sistema experto(slot evento)(multislot menus)(slot final)
)
Donde el slot evento guardaria una instancia de la clase Evento que contendria las propiedades de lacomida (nuacutemero invitados temporada ) el multislot menus tendria las instancias de los menuacutes finalespara proponer y el slot final seria una guia para una vez obtenidos los resultados activar la regla paramostrar los resultados por pantalla
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5359
50 Capiacutetulo 4 Consejos praacutecticos
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5459
5 Errores frecuentes
51 Quan obro un fitxer en CLIPS em dona un error
Lrsquoeditor de text de lrsquoentorn gragravefic de CLIPS no accepta fitxers meacutes grans de 65KB Aquesta quantitat debytes pot ser agravempliament superada quan introduiumlm una gran quantitat drsquoinstagravencies a la base de coneixementmitjanccedilant proteacutegeacute i la exportem a format CLIPS
Per saltar aquest problema nomeacutes hi ha una solucioacute carregar el fitxer directament per liacutenia de comandessense usar lrsquoeditor de text de CLIPS amb la comanda (load ltNOM_FITXERgt)
Per exemple
(load fitxerclp)
Per a continuacioacute fer
(reset)(run)
52 Codificacioacute de caragravecters a CLIPS
CLIPS dona forccedila problemes amb caragravecters estranys com ntilde accents diegraveresis etcEn principi no accepta Unicode ni ISO-8859-1 aixiacute que recomanem no fer servir caragravecters com els
mencionats per tal de no tenir problemes A meacutes proteacutegeacute exporta amb codificacioacute ISO-8859-15 La majoriadrsquoeditors de linux usen per defecte codificacioacute UTF-8 Aixograve eacutes un problema perquegrave alhora drsquoeditar undocument podeu perdre alguns caragravecters si no configureu la codificacioacute del vostre editor a I SO-8859-15 iaixograve provocaragrave que CLIPS no reconegui el fitxer com a vagravelid Un editor de linux que permet canviar lacodificacioacute de caragravecters usada en un fitxer eacutes kwrite (cal configurar-ho abans de comenccedilar a modificar elfitxer)
Si al carregar un fitxer tenim problemes i no ho sabem identificar eacutes uacutetil comprovar si pot haver-hi alguncaragravecter que estigui creant aquests problemes
53 iquestPor queacute me dan error algunas de las restricciones que pongo en los slots
en Protegravegegrave cuando las importo en CLIPSNo todas las restricciones sobre los slots que se pueden definir en protegravegegrave estaacuten admitidas en la sintaxis
de CLIPS Tendreacuteis problemas si poneacuteis un valor al nuacutemero de posibles valores que puede tener un slot enCLIPS soacutelo se puede indicar si un slot es obligatorio y si admite muacuteltiples valores
54 Tengo problemas con la hereacutencia de slots en las clases que he definido
A veces este problema aparece cuando se definen en protegravegegrave las superclases con role abstract Si aparecese pueden definir todas las clases con role concrete y el problema deberiacutea arreglarse
55 Quegrave significa lrsquoerror OBJRTBLD5
51
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5559
52 Capiacutetulo 5 Errores frecuentes
A lrsquoapegravendix G de la ldquoCLIPS Basic Programming Guiderdquo trobaragraves el significat de tots els errors que doacutenaCLIPS
56 Antes compilaba correctamente y ahora da warnings
[CSTRCPSR1] WARNING Redefining defrule imprimir +j+jSi aparecen warnings como este a la hora de compilar en todas las funciones reglas etc que se han definido
en el coacutedigo es posible que no se haya hecho un clear antes de compilar nuevamente Para ello usar laopcioacuten del menu Execution rarr Clear Clips o bien en la ventana de entrada de CLIPS escribir (clear)Luego volvemos a cargar el fichero
Este problema es debido a que los moacutedulos no pueden ser ni redefinidos ni borrados una vez que sedefinen (con la excepcioacuten del moacutedulo MAIN que puede ser redefinido una vez) La uacutenica forma de eliminarun moacutedulo es con el comando clear
57 No puedo editar mi fichero en clips
Esto es debido a que el clp ha llegado a su maacutexima extensioacuten Para solucionar el problema debemosabrirlo con un editor de texto externo y proceder como siempre es decir
Execution -gt Clear ClipsExecution -gt Load (seguiremos cargando el clptxt que
hemos modificado y guardado previamente en el editor de texto)Execution -gt ResetExecution -gt Run
58 Redefining
Este warning es debido en el mayor nuacutemero de casos a que existen dos o maacutes reglas funciones quetienen el mismo nombre Para solucionarlo obviamente cambiar el nombre de cada una de manera que nocompartan nombres
59 Problemas al consultar las instancias relacionadas con otras
Por alguna razoacuten desconocida CLIPS solo busca instancias en el modulo actual y no en todos los impor-tados La solucioacuten maacutes praacutectica es la que explica en 357 Otra solucioacuten es antildeadir a todas las instancias dela ontologiacutea el cualificador del modulo principal Si se substituye en el fichero de las instancias la cadena ldquo[rdquopor ldquo[MAINrdquo estaraacute todo solucionado
Por ejemplo
([pracIA_Instance_30001] of Bebida rarr ([MAINpracIA_Instance_30001] of Bebida
510 Unable to finde class X cuando definimos instancias
Defining definstances instancias[PRNTUTIL1] Unable to find class Plato
ERROR
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5659
511 Expected the beginning of a construct (cuando definimos instancias) 53
(definstances MAINinstancias([pracIA_Instance_1] of Plato
Si nos aparece algo parecido a esto cuando compilamos nuestro programa significa que no encuentra laclase a la que pertenece la instancia Es posible que hayamos definido primero las instancias y luego lasclases Para corregirlo seguir la estructura comentada en el fichero de CLIPS ontologiacutea + instancias +
coacutedigo
511 Expected the beginning of a construct (cuando definimos instancias)
Si nos aparece este error justo donde definimos las instancias es posible que sea porque no hayamosseguido la correcta estructura para antildeadir instancias en nuestro coacutedigo (definstances cualquiernombreINSTANCIAS )
512 Compila pero no compara bien dos elementosPosiblemente se trata de que estemos realizando la comparacioacuten de dos cadenas de caracteres con el
operador eq Existe una funcion especifica para comparar dos strings str-compare explicada en el apartadode funciones
513 Expected the beginning of a constructor
Aquest error sol ser molt frequumlent i es pot donar per diversos motius
1 El primer i meacutes frequumlent eacutes perquegrave hem posat un paregraventesis tancat ldquo)rdquo de meacutes Surt quan per exempletenim
(assert (processador AMD) ) ) ltndash lrsquouacuteltim paregraventesis sobra
Haurem de repassar quin ha estat el codi que hem retocat que ens ha incorporat aquest error i trobarel paregraventesis que sobra
2 El segon motiu pel qual tambeacute es pot donar aquest error eacutes perquegrave per exemple no hem encapsulatel codi de les instagravencies generades automagraveticament mitjanccedilant proteacutegeacute dins la clau
(definstances nominstancies
ltinstagravenciesgt)
En definitiva el que aquest error ens estagrave indicant eacutes que CLIPS espera la construccioacute drsquouna re-glafuncioacuteaccioacuteetc i en comptes drsquoaixograve es troba amb qualsevol altra cosa un paregraventesis tancat unainstagravencia etc
514 Missing function declaration for defruledeffunction
Aquest error acostuma a donar-se quan ens hem descuidat de posar el paregraventesis que tanca la definicioacute
drsquouna reglafuncioacuteetc i aquesta es ldquosolapardquo amb la seguumlent reglafuncioacuteetc Per exemple
(defrule pregunta-A(precondicio pre)
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5759
54 Capiacutetulo 5 Errores frecuentes
=gt(assert (accio realitzada))
lt--- aquiacute falta un paregraventesis que tanqui la regla
(deffunction funcio-B
)
515 Check appropiate syntax for ifswitchloop-for-count
Aquest error ens apareixeragrave quan no hem respectat la sintaxi drsquoalguna de les estructures de control de fluxcom if switch loop-for-count etc Pot deurersquos a qualsevol motiu (falta de paregraventesis expressions incorrectes)perograve sempre dins de la estructura de control que ens indica CLIPS
Per exemple
(switch (resposta) lt---- sobren els paregraventesis que engloben la resposta
(case 1 then (assert (fet primer)) )
)
516 Problemas con pareacutentesis
Se trata de uno de los errores maacutes tiacutepicos a la hora de compilar y a su vez maacutes difiacuteciles de depurar Elproblema se encuentra en que no hemos cerrado todos los pareacutentesis que se han abierto Una forma raacutepidapara comprobar si la forma de colocar los pareacutentesis es la correcta seria sumar 1 cuando se abre un pareacutentesis
y restar 1 cuando se cierra de manera que si al final su coacutemputo es 0 es correcto Por ejemplo( ( 2 + 3 ) ( 4 ( 1 + 1 ) ) )
0 1 2 1 2 3 2 1 0
Es muy recomendable y facilita mucho la tarea de encontrar bugs ponerlos tabulados con comentario en elcierre
(while) endwhile
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5859
6 Referencias
61 On puc trobar informacioacute sobre el llenguatge CLIPS
Llegeix-te la ldquoCLIPS User Guiderdquo Eacutes un document que explica amb un llenguatge senzill tot el que espot fer amb CLIPS comenccedilant amb coses fagravecils i es va complicant mica en mica Veuragraves que eacutes una micallarga perograve eacutes prou entretinguda de llegir La pots trobar a lrsquoadreccedila seguumlent
httpwwwghgnetclipsdownloaddocumentationusrguidepdf No obstant a la ldquoCLIPS UserGuiderdquo nomeacutes hi ha els conceptes meacutes importants Si no trobes alguna cosa consulta la ldquoCLIPS BasicProgramming Guiderdquo que trobaragraves aquiacute
httpwwwghgnetclipsdownloaddocumentationbpgpdf
62 Otras referencias
httpwwwlsiupcedu˜bejariamateriallaboratorioclipsclips4pdf
httpwwwgsiditupmes˜cifcursosssiiclipshtmlclips-index
httpwwwgeocitiescomaitorsjshtmlclipspdf
httpscalabuc3mes˜docwebiapracticasclipspdf
httpvmbenetiespanaesIMGpdfFpract3pdf
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
httpwwwlsiupces˜bejariamateriallaboratorioclipsbpgpdf
httpwwwlsiupces˜bejariamateriallaboratorioclipsusrguidepdf
Manual molt bo (i extens) de CLIPS escrit per Aitor San Juan Saacutenchez (castellagrave)
httpwwwgeocitiescomaitorsjshtmlclipspdf
Basic programming guide (anglegraves)
httpwwwcsientuedutw˜syleecoursesclipsbpgnode1html
Basic Programing guide Vol 1 (anglegraves)
httpwwwgsiditupmesdocsclipsdocsclipshtmlvol1html
Manual resumit de clips (castellagrave)
httpscalabuc3mes˜docwebiamanualmanualmanualhtml
Manejo Baacutesico de clips (castellagrave)
httptrevincaeiuvigoes˜jgarciaSIEXClipshtml
6 Tutorials curts de clips (anglegraves)
httpiwebtntechedubhuguenardds6530ClipsTutorialtableOfContentshtm
Un fograverum (com el fograverum de IA de la FIB) drsquoun altre universitat espanyola (castellagrave)
httpsappslabinfuc3mesforoviewforumphpf=59
55
5142018 FAQ-CLIPS - slidepdfcom
httpslidepdfcomreaderfullfaq-clips 5959
56 Capiacutetulo 6 Referencias
Problemes resolts sobre CLIPS (anglegraves)
httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml