Você está na página 1de 56

Universidade Federal de Campina Grande Centro de Cincias e Tecnologia Departamento de Engenharia Mecnica

Jess Java Expert System Shell


Diego Charles da Silva Basilio diegocharles@criativocomum.com.br

ndice
2

O que Jess

Recursos Aplicaes do Jess Formas de utilizao A Linguagem Jess Simbologia em Jess Controle de Fluxo Trabalhando com Funes

Escrevendo Java com Jess

diegocharles.basilio@yahoo.com.br

O que Jess
3

Jess uma linguagem de propsito geral, desenvolvida

em Java para proporcionar o desenvolvimento de programas baseados em regras.

diegocharles.basilio@yahoo.com.br

O que Jess
4

Recursos: Plataforma de Edio Java 2 Pacote Jess Java Virtual Machine com HotSpot

Mensagem de inicializao do prompt: Jess, the Expert System Shell Copyright 2003 E.J. Friedman Hill and the Sandia Corporation Jess Version 6.1 4/9/2003 Jess>

diegocharles.basilio@yahoo.com.br

Recursos
5

Utilizando o Jess em um Pentium III 800MHz possvel: Processar 80,000 regras por segundo 600,000 operaes matemticas Trabalhar mais de 100,00 fatos na memria de trabalho Executar um lao com 400,000 iteraes por segundo

diegocharles.basilio@yahoo.com.br

Aplicaes
6

Jess tem sido usado em grande escala no desenvolvimento de softwares comerciais, incluindo:
Sistemas Especialistas que avaliam requisies de

segurana e aplicaes financeiras; Agente que predizem preos de produtos em estoque, compra e venda com segurana; Deteco de invaso em networks e auditoria de segurana; Switches em pequenas redes de telecomunicao Servidores que executam regras de negcios Sites de comrcio eletrnico inteligente Jogos

diegocharles.basilio@yahoo.com.br

Aplicaes
7

Formas de utilizao:
Podemos usar Jess como um motor de regras. Um programa baseado em regras pode conter centenas ou milhares de regras, e Jess ir continuamente aplic-las aos seus dados, constituindo um sistema especialista.
Jess comumente utilizado como script dinmico ou como ambiente para desenvolvimento rpido de aplicaes. Jess possibilita a interpretao e execuo de cdigo Java sem a necessidade de compilao. Jess pode ser utilizado como em linha de comando, aplicaes GUI servlets e applets ou embarcado sob controle de cdigo Java.
diegocharles.basilio@yahoo.com.br

A linguagem Jess
8

Suporte

Variveis Estruturas Controle de Fluxo Funes

Caractersticas
Simblica Formulrio Livre

diegocharles.basilio@yahoo.com.br

A linguagem Jess
9

Variveis:
?a ?all-values ?counter

Comuns
Jess> (bind ?x O valor O valor

Globais
Jess> (defglobal ?*x* = 3) TRUE

Visualizao
diegocharles.basilio@yahoo.com.br

Jess> ?a 4

A linguagem Jess
10

Estruturas Listas (plain list)


Jess> (bind ?lista-mantimentos (create$ ovos pao leite)) (ovos pao leite)

Acessando o valor
Jess> ( printout t (nth$ 2 ?lista-mantimentos) (pao)

Outras duas funes relacionadas a plain lists so:


Jess> ( first$ ?lista-mantimentos) (ovos) Jess> ( rest$ ?lista-mantimentos) (pao leite)
diegocharles.basilio@yahoo.com.br

A linguagem Jess
11

Controle de Fluxo
apply Chama uma funo dados os argumentos

build Passa e execute uma chamada de funo de uma string


eval Passa e execute uma chamada de funo de uma string foreach Executa um bloco de cdigo uma vez para cada item da lista if/then/else Escolhe atravs de alternativas a direo da ao

progn Executa chamada de funes agrupadas


while executa um bloco de cdigo enquanto uma expresso for

verdadeira

diegocharles.basilio@yahoo.com.br

A linguagem Jess
12

Foreach
Jess> (bind ?lista-mantimentos (creat$ ovos leite pao)) (ovos leite pao) Jess> (foreach ?e ?lista-mantimentos (printout t ?e crlf))

ovos leite pao

while
Jess> (bind ?i 1) 1 Jess> (bind ?sum 0) 0 Jess> (while (<= ?i 10) do (bind ?sum (+ ?sum ?i)) (bind ?i (+ ?i 1)))
diegocharles.basilio@yahoo.com.br

FALSE

A linguagem Jess
13

If/then/else
Jess> (bind ?lista-mantimentos (create$ ovos leite pao)) (ovos leite pao) Jess>(if (member$ ovos ?lista-mantimentos) then (printout t Preciso comprar ovos. crlf) else (printout t Ovos no, obrigado! crlf))

Preciso comprar ovos

diegocharles.basilio@yahoo.com.br

A linguagem Jess
14

Progn
Jess> (bind ?n 2) 2 Jess> (while (progn (bind ?n (*?n ?n) (< 1000)) do (printout t ?n crlf))

4 16 256 FALSE

diegocharles.basilio@yahoo.com.br

A linguagem Jess
15

Apply
Jess> (apply (read) 1 2 3) +

Eval
Jess> (bind ?x (+ 1 2 3)) (+ 1 2 3) Jess> (eval ?x)

Build
Usada para montar regras!
diegocharles.basilio@yahoo.com.br

A linguagem Jess
16

Definindo funes
Jess>(deffunction distancia (?x1 ?y1 ?z1 ?x2 ?y2 ?z2) Calcula a distancia entre dois pontos no espaco (bind ?x(- ?x1 ?x2)) (bind ?y(- ?y1 ?y2)) (bind ?x(- ?z1 ?z2)) (bind ?distancia(sqrt (+ (* ?x ?x) (* ?y ?y) (* ?z ?z)))) (return ?distancia))

TRUE

Chamando
Jess> (distancia 10 0 0 2 0 0)

diegocharles.basilio@yahoo.com.br

A linguagem Jess
17

Definindo funes complexas


Jess> (deffunctions min (?a ?b) (if (< ?a ?b) then (return ?a) else (return ?b)))

TRUE

O mesmo que:
Jess> (deffunctions prox (?a ?b) (if (< ?a ?b) then ?a else ?b))

TRUE

diegocharles.basilio@yahoo.com.br

A linguagem Jess
18

Late binding (defadvice) Aplicando conselhos


No seguinte exemplo uma funo que aconselha ao Jess ler uma lista com ndices iniciando em 0s comeando do 1

Antes

Jess> (bind ?lista-mantimentos (create$ ervilhas feijao manteiga leite))

(ervilhas feijao manteiga leite) ervilhas

Jess> (nth$ 1 ?lista-mantimentos)

diegocharles.basilio@yahoo.com.br

A linguagem Jess
19

Late binding (defadvice) Aplicando conselhos Depois


Jess> (defadvice before nth$ ;; escrito fora do nome da funcao (bind ?cauda (rest$ ?argv)) ;;Converte indices inciando com 0 para indices iniciando com 1 (bind ?indice (+ 1 (nth$ 1 ?cauda))) ;; coloca a lista de argumentos para trs. (bind ?argv (create$ nth$ ?indice (rest$ ?cauda))))

TRUE feijao

Jess> (nth$ 1 ?lista-mantimentos)

diegocharles.basilio@yahoo.com.br

Escrevendo Java com Jess


20

Criando objetos Java Tipos de dados Chamando mtodos Java Colees Overloaded Data members Excees

diegocharles.basilio@yahoo.com.br

Escrevendo Java com Jess


21

A mais poderosa caracterstica do Jess aquela a interao com o Java.

A partir do cdigo Java, voc pode acessar todas as partes da biblioteca Jess, de modo que seja muito fcil encaixar Jess em qualquer aplicao Java, servlet, applet, ou outro sistema.
Do mesmo modo, a partir da linguagem Jess, todo o poder de Java est diretamente disponvel.

diegocharles.basilio@yahoo.com.br

Criando objetos Java


22

Atravs da funo new do Jess podemos criar instncias para as classes Java

Atravs da instncia podemos criar um objeto de uma classe e armazen-lo em uma varivel Jess. Ex. Criar um hashMap
Jess> (bind ?precos (new java.util.HashMap)) <External-Address: java.util.HashMap>

diegocharles.basilio@yahoo.com.br

Criando objetos Java


23

Para evitar o excesso de digitao para especificao da

classe (java.util.HashMap) , assim como em Java, Jess possui uma funoimport:


Jess> (import java.util.*) TRUE Jess> (bind ?precos (new HashMap)) <External-Address: import java.util.HashMap>

O * significa para importar todas as classe deste pacote.

diegocharles.basilio@yahoo.com.br

Tabela 1.1. Converso de tipos Jess para tipos Java


Tipo Jess
RU.EXTERNAL_ADDRESS O simbolo nil O simbolo TRUE ou FALSE RU.ATOM (um simbolo), RU.STRING RU.FLOAT RU.INTEGER

Possvel tipo Java


O Objeto envolvido Referncia a null String, java.lang.Boolean, or Boolean String, char ou java.lang.Character Float, double, e seus envolvidos Long, short, int, byte, char e seus envolvidos

RU.LONG

Long, short, int, byte, char e seus envolvidos

RU.LIST

Um array Java

diegocharles.basilio@yahoo.com.br

24

Tabela 1.2. Converso de tipos Java para tipos Jess


Tipo Java
Referncia a null Um valor vazio de retorno (void) String boolen ou java.lang.Boolean byte, short, int, ou seus envolvidos long, ou java.lang.Long double, float, ou seus envolvidos Char ou java.lang.Character Um array Qualquer outra coisa diegocharles.basilio@yahoo.com.br O smbolo nil O smbolo nil RU.STRING O smbolo TRUE ou FALSE RU.INTEGER RU.LONG RU.FLOAT RU.ATOM (um simbolo) Uma List RU.EXTERNAL_ADDRESS

Tipo Jess

25

Chamando mtodos Java


26

Se tivermos uma referncia a um objeto Java em uma

varivel Jess podemos invocar qualquer mtodo deste objeto utilizando a funo call.
Jess> Jess> Jess> Jess> 1.99 (call (call (call (call ?precos ?precos ?precos ?prices put put put get pao 0.99) ervilhas 1.99) feijao 1.79) ervilhas)

O primeiro argumento para call um objeto Java o

segundo argumento o nome do mtodo a ser invocado. O restante so parmetros passados para o mtodo Java.

diegocharles.basilio@yahoo.com.br

Chamando mtodos Java


27

Aninhando chamadas de funes e atalhos

possivel suprimir o simbolo call em alguns casos


Jess> (call ?precos put pao 0.99)

O mesmo que:
Jess> (?precos put pao 0.99)

Quando o primeiro elemento de uma chamada de funo um objeto Java, Jess admite que deve incluir o smbolo call e invocar a funo no objeto.
diegocharles.basilio@yahoo.com.br

Chamando mtodos Java


28

O mesmo ocorre se o primeiro elemento de uma chamada

da funo for uma outra chamada de funo

Jess> (bind (?precos (new HashMap)) put bread 0.99)

Esta nica linha de cdigo cria um HashMap, liga-o a uma

varivel adicionando dois pares de valores opcional.

Para a maioria das chamadas de mtodos, o call

Entretanto, voc no poder deix-lo de fora quando voc

estiver chamando mtodos estticos.

diegocharles.basilio@yahoo.com.br

Chamando mtodos Java


29

Chamando mtodos estticos

Mtodos statics ou class no cdigo Java so aqueles mtodos que podem ser chamados sem referncia a um objeto especfico. Em Java como no cdigo Jess, voc pode usar apenas o nome da classe Java para invocar algum dos mtodos estticos. Ex. mtodo java.lang.thread.Sleep

Jess> (call thread sleep 1000) (espera por 1 seg.) Jess>

diegocharles.basilio@yahoo.com.br

Chamando mtodos Java


30

Chamando mtodos set e get

Eles so frequentemente chamados acessores e modificadores, ou getters e setters. Eles so muito comuns em Java e formam uma importante parte da especificao JavaBeans. Jess inclui as funes set e get, que podem ser usadas como alternativa para call, para aplicar e adquirir.

diegocharles.basilio@yahoo.com.br

Chamando mtodos Java


31

Os seguintes pares de chamadas de funes so

equivalentes:
Jess> (bind ?b (new javax.swing.JButton)) <External-Address: javax.swing.JButton> Jess> (?b setText Pressione me)

ou
Jess> (set ?b text Pressione me)

ou

Jess> (?b getText) Pressione me

Jess> (get ?b text) Presione me diegocharles.basilio@yahoo.com.br

Colees
32

Trabalhando com Array (vetores) Jess automaticamente converte vetores Java para plain lists ( valores do tipo RU.LIST)
Voc pode usar o mtodo toArray na

java.util.collection para extrair todas as chaves de um HashMap para uma lista Jess.
Jess> (bind ?lista-mantimentos ((?precos keySet)toArray)) (pao ervilhas feijao)

diegocharles.basilio@yahoo.com.br

Colees
33

Trabalhando com Array (vetores)

Disponibilidades
Passar listas Jess para

Possibilidades
Criar funes em cdigo

arrays Java e vice-versa


Limite de uma dzia de

Java e cham-las a partir de Jess criando extenses da linguagem

itens por conjunto


No possui interface para

arrays multidimensionais
diegocharles.basilio@yahoo.com.br

Colees
34

Ex. Passando uma plain list como argumento para um construtor JComboBox
Jess> (import javax.swing.JComboBox) Jess> (bind ?jcb (new JComboBox ?lista-mantimentos)) <External-Address: javax.swing.JComboBox>

Jess converte automaticamente uma plain list em um array Java


ToArray

?Lista-mantimentos
Jess Java

diegocharles.basilio@yahoo.com.br

JComboBox

?jcb

RU.EXTERNAL-ADDRESS

Overloaded
35

Mtodos Sobrecarregados Jess menos restrito sobre tipos de dados do que Java Ex. Em Java, voc no pode armazenar um float em um HashMap, mas em Jess pode, pois este automaticamente convertido em um tipo java.lang.Double

diegocharles.basilio@yahoo.com.br

Overloaded
36

Mtodos Sobrecarregados Problema! Quando voc necessita chamar um conjunto de mtodos Java sobrecarregados.
Mtodo sobrecarregado: mltiplos mtodos com o mesmo nome e diferente lista de argumentos disponveis no mesmo objeto Ex.
void println() void println(boolean x) void println(char x) void println(char[] x) void println(double x) void println(float x) void println(int x) void println(long x) void println(Object x) void println(String x)

diegocharles.basilio@yahoo.com.br

Overloaded
37

Mtodos Sobrecarregados Escolha do mtodo: Jess no procura por uma melhor combinao - este usa o primeiro mtodo disponvel que combina com a lista de argumentos passada.

No importa qual mtodo seja utilizado, pois um conjunto de mtodos sobrecarregados geralmente fazem a mesma coisa.

diegocharles.basilio@yahoo.com.br

Overloaded
38

Mtodos Sobrecarregados Problema! Algumas vezes, entretanto, voc pode querer chamar um especfico mtodo sobrecarregado e circunstncias podem conspirar para tornar isto impossvel.
Como no sabemos qual overload Jess ir escolher,

podemos criar e passar um objeto de uma classe especfica assim Jess o passar em um tipo definido.

diegocharles.basilio@yahoo.com.br

Overloaded
39

Mtodos Sobrecarregados Ex. Passar a string TRUE para um mtodo sobrecarregado qualquer como boolean ou String. Soluo: Criar e passar um objeto java.lang.Boolean Jess ir converter java.lang.Boolean para boolean e no String.
As vezes chamando mtodos Java no o bastante, talvez seja necessrio trabalhar diretamente com uma varivel membro do objeto ou uma varivel membro de classes estticas.

diegocharles.basilio@yahoo.com.br

Data Members
40

Acessando data members em Java Exemplos:

Constantes Estticas MAX_PRIORYT (java.lang.Thread)

Objetos
System.out

NORTH (java.awt.BorderLayout)

diegocharles.basilio@yahoo.com.br

Data Members
41

Acessando dados membros em Java Variveis de instncia: membros de uma classe que pertencem a um nico objeto, cada objeto possui uma cpia deste tipo de varivel.

Jess pode alcanar instncias de variveis pblicas usando as funes get-member e set-member.

diegocharles.basilio@yahoo.com.br

Data Members
42

Acessando data members em Java A classe java.awt.Point possui duas variveis membro x e y pblicas , neste exemplo, um objeto Point alocado, e seus membros x e y so ajustados e em seguida lidos:
Jess> (bind ?pt (new java.awt.Point)) <Endereco externo:java.awt.Point> Jess> (set-member ?pt x 37) 37 Jess> (set-member ?pt y 42) 42 Jess> (get-member ?pt x) 37
diegocharles.basilio@yahoo.com.br

Data Members
43

Acessando dados membros em Java As variveis da classe tambm so acessveis atravs de get-member e set-member:

Ex.
Jess> (get-member System out) <External-Address:java.io.PrintStream> Jess> (get-member java.awt.BorderLayout NORTH) "North"

Ao invs do objeto especificamos o nome da classe como primeiro argumento das funes.
diegocharles.basilio@yahoo.com.br

Data Members
44

Acessando data members em Java Quando se est trabalhando com objetos em Java, os mtodos geralmente retornam um valor ao seu chamador, no entanto, as vezes, estes mtodos no retornam e acabam de preferncia - lanando excees.

diegocharles.basilio@yahoo.com.br

Excees
45

Trabalhando com excees Uma exceo apenas um objeto em Java, que pretende ser tratado como uma mensagem do cdigo falhado ao cdigo chamador Quando um construtor ou um mtodo em Java joga uma exceo, Jess recebe ou trava a mensagem e a torna disponvel para voc sempre que voc chama um mtodo que possa jogar uma exceo, voc deve fornecer um handler para executar em resposta exceo no lugar do handler padro do Jess.
diegocharles.basilio@yahoo.com.br

Excees
46

Tramalhando com excees Usando a funo try:


Jess> (deffunction parseInt (?string) (try (bind ?i (call Integer parseInt ?string)) (printout t "A resposta eh " ?i crlf) catch (printout t "argumento Invalido" crlf))) TRUE Jess> (parseInt "10") A resposta eh 10 Jess> (parseInt 10") Argumento invalido

diegocharles.basilio@yahoo.com.br

Excees
47

Trabalhando com excees A funo do try avaliar as expresses no primeiro bloco, uma de cada vez. Se pelo menos uma das expresses lanar uma exceo, esse bloco abandonado, e o try comea a avaliar as expresses que seguem o smbolo catch, se aparecer. Voc pode tambm ter o bloco finally seguindo o bloco cacth.

diegocharles.basilio@yahoo.com.br

Excees
48

Trabalhando com excees


Jess> (import java.io.*) TRUE Jess> (bind ?file nil) Jess> (try (bind ?file (new BufferedReader (new java.io.FileReader "data.txt"))) (while (neq nil (bind ?line (?file readLine))) (printout t ?line crlf)) catch (printout t "Erro ao processar o arquivo" crlf) finally (if (neq nil ?file) then (?file close))) Erro ao processar o arquivo

Excees
49

Trabalhando com excees


Voc pode alcanar o objeto real da exceo que foi jogada

usando a varivel especial ?ERROR, que sempre definida por voc em um bloco catch e inicializada por Jess no ponto que a exceo for travada Em Jess podemos ter somente um bloco catch em uma try, no entanto podemos utilizar a varivel ?ERROR junto com a funo instanceof para obter uma distino entre excees.

diegocharles.basilio@yahoo.com.br

Excees
50

Trabalhando com excees Ex. Utilizando a funo lookup da classe java.rmi.Naming para conectar objetos remotos via protocolo RMI podem ocorrer as seguintes excees:
NotBoundException RemoteException AccessException

possvel emitir mensagens de erro especficas para cada uma das excees.
diegocharles.basilio@yahoo.com.br

Jess> (import java.rmi.*) TRUE Jess> (import java.net.MalformedURLException) TRUE Jess> (try (bind ?server (call Naming lookup "rmi://snarf.blat.com/Survice")) (printout t Conecao Estabelecida." crlf) catch (if (instanceof ?ERROR NotBoundException) then (printout t Servio nao Disponivel" crlf) else (if (instanceof ?ERROR MalformedURLException) then (printout t Endereo Desconhecido" crlf) else (if (instanceof ?ERROR AccessException) then (printout t Acesso Negado" crlf) else (if (instanceof ?ERROR RemoteException) then (printout t Problemas na Rede" crlf) else (printout t Erro Desconhecido" crlf)))))) Servio nao Disponivel.
diegocharles.basilio@yahoo.com.br

Excees
52

Trabalhando com excees A funo throw em Jess permite jogar excees Java a partir do cdigo Jess. Funciona como a palavra-chave throw em Java: O nico argumento deve ser uma instncia de uma classe Java que estenda de java.lang.Throwable.

diegocharles.basilio@yahoo.com.br

Excees
53

Trabalhando com excees Exceo lanada ao Java pelo cdigo Jess:


Jess> (throw (new Exception "Testando")) Jess reporta um erro na rotina throw Enquanto executa (throw (new Exception "Testando")). Message: Exceao jogada apartir do codigo Jess. Texto do programa: (throw (new Exception Testando")) na linha 1. Aninhando a exceao: java.lang.Exception: Testing at jess.TryCatchThrow.call(Funcall.java:827) at jess.FunctionHolder.call(FunctionHolder.java:37)

diegocharles.basilio@yahoo.com.br

54

Dvidas?

diegocharles.basilio@yahoo.com.br

Referncias
55

Friedman-Hill, E., 2003, Jess in Action: Rule-based

Systems in Java, Manning Publication.

diegocharles.basilio@yahoo.com.br

Obrigado

Diego Charles da Silva Basilio diegocharles@criativocomum.com.br