Um sistema de produção (ou sistema de regras de produção) é um programa de computador, normalmente usado para fornecer alguma forma de inteligência artificial, que consiste basicamente de um conjunto de regras sobre o comportamento. Estas regras, chamadas de produções, são uma representação básica considerada útil no planejamento automatizado, sistemas especialistas e seleção de ação. Um sistema de produção fornece o mecanismo necessário para executar produções, a fim de atingir alguma meta para o sistema.
Produções consistem de duas partes: uma precondição sensorial (ou "se"); e uma ação (ou "então"). Se uma precondição de produção coincide com o estado atual do mundo, então é dito que a produção foi desencadeada. Se a ação de uma produção é executada, é dito que ela foi disparada. Um sistema de produção também contém um banco de dados, às vezes chamado memória de trabalho, que mantém dados sobre o estado atual ou conhecimento; e um interpretador de regras, que deve fornecer um mecanismo para priorizar produções quando mais de uma é desencadeada.
Os interpretadores de regras geralmente executam um algoritmo de "encadeamento para a frente" para selecionar as produções a serem executadas para atingir as metas atuais, o que pode incluir a atualização de dados do sistema ou crenças. A porção de condição de cada regra (lado esquerdo ou LE) é testado contra o estado atual da memória de trabalho.
Em sistemas de produção idealizados ou orientados a dados, há um pressuposto de que quaisquer condições desencadeadas devem ser executadas: as ações consequentes (lado direito ou LD) vão atualizar o conhecimento do agente, removendo ou adicionando dados para a memória de trabalho. O sistema interrompe o processamento quando: o usuário interrompe o loop de encadeamento para a frente; um determinado número de ciclos têm sido realizados; uma LD de "parada" é executada; ou não há regras LE verdadeiras.
Sistemas especialistas e de tempo real, ao contrário, muitas vezes têm que escolher entre as produções mutuamente exclusivas. Uma vez que ações levam tempo, apenas uma ação pode ser tomada; ou (no caso de um sistema especialista) recomendada. Nesses sistemas, o interpretador de regras, ou motor de inferência, percorre duas etapas: combinar regras de produção com o banco de dados; e posteriormente, selecionar quais as regras combinadas para aplicar e executar as ações selecionadas.
Sistemas de produção podem variar no poder expressivo das condições em regras de produção. Assim, o algoritmo de casamento de padrões, que coleta regras de produção com as condições correspondentes, pode variar desde o ingênuo - tentando todas as regras em sequência, parando na primeira correspondência - até o otimizado, no qual as regras são "compiladas" em uma rede de condições interrelacionadas.
Este último é ilustrado pelo algoritmo RETE, concebido por Charles L. Forgy em 1983, que é usado em uma série de sistemas de produção, chamado OPS; e originalmente desenvolvido na Universidade Carnegie Mellon, culminando na OPS5 na década de 1980. OPS5 pode ser visto como uma linguagem de programação completa para a programação de sistemas de produção.
Sistemas de produção também podem diferir na seleção final de regras de produção para executar; ou disparar. O conjunto de regras resultantes a partir do algoritmo de correspondência anterior é chamado conjunto de conflitos; e o processo de seleção é também chamado de uma estratégia de resolução de conflitos.
Aqui, novamente, essas estratégias podem variar do simples - usar a ordem em que as regras de produção foram escritas; atribuir pesos ou prioridades para regras de produção; e ordenar o conjunto de conflitos nesse sentido - até o complexo - ordenar o conjunto de conflitos de acordo com os tempos em que regras de produção foram previamente disparadas; ou de acordo com a extensão das modificações induzidas pelos seus LD's. Qualquer que seja a estratégia de resolução de conflitos implementada, o método é realmente crucial para a eficiência e exatidão do sistema de produção.
O uso de sistemas de produção varia de simples regras de reescrita de cadeia até a modelagem de processos cognitivos humanos, de reescrita de termos e sistemas de redução para sistemas especialistas.
Este exemplo mostra um conjunto de regras de produção para reverter uma sequência de caracteres de um alfabeto que não contém os símbolos "$" e "*" (que são usados como símbolos de marcação).
P1: $$ → * P2: *$ → * P3: *x → x* P4: * → null & halt P5: $xy → y$x P6: null → $
Neste exemplo, as regras de produção são escolhidas para testes de acordo com a ordem na lista de produção. Para cada regra, a sequência de entrada é analisada da esquerda para a direita, com uma janela móvel, para encontrar uma correspondência com o LE da regra de produção. Quando uma correspondência for encontrada, a subsequência encontrada na sequência de entrada é substituída pelo LD da regra de produção. Neste sistema de produção, X e Y são variáveis, correspondendo a qualquer caractere do alfabeto da cadeia de entrada. A correspondência recomeça com P1, uma vez que a substituição tenha sido feita.
A cadeia "ABC", por exemplo, sofre a seguinte sequência de transformações sob estas regras de produção:
$ABC (P6) B$AC (P5) BC$A (P5) $BC$A (P6) C$B$A (P5) $C$B$A (P6) $$C$B$A (P6)
C*$B$A (P3) C*B$A (P2) CB*$A (P3) CB*A (P2) CBA* (P3) CBA (P4)
Em tal sistema simples, a ordenação das regras de produção é fundamental. Muitas vezes, a falta de estrutura de controle faz sistemas de produção difíceis de arquitetar. É evidentemente possível adicionar uma estrutura de controle para o modelo de sistemas de produção, a saber, no motor de inferência; ou na memória de trabalho.
Em uma simulação de mundo de brinquedo, onde um macaco em uma sala pode pegar objetos diferentes e subir em outros, uma regra de produção de exemplo, para agarrar um objeto suspenso no teto, ficaria assim:
(p Holds::Object-Ceiling {(goal ^status active ^type holds ^objid <O1>) <goal>} {(physical-object ^id <O1> ^weight light ^at <p> ^on ceiling) <object-1>} {(physical-object ^id ladder ^at <p> ^on floor) <object-2>} {(monkey ^on ladder ^holds NIL) <monkey>} -(physical-object ^on <O1>) --> (write (crlf) Grab <O1> (crlf)) (modify <object1> ^on NIL) (modify <monkey> ^holds <O1>) (modify <goal> ^status satisfied))
Neste exemplo, os dados na memória de trabalho são estruturados; e variáveis aparecem entre sinais de desigualdade ("<" e ">"). O nome da estrutura de dados, como "objetivo" e "objeto físico", é o primeiro literal em condições. Os campos de uma estrutura são prefixados com "^". O "-" indica uma condição negativa.
Regras de produção em OPS5 aplicam-se a todas as instâncias de estruturas de dados que correspondam às condições; e em conformidade com ligações de variáveis. Neste exemplo, devem ser suspensos vários objetos no teto, cada um com uma escada diferente nas proximidades, apoiando um macaco com as mãos vazias. O conjunto de conflitos deverá conter muitas instâncias de regras de produção derivadas da mesma produção "Holds::Object-Ceiling". A etapa de resolução de conflitos, mais tarde, deverá selecionar as instâncias de produção a disparar.
Nota-se que a ligação de variáveis resultantes a partir do casamento de padrões no LE é usada no LD para se referir aos dados a serem modificados. Nota-se também que a memória de trabalho contém estruturas de dados de controle explícitas em forma de estrutura de dados "objetivo". No exemplo, uma vez que um macaco mantém o objeto suspenso, o status do objetivo é definido para "satisfeito"; e a mesma produção não pode mais ser aplicada conforme sua primeira condição falhar.