|
import streamlit as st |
|
import pandas as pd |
|
import json |
|
from pathlib import Path |
|
import uuid |
|
|
|
class ExpertSystem: |
|
def __init__(self): |
|
self.rules = [] |
|
self.variables = {} |
|
self.conclusions = set() |
|
|
|
def add_rule(self, conditions, conclusion, probability=1.0): |
|
rule_id = str(uuid.uuid4()) |
|
self.rules.append({ |
|
'id': rule_id, |
|
'conditions': conditions, |
|
'conclusion': conclusion, |
|
'probability': probability |
|
}) |
|
self.conclusions.add(conclusion) |
|
|
|
def evaluate(self, facts): |
|
results = [] |
|
for rule in self.rules: |
|
is_valid = True |
|
for condition in rule['conditions']: |
|
var, op, value = condition |
|
if var not in facts: |
|
is_valid = False |
|
break |
|
|
|
if op == '==' and facts[var] != value: |
|
is_valid = False |
|
elif op == '>' and facts[var] <= value: |
|
is_valid = False |
|
elif op == '<' and facts[var] >= value: |
|
is_valid = False |
|
|
|
if is_valid: |
|
results.append({ |
|
'conclusion': rule['conclusion'], |
|
'probability': rule['probability'] |
|
}) |
|
|
|
return results |
|
|
|
def save(self, filename): |
|
data = { |
|
'rules': self.rules, |
|
'variables': self.variables |
|
} |
|
with open(filename, 'w') as f: |
|
json.dump(data, f) |
|
|
|
def load(self, filename): |
|
with open(filename, 'r') as f: |
|
data = json.load(f) |
|
self.rules = data['rules'] |
|
self.variables = data['variables'] |
|
self.conclusions = {rule['conclusion'] for rule in self.rules} |
|
|
|
|
|
def main(): |
|
st.set_page_config(page_title="Neo Sistema Especialista", layout="wide") |
|
|
|
if 'expert_system' not in st.session_state: |
|
st.session_state.expert_system = ExpertSystem() |
|
|
|
if 'current_facts' not in st.session_state: |
|
st.session_state.current_facts = {} |
|
|
|
st.title("Neo Sistema Especialista") |
|
|
|
|
|
menu = st.sidebar.selectbox( |
|
"Menu", |
|
["Base de Conhecimento", "Consulta", "Variáveis", "Carregar/Salvar"] |
|
) |
|
|
|
if menu == "Base de Conhecimento": |
|
show_knowledge_base() |
|
elif menu == "Consulta": |
|
show_consultation() |
|
elif menu == "Variáveis": |
|
show_variables() |
|
else: |
|
show_save_load() |
|
|
|
|
|
def show_knowledge_base(): |
|
st.header("Base de Conhecimento") |
|
|
|
|
|
st.subheader("Regras Existentes") |
|
for i, rule in enumerate(st.session_state.expert_system.rules): |
|
st.write(f"Regra {i + 1}:") |
|
st.write(f"SE {' E '.join([f'{c[0]} {c[1]} {c[2]}' for c in rule['conditions']])}") |
|
st.write(f"ENTÃO {rule['conclusion']} (Probabilidade: {rule['probability']})") |
|
st.write("---") |
|
|
|
|
|
st.subheader("Adicionar Nova Regra") |
|
|
|
with st.form("nova_regra"): |
|
|
|
st.write("Condições") |
|
num_conditions = st.number_input("Número de condições", min_value=1, value=1) |
|
|
|
conditions = [] |
|
for i in range(int(num_conditions)): |
|
col1, col2, col3 = st.columns(3) |
|
with col1: |
|
var = st.text_input(f"Variável {i + 1}") |
|
with col2: |
|
op = st.selectbox(f"Operador {i + 1}", ["==", ">", "<"]) |
|
with col3: |
|
val = st.text_input(f"Valor {i + 1}") |
|
if var and val: |
|
conditions.append((var, op, val)) |
|
|
|
|
|
conclusion = st.text_input("Conclusão") |
|
probability = st.slider("Probabilidade", 0.0, 1.0, 1.0) |
|
|
|
if st.form_submit_button("Adicionar Regra"): |
|
if conditions and conclusion: |
|
st.session_state.expert_system.add_rule(conditions, conclusion, probability) |
|
st.success("Regra adicionada com sucesso!") |
|
else: |
|
st.error("Preencha todos os campos necessários") |
|
|
|
|
|
def show_consultation(): |
|
st.header("Consulta ao Sistema Especialista") |
|
|
|
|
|
st.subheader("Inserir Fatos") |
|
|
|
with st.form("consulta"): |
|
facts = {} |
|
variables = set() |
|
for rule in st.session_state.expert_system.rules: |
|
for condition in rule['conditions']: |
|
variables.add(condition[0]) |
|
|
|
for var in variables: |
|
value = st.text_input(f"Valor para {var}") |
|
if value: |
|
facts[var] = value |
|
|
|
if st.form_submit_button("Consultar"): |
|
if facts: |
|
results = st.session_state.expert_system.evaluate(facts) |
|
st.session_state.current_facts = facts |
|
|
|
if results: |
|
st.success("Resultados encontrados!") |
|
for result in results: |
|
st.write(f"Conclusão: {result['conclusion']}") |
|
st.write(f"Probabilidade: {result['probability']:.2%}") |
|
else: |
|
st.warning("Nenhuma conclusão encontrada para os fatos fornecidos.") |
|
else: |
|
st.error("Insira pelo menos um fato para consulta") |
|
|
|
|
|
def show_variables(): |
|
st.header("Variáveis do Sistema") |
|
|
|
|
|
variables = set() |
|
for rule in st.session_state.expert_system.rules: |
|
for condition in rule['conditions']: |
|
variables.add(condition[0]) |
|
|
|
st.subheader("Variáveis Utilizadas") |
|
for var in variables: |
|
st.write(f"- {var}") |
|
|
|
|
|
def show_save_load(): |
|
st.header("Carregar/Salvar Base de Conhecimento") |
|
|
|
col1, col2 = st.columns(2) |
|
|
|
with col1: |
|
st.subheader("Salvar Base") |
|
filename = st.text_input("Nome do arquivo para salvar", "base_conhecimento.json") |
|
if st.button("Salvar"): |
|
try: |
|
st.session_state.expert_system.save(filename) |
|
st.success(f"Base de conhecimento salva em {filename}") |
|
except Exception as e: |
|
st.error(f"Erro ao salvar: {str(e)}") |
|
|
|
with col2: |
|
st.subheader("Carregar Base") |
|
uploaded_file = st.file_uploader("Escolha um arquivo .json", type="json") |
|
if uploaded_file is not None: |
|
try: |
|
|
|
temp_path = Path("temp.json") |
|
temp_path.write_bytes(uploaded_file.getvalue()) |
|
|
|
st.session_state.expert_system.load(temp_path) |
|
temp_path.unlink() |
|
|
|
st.success("Base de conhecimento carregada com sucesso!") |
|
except Exception as e: |
|
st.error(f"Erro ao carregar: {str(e)}") |
|
|
|
|
|
if __name__ == "__main__": |
|
main() |