FAQ-CLIPS

59
 Intel.lig ` encia Articial CURS 2011/2012 1Q FAQ de CLIPS Departament de Llenguatges i Sistemes Inform ` atics Enginyeria en Inform ` atica cbea

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

5142018 FAQ-CLIPS - slidepdfcom

httpslidepdfcomreaderfullfaq-clips 5959

56 Capiacutetulo 6 Referencias

Problemes resolts sobre CLIPS (anglegraves)

httppesonammuedumy˜ytbautes3211expert_systems_problems_and_solhtml