JEOPS Java Embedded Object Production System Allan Lima [email protected] Material disponível em http://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 Compilação das Regras Base de Regras (.rule) Base de Regras (.java) JEOPS Compiler Compilação da Aplicação Base de Regras (.java) + Aplicação Java Java Compiler JEOPS RE Byte Code Como o JEOPS funciona Execução se Pai(a, b) então Filho(b, a) Filho(a, b) ??? Base de Regras Motor de Inferência + Fatos Pai(a, b); Pai(b, c); 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 Regras package 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; } public class Objetivo { private boolean ativo; private Pessoa pai, mae; private Pessoa alvo; public String getNome() { 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: Fibonacci package 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: Fibonacci rule 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: Fibonacci rule 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 LRUConflictSet Não permite que uma regra seja disparada mais de uma vez com os mesmos objetos (problemas com memória) OneShotConflictSet Escolherá a regra mais recentemente utilizada NaturalConflictSet Escolherá sempre a regra menos recentemente utilizada MRUConflictSet Não há regras, se preocupa apenas com a eficiência 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/orientadaAgent es.html