Sunteți pe pagina 1din 50

Inteligencia Artificial

(laboratorio)

CLIPS
Primavera 2009
profesor: Luigi Ceccaroni

Por qu CLIPS?
Qu relacin hay entres los altibajos de la IA a finales de los 80s y principio de los 90s, y el tener que aprender un nuevo lenguaje en cuarto de carrera? Qu importancia tiene para m el colapso del mercado de las mquinas Lisp del 1987?

The collapse of the Lisp machine market in 1987


In the 1980s a form of AI program called an "expert system" was adopted by corporations around the world. The first commercial expert system was XCON, developed at Carnegie Mellon for Digital Equipment Corporation, and it was an enormous success:
It was estimated to have saved the company 40 million dollars over just six years of operation. 3

The collapse of the Lisp machine market in 1987


Corporations around the world began to develop and deploy expert systems and by 1985 they were spending over 1 billion dollars on AI, most of it to in-house AI departments. An industry grew up to support them, including software companies and hardware companies like Lisp Machines Inc. who built specialized computers, called Lisp machines, that were optimized to process the programming language Lisp, the preferred 4 language for AI.

The collapse of the Lisp machine market in 1987


In 1987 (three years after Minsky and Schank's prediction) the market for specialized AI hardware collapsed. Desktop computers with a simpler architecture, from Apple and IBM had been steadily gaining speed and power and in 1987 they became more powerful than the more expensive Lisp machines. The desktop computers had rule-based engines such as CLIPS available which left no reason to buy a Lisp machine. An entire industry worth half a billion dollars 5 was demolished overnight.

The collapse of the Lisp machine market in 1987


Commercially, many Lisp machine companies failed, like Lisp Machines Inc., Lucid Inc. Other companies, like Texas Instruments and Xerox abandoned the field. However, a number of customer companies (that is, companies using systems written in Lisp and developed on Lisp machine platforms) continued to maintain systems. Other systems moved from Lisp to a C++ variant on the PC via object-oriented technology and helped establish the o-o 6 technology.

The fall of expert systems


Eventually the earliest successful expert systems proved too expensive to maintain:
They were difficult to update. They could not learn. They were "brittle" (i.e., they could make grotesque mistakes when given unusual inputs). They fell prey to problems that had been identified years earlier in research in nonmonotonic logic. 7

The fall of expert systems


Expert systems proved useful, but only in a few special contexts. Another problem dealt with the computational hardness of truth maintenance efforts for general knowledge. KEE used an assumption-based approach supporting multiple-world scenarios that was difficult to understand and apply
8

The fall of expert systems


The few remaining expert system shell companies were eventually forced to downsize and search for new markets and software paradigms, like:
case-based reasoning or universal database access

Failure to adapt
The fall of the Lisp machine market and the failure of the fifth generation computers were cases of expensive advanced products being overtaken by simpler and cheaper alternatives. This fits the definition of a low-end disruptive technology, with the Lisp machine makers being marginalized.
10

Failure to adapt
Expert systems were carried over to the new desktop computers by, for instance, CLIPS, so the fall of the Lisp machine market and the fall of expert systems are strictly speaking two separate events. Still, the failure to adapt to such a change in the outside computing milieu is cited as one reason for the 80's AI winter.
11

El sistema CLIPS
CLIPS is a public domain software tool for building expert systems. The name is an acronym for "C Language Integrated Production System. The first versions of CLIPS were developed starting in 1985 at NASAJohnson Space Center. The original name of the project was NASA's AI Language (NAIL).

El sistema CLIPS
CLIPS is probably the most widely used expert system tool because it is fast, efficient and free. Although it is now in the public domain, it is still updated and supported by the original author, Gary Riley. CLIPS incorporates a complete objectoriented language COOL for writing expert systems. Though it is written in C, its interface more closely resembles that of the programming language LISP. Extensions can be written in C, and CLIPS can be called from C.

El sistema CLIPS
CLIPS es un entorno para desarrollar sistemas expertos. Define un lenguaje que permite la representacin de:
conocimiento declarativo (marcos) conocimiento procedimental (reglas de produccin)

Su base es un motor de inferencias con razonamiento hacia adelante.

El lenguaje de CLIPS
Se trata de un lenguaje con notacin prefija. Los tipos de datos predefinidos que interesan son:
real entero cadena smbolo apuntador a hechos nombre de instancia apuntador a instancia

Los tipos habituales poseen los operadores comunes. El lenguaje de CLIPS ana tres paradigmas de programacin:
lenguaje de reglas lenguaje funcional lenguaje orientado a objetos

Hechos
Los dos elementos que permiten representar problemas utilizando reglas de produccin son los hechos y las reglas. Los hechos en CLIPS pueden ser de dos tipos:
ordered facts deftemplate facts

Los ordered facts tienen formato libre, por lo tanto no tienen una estructura predefinida, siguen el esquema general: (relacin p1 p2 ... pn)

relacin ha de ser un smbolo; el resto de parmetros puede ser de cualquier tipo, por ejemplo: (padre Juan Pedro) (num-hijos Juan 2)

Hechos
Los deftemplate facts tienen una estructura predefinida; pueden asimilarse a representaciones al estilo de las ontologas. En estos hechos se define una serie de campos (slots) que enmarcan su estructura. Cada campo puede tener una serie de restricciones como:
tipo cardinalidad un valor por defecto que puede ser:
una constante un funcin para calcularlo

Hechos
Sintaxis:
(deftemplate nombre-template "comentario (slot nombre-slot1) (slot nombre-slot2))

Por ejemplo:
(deftemplate persona persona humana / hombre (slot nombre (type STRING)) (slot edad (type INTEGER) (default 0)))

Hechos
La creacin de hechos se realiza mediante la sentencia assert (uno solo) o deffacts (un conjunto), por ejemplo:
(assert (padre Pepe Juan)) (assert (persona (nombre "pedro") (edad 25))) (deffacts mis-hechos (casa roja) (pelota verde) (persona (nombre "luis) (edad 33)))

Hechos
(facts) permite saber que hechos hay definidos. (clear) borra todos los hechos definidos. (retract <ndice-hecho>) elimina el hecho identificado por el ndice dado. (get-deftemplate-list) retorna la lista de deftemplates definidos.

Reglas
Las reglas en CLIPS estn formadas por:
Una parte izquierda (LHS) que define las condiciones a cumplir Una parte derecha (RHS) que define las acciones a realizar

Sintaxis:
(defrule nombre-regla "comentario" (condicin-1) (condicin-2) ... => (accin-1) (accin-2) ...)

Variables
Para poder establecer patrones en las condiciones de las reglas hacen falta variables Las variables en CLIPS se denotan poniendo un interrogante delante del nombre (?variable) Existen variables annimas (no importa su valor) para un valor ? o para mltiples valores $? Durante la ejecucin de las reglas se buscan los valores que instancien las variables y permitan cumplir las condiciones Las variables de las reglas son locales, si queremos definir variables globales debemos usar la construccin defglobal (las variables globales se denotan ?*variable*)

Notacin
square brackets [...]
contents are optional: (example [test])

pointed brackets (less than / greater than signs) < ... >
replace contents by an instance of that type (example <char>)

star *
replace with zero or more instances of the type <char>*

plus +
replace with one or more instances of the type <char>+ (is equivalent to <char> <char>* )

vertical bar |
choice among a set of items: true | false

Reglas de CLIPS: LHS


En la parte izquierda de una regla pueden aparecer diferentes tipos de condiciones:
Patrones constantes, con variables o con wildcards: se instancian directamente con hechos en la base de hechos. Expresiones not, and, or, exist y forall con patrones. Tests de expresiones sobre las variables vinculadas.

Los patrones indican qu tipo de hechos deben instanciar las reglas y se establecen a travs de restricciones sobre variables o valores constantes. Estas restricciones se pueden combinar mediante conectivas lgicas: ~ (no) & (y) 24 | (o)

Ejemplos de LHS
Personas de nombre juan o pedro: (persona (nombre juan|pedro)) Personas con nombres diferentes: (persona (nombre ?x)) (persona (nombre ?y&~?x)) Nadie se llama pedro: (not (persona (nombre pedro))) Todo el mundo es mayor de edad: (forall (persona (nombre ?n) (edad ?x)) (test (> 25 ?x 18)))

El lenguaje de reglas de CLIPS


En la parte derecha de las reglas (RHS) podemos poner cualquier sentencia vlida en CLIPS (ver manual de referencia). Podemos obtener la direccin de un hecho para usarlo en la RHS mediante el operador <-, por ejemplo: (defrule mi-regla ?x <- (persona (nombre juan)) => (retract ?x) 26 )

Reglas de CLIPS: mdulos


Las reglas de CLIPS se pueden agrupan/organizar en mdulos. La ventaja principal es el poder estructurar el conocimiento y poder enfocar la ejecucin de las reglas segn su objetivo. La definicin de un mdulo se realiza mediante la construccin: (defmodule <nombre> "comentario" <exportimport>) Nada de lo definido en un mdulo es visible salvo que lo exportemos. Para utilizar construcciones de otro mdulo tambin tenemos que importarlas explcitamente. Existe un mdulo por defecto llamado MAIN al que pertenece todo lo no definido en otro mdulo. 27

Reglas de CLIPS: mdulos


Podemos definir construcciones pertenecientes a un mdulo poniendo como prefijo de su nombre el nombre del mdulo seguido de dobles dos puntos ::, por ejemplo: (deftemplate A::cubo (slot tamao)) La exportacin de construcciones de un mdulo se realiza incluyendo la sentencia export en su definicin. Podemos exportar cualquier cosa que definamos, por ejemplo: (defmodule A (export deftemplate cubo)) (defmodule A (export deftemplate ?ALL)) La importacin de construcciones a un mdulo se realiza incluyendo la sentencia import en su definicin. Podemos importar cualquier cosa visible que est definida en otro mdulo, por ejemplo: 28 (defmodule B (import A deftemplate cubo))

Reglas de CLIPS: foco


Podemos restringir qu mdulos se usan para la ejecucin de reglas mediante la sentencia: (focus <modulo>*)

Esta sentencia se puede incluir en la parte derecha de una regla para poder cambiar explcitamente de mdulo. Se puede hacer que la ejecucin se enfoque en el mdulo de la ltima regla ejecutada declarando la propiedad autofocus en una regla, por ejemplo: (defrule JUAN::mi-regla (persona (nombre juan)) => ... (declare (auto-focus TRUE))
29

Estrategias de resolucin de conflicto


El intrprete de reglas tiene predefinidas unas estrategias de resolucin de conflicto
Profundidad: las nuevas activaciones pasan al principio. Anchura: las nuevas activaciones pasan al final. Simplicidad: se prefiere la regla menos especfica (especificidad medida respecto a las condiciones). Complejidad: tienen preferencia las reglas ms especficas. LEX: se asocia a cada hecho el tiempo en que fue creado y se da mayor prioridad a las reglas con un hecho ms reciente. MEA: se aplica la misma estrategia de LEX mirando slo el primer patrn; si coincide se aplica LEX. Aleatoria: se disparan las reglas en orden aleatorio. 30

El lenguaje de programacin
CLIPS incluye un lenguaje de programacin que permite definir nuevas funciones o programar las acciones a realizar en la parte derecha de las reglas. Toda sentencia o estructura de control es una funcin que recibe unos parmetros y retorna un resultado (paradigma funcional).
31

Sentencias
Estas son las sentencias y estructuras de control mas utilizadas:
(bind <var> <valor>): Asignacin a una variable; retorna el valor asignado. (if <exp> then <accin>* [else <accin*>]): Sentencia alternativa; retorna el valor de la ultima accin evaluada. (while <exp> do <accin>*): Bucle condicional; retorna falso, excepto si hay una sentencia de retorno que rompa el bucle. (loop-for-count (<var> <val-i> <val-f>) do <accin>*): Bucle sobre un rango de valores; retorna falso, 32 excepto si hay una sentencia de retorno.

Sentencias
Estas son las sentencias y estructuras de control mas utilizadas:
(progn <accin>*): Ejecuta un conjunto de sentencias secuencialmente; retorna el valor de la ltima. (return <expr>): Rompe la ejecucin de la estructura de control que la contiene retornando el valor de la expresin. (break): Rompe la ejecucin de una estructura de control. (switch <expr> (case (<comp>) then <accin>*)* [(default <accion>*)]): Estructura alternativa caso; cada caso hace una comparacin con el valor evaluado; retorna la ltima expresin evaluada o falso si ninguna sentencia caso se cumple. 33

Funciones
La construccin deffunction permite definir nuevas funciones
(deffunction <nombre> "Comentario" (<?parmetro>* [<$?parmetro-W>]) <accin>*)

parmetro-W incluye en una lista el resto de parmetros opcionales. La funcin retorna la ltima expresin evaluada.
34

Orientacin a objetos en CLIPS


Aparte de poder importar una ontologa creada en Protege, CLIPS define tambin una extensin orientada a objetos que complementa la capacidad de representar la estructura del conocimiento. Se puede considerar como una extensin del constructor deftemplate que pretende completar la posibilidad de usar ontologas como herramienta de representacin. Se pueden definir clases como en los lenguajes orientados a objetos, con slots y mtodos. CLIPS tiene definido un conjunto inicial de clases que organizan los tipos predefinidos, estableciendo una 35 jerarqua entre ellos.

Orientacin a objetos en CLIPS


La sentencia que permite definir una clase es defclass. Para definir una clase hay que especificar: 1. El nombre de la clase 2. Una lista de sus superclases (Heredar de estas sus slots y mtodos.) 3. Declaracin de si es una clase abstracta o no (En este ltimo caso se permite definir instancias.) 4. Si se permite que instancias de la clase puedan vincularse a patrones en la LHS de una regla 5. Definicin de los slots de la clase Toda clase debe tener como mnimo una superclase.
36

Orientacin a objetos en CLIPS


Por ejemplo:
(defclass ser-vivo (is-a USER) (role abstract) (pattern-match non-reactive) (slot respira (default si))) (defclass persona (is-a ser-vivo) (role concrete) (pattern-match reactive) (slot email))

37

Orientacin a objetos: slots


La definicin de un slot incluye un conjunto de propiedades; algunas son:
(default ?DERIVE|?NONE|<exp>*) (access read-write|read-only|initialize-only) (propagation inherit|no-inherit) (create-accessor ?NONE|read|write|readwrite)

Evidentemente, tambin se puede (se debera) declarar el tipo, la cardinalidad...


38

Orientacin a objetos: instancias


Para crear instancias de una clase se usa la sentencia make-instance. Al crear una instancia debemos dar valor a los slots que posee, por ejemplo: (make-instance juan of persona (nombre "juan")) Podemos crear conjuntos de instancias con la sentencia definstances, por ejemplo: (definstances personas (juan of persona (email "juan@upc.edu")) (maria of persona (email "maria@upc.edu")) ) 39

Orientacin a objetos: mensajes


Toda la interaccin con los objetos se realiza mediante mensajes. Estos mensajes tienen manejadores (message handlers) que los procesan y realizan la tarea indicada. Se definen mediante la sentencia defmessagehandler. Su sintaxis es idntica a la de las funciones:
(defmessage-handler <clase> nombre <tipo-h> (<param>*) <expr>*)

Existen diferentes tipos de message handlers. Es suficiente trabajar con los primary.
40

Orientacin a objetos: mensajes


Por defecto toda clase tiene definidos un conjunto de message handlers, por ejemplo: init, delete, print. Al definir create-accessor en un slot estamos creando mensajes del tipo get-nombreSlot, set-nombreSlot, para acceder y modificar el valor del slot. El acceso a los slots del objeto dentro del cual un message handler est definido se realiza mediante la variable ?self, poniendo : delante del nombre del slot, por ejemplo: (defmessage-handler persona escribe-email () (printout t email:" ?self:email crlf))
41

Orientacin a objetos: mensajes


El envo de mensajes a una instancia se realiza mediante la sentencia send.
El nombre de la instancia se pone entre corchetes, por ejemplo:
(send [juan] escribe-email) (send [juan] set-email juan@gmail.com")

Los message handlers se pueden redefinir en cada clase. Las subclases pueden ejecutar los message handlers de sus superclases.
Si hay ms de uno con el mismo nombre, por defecto se ejecuta el de la clase ms especfica. Si se quiere ejecutar los de las superclases se ha de usar la sentencia call-next-handler.
42

Orientacin a objetos: instancias y reglas


Para poder usar instancias en las reglas se utiliza la sentencia object, por ejemplo:
(defrule regla-personas
(object (is-a persona) (email ?x)) => ...

La clase se ha de haber declarado como utilizable en la LHS de las reglas. La modificacin de un slot de una instancia vuelve a permitir que se pueda volver a 43 instanciar una regla con ella.

CLIPS: la aplicacin

44

Manejo del intrprete de CLIPS


Ventanas:
intrprete hechos (definidos y obtenidos durante la ejecucin) instancias (de las clases definidas) variables globales (Globals) foco (mdulos en los que est el foco) agenda (activaciones posibles)
45

Manejo del intrprete de CLIPS


A travs de los mens se puede acceder a los comandos mas comunes (ejecucin, parada, debugging, visualizacin de definiciones, configuracin).

46

Manejo del intrprete de CLIPS: comandos


(facts) lista los hechos que hay en la base de hechos (reset) borra todos los hechos que hay en la base de hechos (clear) borra todos los hechos y las reglas (rules) lista las reglas definidas (load "nombre.clp") carga un fichero CLIPS (save "nombre.clp") salva todos los deffacts, defrule y deffunction en un fichero
47

Manejo del intrprete de CLIPS: ejecucin


(run [<entero>]) ejecuta el motor de inferencia, un nmero de pasos o hasta el final, si no se pasa ningn parmetro (agenda [<modulo]>) muestra todas las posibles activaciones o slo las de un mdulo (focus <modulo>+) pone el foco de ejecucin en los mdulos indicados (halt), para la ejecucin del motor de inferencias (set-strategy <estrategia>) cambia la estrategia de resolucin de conflictos
48

Manejo del intrprete de CLIPS: debugging


(watch <item>) informa sobre <item> durante la ejecucin, donde <item> puede ser entre otros:
facts <hechos>*, informa sobre los hechos indicados rules <regla>*, informa sobre las reglas indicadas activations <regla>*, informa sobre la activacin de las reglas indicadas deffunctions <funcion>*, informa sobre las funciones indicadas all, informa sobre todo

(unwatch <item>), elimina el watch correspondiente

49

Manejo del intrprete de CLIPS: debugging


(set-break <regla>), introduce un punto de ruptura de ejecucin en la regla (remove-break <regla>), elimina un punto de ruptura de ejecucin en la regla (show-breaks), muestra los puntos de ruptura definidos (matches <regla>), indica las instanciaciones posibles para una regla (dribble-on <fichero>) y (dribble-off), redirecciona la informacin de la traza a un 50 fichero y elimina la redireccin

S-ar putea să vă placă și