JEOPSJava Embedded Object Production System
Allan [email protected]
Material disponível emhttp://www.cin.ufpe.br/~adsl/arquivos/jeops
Roteiro O que é o JEOPS? Um pouco de história Configurando o Eclipse para usar o JEOPS Como o JEOPS funciona? Regras JEOPS
Exemplo 1: Descobrindo ancestrais Exemplo 2: Calculando os números de Fibonacci
Resolução de Conflitos Exercícios
Configurando o Eclipse Baixe o JEOPS e o plugin para o Eclipse:
www.cin.ufpe.br/~adsl/arquivos/jeops Descompacte o arquivo JEOPSsrc.zip
Baixe o Eclipse em: www.eclipse.org
Descompacte o arquivo JEOclipse.zip na pasta eclipse
Abra o eclipse File > Import > General > Existing Projects into
Workspace Selecione o diretório onde o código do JEOPS se
encontra e clique em finish
O que é o JEOPS?
JEOPS Java Embedded Object Production
System
É um motor de inferência para a linguagem de programação Java
Com ele podemos definir regras para serem executadas sobre objetos Java
Um pouco de história Idealizado em 1997 na, hoje extinta,
cadeira de Inteligência Artificial Simbólica Primeira versão chamada JEPS
Java Embedded Production System Possuía diversos problemas e limitações
1998 Utilizado por alunos de mestrado Correção de bugs e grande aumento de
performance com o novo algoritmo de unificação Mudança de nome para JEOPS Problemas com resolução de conflitos
Um pouco de história 1999
Personalização da resolução de conflitos Refatoração de todo o código para o Inglês Criação de um manual para o usuário
2000~2001 Sistema totalmente reescrito
Regras pré-compiladas Parser otimizado para a total integração com
Java Maior facilidade para a personalização de
conflitos Melhor unificação entre regras e objetos
Como o JEOPS funciona
Base de Regras (.rule)
JEOPS Compiler
Base de Regras (.java)
Compilação das Regras
Aplicação Java
Java Compiler
Byte Code
Compilação da Aplicação
Base de Regras (.java)
+
JEOPS RE
Como o JEOPS funciona
Fatos
Motor de Inferência
Execução
Base de Regras
+
se Pai(a, b) então Filho(b, a)
Pai(a, b);Pai(b, c);
Filho(a, b) ???
Verdadeiro
Regras JEOPS São organizadas em uma base de regras
Uma base de regra contem regras, mas também pode conter métodos e declarações de variáveis, como qualquer classe de Java.
As regras são descritas através de três campos Declaração de variáveis Condições Ações
Regras JEOPS Declaração de variáveis
Variáveis que compõem a regra Parâmetros para a avaliação da regra
Variáveis locais Variáveis auxiliares,usadas para simplificar
expressões complexas Condições
Qualquer expressão booleana em Java Não deve modificar o estado dos objetos
Ações Qualquer expressão de Java
Estrutura de uma Base de Regraspackage nomeDoPacote;
public ruleBase NomeDaBaseDeRegras {
rule NomeDaRegra {
declarations // Declaração de variáveis, parâmetros da regra localdecl // Declaração de variáveis internas da regra conditions // Condições para a realização das ações actions // Ações que serão realizadas caso as condições sejam // satisfeitas }
}
Trabalhando com a Base de Regras
Inserindo objetos insert(Object obj);
Removendo objetos: retract(Object obj);
Informando modificações modified(Object obj);
Exemplo 1: Descobrindo ancestrais
public class Pessoa { private String nome; private Pessoa pai, mae; public String getNome() { ...}
public class Objetivo { private boolean ativo; private Pessoa alvo; public Objetivo(Pessoa p) { ...}
Exemplo 1: Descobrindo ancestrais
ruleBase Familia { rule encontraAncestrais { declarations Pessoa p; Objetivo o; localdecl Pessoa pai = p.getPai(); Pessoa mae = p.getMae(); conditions p == o.getAlvo(); o.isAtivo(); actions o.desativa(); System.out.println(pai.getNome() + “ e ” + mae.getNome() + “ são ancestrais”); insert(new Objetivo(pai)); insert(new Objetivo(mae)); }}
Exemplo 2: Fibonacci
public class Fibonacci {
public int n; // The order
public int value;
public Fibonacci son1;
public Fibonacci son2;
...
}
Exemplo 2: Fibonaccipackage fibonacci;
public ruleBase FibonacciBase {
rule BaseCase { // if n == 1 or n == 0, then the value is n. declarations Fibonacci f; conditions f.getN() <= 1; f.getValue() == -1; actions f.setValue(f.getN()); modified(f); // Yes, I modified f }
Exemplo 2: Fibonaccirule GoDown { // if n >= 2, create two sons for the object declarations Fibonacci f; conditions f.getValue() == -1; f.getN() >= 2; f.getSon1() == null; actions Fibonacci f1 = new Fibonacci(f.getN() - 1); Fibonacci f2 = new Fibonacci(f.getN() - 2); f.setSon1(f1); f.setSon2(f2); insert(f1); // Let's tell our knowledge base insert(f2); // that these two sons exist. modified(f);}
Exemplo 2: Fibonaccirule GoUp { // if both subproblems are solved, // so let's solve this one declarations Fibonacci f, f1, f2; conditions f1 == f.getSon1(); f2 == f.getSon2(); f.getValue() == -1; f.getN() >= 2; f1.getValue() != -1; f2.getValue() != -1; actions f.setValue(f1.getValue() + f2.getValue()); retract(f1); // I don't need retract(f2); // they anymore... modified(f);}
Resolução de Conflitos O JEOPS possui um mecanismo flexível para a resolução de
conflitos Podemos criar nosso próprio gerenciador de conflitos
Herdando da classe AbstractConflictSet Ou usar as classes do projeto
DefaultConflictSet Não há regras, se preocupa apenas com a eficiência
LRUConflictSet Escolherá sempre a regra menos recentemente utilizada
MRUConflictSet Escolherá a regra mais recentemente utilizada
NaturalConflictSet Não permite que uma regra seja disparada mais de uma vez com os
mesmos objetos (problemas com memória) OneShotConflictSet
Não permite que uma regra seja disparada mais de uma vez, mesmo que com objetos distintos.
PriorityConflictSet A ordem da definição das regras no arquivo define as suas
prioridades.
Exercícios
1. Modificar o exemplo da família, criando uma regra para descobrir os avós paternos
2. Implementar o calculo do fatorial de um número
Como saber mais sobre JEOPS? Site do Projeto
http://www.cin.ufpe.br/~jeops/ CEOPS++
Motor de inferência para C++ baseado no JEOPS http://www.cin.ufpe.br/~tg/2006-1/psb.pdf
Linguagem orienta a agentes baseada na sintaxe no JEOPS http://www.cin.ufpe.br/~nll/
orientadaAgentes.html