class Test(KnowledgeEngine): @Rule( FORALL(Fact(key_a="k" << W()), Fact(key_b="k" << W()), Fact(key_c="k" << W()))) def any_fact_once(self): nonlocal executed executed += 1
class CharacterEvolution(KnowledgeEngine): """WorldFact evolution engine.""" @DefFacts() def start(self, being, number): # noqa """Define facts.""" yield Fact(being=being) yield Fact(number=number) yield Fact(touched=being.touched) @Rule( AND(Fact(number=AS.number << W()), NOT(Fact(being=CALL.dead)), NOT(Fact(touched=True)))) def is_not_dead(self, number): """Current character is not dead.""" being = self.beings[number] self.result.append(replace(being)) @Rule(AND(Fact(being=CALL.reproduces), Fact(being=AS.being << W()))) def has_children(self, being): """Will have children.""" children = random.randint(0, being.species.avg_number_children) self.result.extend([Being(0, being.species) for _ in range(children)])
def build(cls, setname, spec): """ Rule struct example {'rulename1': {'lhs': [Vector(_type="ip", ip=MATCH.pollas)))], 'command': "run_nmap.py"}} """ def _create_rhs(command): def _rhs(self, **context): idxs = sorted([int(k.split('_')[2]) for k in context.keys() if k.startswith('_elem_')], reverse=True) lineages = list() for idx in idxs: lineages.extend(context[f'_lineage_{idx}']) elem = context[f'_elem_{idx}'].as_dict() del elem['_lineage'] lineages.append(elem) stdin = {k: v for k, v in context.items() if not k.startswith("_")} self.declare(TaskRequest(command=command, stdin=stdin, lineages=lineages)) return _rhs rules = {} for rulename, body in spec.items(): comps = list() for idx, comp in enumerate(body['lhs']): comp["_lineage"] = W(f"_lineage_{idx}") f"_elem_{idx}" << comp comps.append(comp) lhs = Rule(*comps, TEST(_shared_lineage)) rhs = _create_rhs(body['command']) rhs.__name__ = f"{setname}__{rulename}" rules[rulename] = lhs(rhs) return type(setname, (cls,), rules)
def test_declare_raises_typeerror_if_conditionalelement_found(): from pyknow import KnowledgeEngine, L, W, P, Fact ke = KnowledgeEngine() with pytest.raises(TypeError): ke.declare(Fact(L(1))) with pytest.raises(TypeError): ke.declare(Fact(W())) with pytest.raises(TypeError): ke.declare(Fact(P(lambda _: True))) with pytest.raises(TypeError): ke.declare(Fact(~L(1))) with pytest.raises(TypeError): ke.declare(Fact(L(1) | L(2))) with pytest.raises(TypeError): ke.declare(Fact(L(1) & L(2)))
class Test(KnowledgeEngine): @Rule(Fact(a=W('X'), b=W('X'))) def rule1(self, X): nonlocal result result.append(X)
class KE(KnowledgeEngine): @Rule(Fact(x='x' << W()), NOT(Fact(y='x' << W()))) def r1(self): pass
class Test(KnowledgeEngine): @Rule(Fact("a" << W()), TEST(lambda a: isinstance(a, int))) def is_number(self, a): nonlocal executed executed += 1
class Test(KnowledgeEngine): @Rule(Fact("a" << W()), Fact("b" << W()), TEST(lambda a, b: a > b), Fact("c" << W()), TEST(lambda b, c: b > c)) def is_greater(self, a, b, c): nonlocal executed executed[(a, b, c)] += 1
class Bipolar(KnowledgeEngine): """ Coleta dos dados """ @Rule(Sintomas(verifica_humor_deprimido=None)) def ask_verifica_humor_deprimido(self): self.declare( Sintomas( verifica_humor_deprimido=ask("verifica_humor_deprimido? "))) @Rule(Sintomas(fisiologico=None)) def ask_data_fisiologico(self): self.declare(Sintomas(fisiologico=ask("fisiologico? "))) @Rule(Sintomas(prejuizo_social=None)) def ask_data_prejuizo_social(self): self.declare(Sintomas(prejuizo_social=ask("prejuizo_social? "))) @Rule(Sintomas(prejuiso_profissional=None)) def ask_data_prejuiso_profissional(self): self.declare( Sintomas(prejuiso_profissional=ask("prejuiso_profissional? "))) @Rule(Sintomas(prejuizo_si=None)) def ask_data_prejuizo_si(self): self.declare(Sintomas(prejuizo_si=ask("prejuizo_si? "))) @Rule(Sintomas(prejuizo_outros=None)) def ask_data_prejuizo_outros(self): self.declare(Sintomas(prejuizo_outros=ask("prejuizo_outros? "))) @Rule(Sintomas(psicose=None)) def ask_data_psicose(self): self.declare(Sintomas(psicose=ask("psicose? "))) @Rule(NOT(Sintomas(autoestima_inflada=W()))) def ask_data_autoestima_inflada(self): self.declare(Sintomas(autoestima_inflada=ask("autoestima_inflada? "))) @Rule(NOT(Sintomas(grandiosidade=W()))) def ask_data_grandiosidade(self): self.declare(Sintomas(grandiosidade=ask("grandiosidade? "))) @Rule(NOT(Sintomas(loquaz=W()))) def ask_data_loquaz(self): self.declare(Sintomas(loquaz=ask("loquaz? "))) @Rule(NOT(Sintomas(pressao_continuar_falando=W()))) def ask_data_pressao_continuar_falando(self): self.declare( Sintomas( pressao_continuar_falando=ask("pressao_continuar_falando? "))) @Rule(NOT(Sintomas(fuga_ideias=W()))) def ask_data_fuga_ideias(self): self.declare(Sintomas(fuga_ideias=ask("fuga_ideias? "))) @Rule(NOT(Sintomas(pensamento_acelerado=W()))) def ask_data_pensamento_acelerado(self): self.declare( Sintomas(pensamento_acelerado=ask("pensamento_acelerado? "))) @Rule(NOT(Sintomas(aumento_atividade_objetivo=W()))) def ask_data_aumento_atividade_objetivo(self): self.declare( Sintomas(aumento_atividade_objetivo=ask( "aumento_atividade_objetivo? "))) @Rule(NOT(Sintomas(agitacao_psicomotora=W()))) def ask_data_agitacao_psicomotora(self): self.declare( Sintomas(agitacao_psicomotora=ask("agitacao_psicomotora? "))) @Rule(NOT(Sintomas(reducao_sono=W()))) def ask_data_reducao_sono(self): self.declare(Sintomas(reducao_sono=ask("reducao_sono? "))) @Rule(NOT(Sintomas(distrabilidade=W()))) def ask_data_distrabilidade(self): self.declare(Sintomas(distrabilidade=ask("distrabilidade? "))) @Rule(NOT(Sintomas(envolvimento_atividade_risco=W()))) def ask_data_envolvimento_atividade_risco(self): self.declare( Sintomas(envolvimento_atividade_risco=ask( "envolvimento_atividade_risco? "))) @Rule(NOT(Sintomas(irritavel=W()))) def ask_data_irritavel(self): self.declare(Sintomas(irritavel=ask("irritavel? "))) @Rule(NOT(Sintomas(verifica_perda_interesse=W()))) def aks_perda_interesse(self): self.declare( Sintomas(verifica_perda_interesse=ask("perda_interesse? "))) @Rule(NOT(Sintomas(perda_prazer=W()))) def ask_data_perda_prazer(self): self.declare(Sintomas(perda_prazer=ask("perda_prazer? "))) @Rule(NOT(Sintomas(perda_peso=W()))) def ask_data_perda_peso(self): self.declare(Sintomas(perda_peso=ask("perda_peso? "))) @Rule(NOT(Sintomas(ganho_peso=W()))) def ask_data_ganho_peso(self): self.declare(Sintomas(ganho_peso=ask("ganho_peso? "))) @Rule(NOT(Sintomas(reducao_alimentacao=W()))) def ask_data_reducao_alimentacao(self): self.declare( Sintomas(reducao_alimentacao=ask("reducao_alimentacao? "))) @Rule(NOT(Sintomas(aumento_alimentacao=W()))) def ask_data_aumento_alimentacao(self): self.declare( Sintomas(aumento_alimentacao=ask("aumento_alimentacao? "))) @Rule(NOT(Sintomas(insonia=W()))) def ask_data_insonia(self): self.declare(Sintomas(insonia=ask("insonia? "))) @Rule(NOT(Sintomas(hipersonia=W()))) def ask_data_hipersonia(self): self.declare(Sintomas(hipersonia=ask("hipersonia? "))) @Rule(NOT(Sintomas(retardo_psicomotor=W()))) def ask_data_retardo_psicomotor(self): self.declare(Sintomas(retardo_psicomotor=ask("retardo_psicomotor? "))) @Rule(NOT(Sintomas(fadiga=W()))) def ask_data_fadiga(self): self.declare(Sintomas(fadiga=ask("fadiga? "))) @Rule(NOT(Sintomas(perda_energia=W()))) def ask_data_perda_energia(self): self.declare(Sintomas(perda_energia=ask("perda_energia? "))) @Rule(NOT(Sintomas(inutilidade=W()))) def ask_data_inutilidade(self): self.declare(Sintomas(inutilidade=ask("inutilidade? "))) @Rule(NOT(Sintomas(culpa_excessiva=W()))) def ask_data_culpa_excessiva(self): self.declare(Sintomas(culpa_excessiva=ask("culpa_excessiva? "))) @Rule(NOT(Sintomas(culpa_inapropriada=W()))) def ask_data_culpa_inapropriada(self): self.declare(Sintomas(culpa_inapropriada=ask("culpa_inapropriada? "))) @Rule(NOT(Sintomas(capacidade_diminuida=W()))) def ask_data_capacidade_diminuida(self): self.declare( Sintomas(capacidade_diminuida=ask("capacidade_diminuida? "))) @Rule(NOT(Sintomas(indecisao=W()))) def ask_data_indecisao(self): self.declare(Sintomas(indecisao=ask("indecisao? "))) @Rule(NOT(Sintomas(pensamentos_morte=W()))) def ask_data_pensamentos_morte(self): self.declare(Sintomas(pensamentos_morte=ask("pensamentos_morte? "))) @Rule(NOT(Sintomas(sofrimento_clinico=W()))) def ask_data_sofrimento_clinico(self): self.declare(Sintomas(sofrimento_clinico=ask("sofrimento_clinico? "))) @Rule(NOT(Sintomas(prejuiso_social=W()))) def ask_data_prejuiso_social(self): self.declare(Sintomas(prejuiso_social=ask("prejuiso_social? "))) @Rule(NOT(Sintomas(prejuiso_area_importancia=W()))) def ask_data_prejuiso_area_importancia(self): self.declare( Sintomas( prejuiso_area_importancia=ask("prejuiso_area_importancia? "))) @Rule( AND( NOT(Sintomas(verifica_mudanca_comportamental=W())), AND( OR(Sintomas(autoestima_excessiva=0), Sintomas(autoestima_excessiva=1)), Sintomas(autoestima_excessiva=MATCH.autoestima_excessiva)), AND(OR(Sintomas(reducao_sono=0), Sintomas(reducao_sono=1)), Sintomas(reducao_sono=MATCH.reducao_sono)), AND(OR(Sintomas(aumento_fala=0), Sintomas(aumento_fala=1)), Sintomas(aumento_fala=MATCH.aumento_fala)), AND( OR(Sintomas(mudanca_modo_pensar=0), Sintomas(mudanca_modo_pensar=1)), Sintomas(mudanca_modo_pensar=MATCH.mudanca_modo_pensar)), AND(OR(Sintomas(distrabilidade=0), Sintomas(distrabilidade=1)), Sintomas(distrabilidade=MATCH.distrabilidade)), AND(OR(Sintomas(agitacao=0), Sintomas(agitacao=1)), Sintomas(agitacao=MATCH.agitacao)), AND( OR(Sintomas(envolvimento_atividade_risco=0), Sintomas(envolvimento_atividade_risco=1)), Sintomas(envolvimento_atividade_risco=MATCH. envolvimento_atividade_risco)))) def define_mudanca_comportamental(self, autoestima_excessiva, reducao_sono, aumento_fala, mudanca_modo_pensar, distrabilidade, agitacao, envolvimento_atividade_risco): self.declare( Sintomas(verifica_mudanca_comportamental=verifica_conjunto([ autoestima_excessiva, reducao_sono, aumento_fala, mudanca_modo_pensar, distrabilidade, agitacao, envolvimento_atividade_risco ], 3))) @Rule( AND( NOT(Sintomas(verifica_sintomas_depressivos=W())), AND(OR(Sintomas(humor_deprimido=0), Sintomas(humor_deprimido=1)), Sintomas(humor_deprimido=MATCH.humor_deprimido)), AND(OR(Sintomas(perda_interesse=0), Sintomas(perda_interesse=1)), Sintomas(perda_interesse=MATCH.perda_interesse)), AND( OR(Sintomas(alteracao_alimentacao=0), Sintomas(alteracao_alimentacao=1)), Sintomas(alteracao_alimentacao=MATCH.alteracao_alimentacao)), AND(OR(Sintomas(alteracao_sono=0), Sintomas(alteracao_sono=1)), Sintomas(alteracao_sono=MATCH.alteracao_sono)), AND( OR(Sintomas(alteracao_comportamentao=0), Sintomas(alteracao_comportamentao=1)), Sintomas( alteracao_comportamentao=MATCH.alteracao_comportamentao)), AND(OR(Sintomas(cansaco=0), Sintomas(cansaco=1)), Sintomas(cansaco=MATCH.cansaco)), AND( OR(Sintomas(sentimento_depressivo=0), Sintomas(sentimento_depressivo=1)), Sintomas(sentimento_depressivo=MATCH.sentimento_depressivo)), AND( OR(Sintomas(alteracao_pensamento=0), Sintomas(alteracao_pensamento=1)), Sintomas(alteracao_pensamento=MATCH.alteracao_pensamento)), AND( OR(Sintomas(pensamentos_morte=0), Sintomas(pensamentos_morte=1)), Sintomas(pensamentos_morte=MATCH.pensamentos_morte)))) def define_sintomas_depressivos(self, humor_deprimido, perda_interesse, alteracao_alimentacao, alteracao_sono, alteracao_comportamentao, cansaco, sentimento_depressivo, alteracao_pensamento, pensamentos_morte): self.declare( Sintomas(verifica_sintomas_depressivos=verifica_conjunto([ humor_deprimido, perda_interesse, alteracao_alimentacao, alteracao_sono, alteracao_comportamentao, cansaco, sentimento_depressivo, alteracao_pensamento, pensamentos_morte ], 5))) """ Verificação das regras """ @Rule( AND(Sintomas(mudanca_comportamental=1), Sintomas(fisiologico=1), Sintomas(psicose=1))) def mania(self): self.declare(Sintomas(mania=1)) @Rule( AND(Sintomas(mudanca_comportamental=1), Sintomas(fisiologico=0), Sintomas(psicose=1))) def nao_mania(self): self.declare(Sintomas(mania=0)) @Rule( AND(Sintomas(mudanca_comportamental=0), Sintomas(fisiologico=0), Sintomas(psicose=W()))) def nao_2_mania(self): self.declare(Sintomas(mania=0)) @Rule( AND(Sintomas(mudanca_comportamental=1), Sintomas(fisiologico=1), Sintomas(psicose=0))) def hipomania(self): self.declare(Sintomas(hipomania=1)) @Rule( AND(Sintomas(mudanca_comportamental=1), Sintomas(fisiologico=0), Sintomas(psicose=0))) def nao_hipomania(self): self.declare(Sintomas(hipomania=0)) @Rule( AND(Sintomas(mudanca_comportamental=0), Sintomas(fisiologico=W()), Sintomas(psicose=0))) def nao_2_hipomania(self): self.declare(Sintomas(hipomania=0)) @Rule(OR(Sintomas(prejuizo_social=1), Sintomas(prejuiso_profissional=1))) def prejuiso_acentuado(self): self.declare(Sintomas(prejuizo_acentuado=1)) @Rule(OR(Sintomas(prejuizo_si=1), Sintomas(prejuizo_outros=1))) def risco_potencial(self): self.declare(Sintomas(risco_potencial=1)) @Rule(NOT(OR(Sintomas(prejuizo_si=1), Sintomas(prejuizo_outros=1)))) def risco_potencial(self): self.declare(Sintomas(risco_potencial=0)) @Rule( OR(OR(Sintomas(prejuizo_acentuado=1), Sintomas(risco_potencial=1)), Sintomas(psicose=1))) def perturbacao_humor(self): self.declare(Sintomas(perturbacao_humor=1)) @Rule( NOT( OR(OR(Sintomas(prejuizo_acentuado=1), Sintomas(risco_potencial=1)), Sintomas(psicose=1)))) def perturbacao_humor(self): self.declare(Sintomas(perturbacao_humor=0)) @Rule(OR(Sintomas(autoestima_inflada=1), Sintomas(grandiosidade=1))) def autoestima_excessiva(self): self.declare(Sintomas(autoestima_excessiva=1)) @Rule(OR(Sintomas(loquaz=1), Sintomas(pressao_continuar_falando=1))) def aumento_fala(self): self.declare(Sintomas(aumento_fala=1)) @Rule(OR(Sintomas(fuga_ideias=1), Sintomas(pensamento_acelerado=1))) def mudanca_modo_pensar(self): self.declare(Sintomas(mudanca_modo_pensar=1)) @Rule( OR(Sintomas(aumento_atividade_objetivo=1), Sintomas(agitacao_psicomotora=1))) def agitacao(self): self.declare(Sintomas(agitacao=1)) @Rule(Sintomas(verifica_mudanca_comportamental=1)) def mudanca_comportamental(self): self.declare(Sintomas(mudanca_comportamental=1)) @Rule(OR(Sintomas(verifica_humor_deprimido=1), Sintomas(irritavel=1))) def humor_deprimido(self): self.declare(Sintomas(humor_deprimido=1)) @Rule(OR(Sintomas(verifica_perda_interesse=1), Sintomas(perda_prazer=1))) def perda_interesse(self): self.declare(Sintomas(perda_interesse=1)) @Rule( OR( OR(Sintomas(perda_peso=1), Sintomas(ganho_peso=1)), OR(Sintomas(reducao_alimentacao=1), Sintomas(aumento_alimentacao=1)))) def alteracao_alimentacao(self): self.declare(Sintomas(Sintomas(alteracao_alimentacao=1))) @Rule(OR(Sintomas(insonia=1), Sintomas(hipersonia=1))) def alteracao_sono(self): self.declare(Sintomas(alteracao_sono=1)) @Rule(OR(Sintomas(agitacao=1), Sintomas(retardo_psicomotor=1))) def alteracao_comportamentao(self): self.declare(Sintomas(alteracao_comportamentao=1)) @Rule(OR(Sintomas(fadiga=1), Sintomas(perda_energia=1))) def cansaco(self): self.declare(Sintomas(cansaco=1)) @Rule( OR(Sintomas(inutilidade=1), Sintomas(culpa_excessiva=1), Sintomas(culpa_inapropriada=1))) def sentimento_depressivo(self): self.declare(Sintomas(sentimento_depressivo=1)) @Rule(OR(Sintomas(capacidade_diminuida=1), Sintomas(indecisao=1))) def alteracao_pensamento(self): self.declare(Sintomas(alteracao_pensamento=1)) @Rule( AND(OR(Sintomas(humor_deprimido=1), Sintomas(perda_interesse=1)), Sintomas(verifica_sintomas_depressivos=1))) def sintomas_depressivos(self): self.declare(Sintomas(sintomas_depressivos=1)) @Rule( OR( OR(Sintomas(sofrimento_clinico=1), Sintomas(prejuiso_social=1)), OR(Sintomas(prejuiso_profissional=1), Sintomas(prejuiso_area_importancia=1)))) def transtorno(self): self.declare(Sintomas(transtorno=1)) @Rule(AND(Sintomas(sintomas_depressivos=1), Sintomas(fisiologico=1))) def depressao(self): self.declare(Sintomas(depressao=1)) self.facts() self.get_rules() @Rule(AND(Sintomas(mania=1), Sintomas(depressao=1))) def bipolar_i(self): self.declare(Sintomas(bipolar_i=1)) @Rule(AND(Sintomas(hipomania=1), Sintomas(depressao=1))) def bipolar_ii(self): self.declare(Sintomas(bipolar_ii=1)) @Rule( AND( OR(Sintomas(pensamentos_morte=1), Sintomas(psicose=1), Sintomas(transtorno=1)), Sintomas(mania=0), Sintomas(hipomania=0), Sintomas(depressao=0))) def outro_transtorno(self): self.declare(Sintomas(outro_transtorno=1)) @Rule(Sintomas(bipolar_i=1)) def tem_bipolar_i(self): self.halt() @Rule(Sintomas(bipolar_ii=1)) def tem_bipolar_ii(self): self.halt() @Rule( OR(AND(Sintomas(mania=0), Sintomas(depressao=1)), AND(Sintomas(hipomania=0), Sintomas(depressao=1)))) def tem_depressao(self): self.halt() @Rule(Sintomas(outro_transtorno=1)) def tem_outro_transtorno(self): self.halt() @Rule(Sintomas(outro_transtorno=0)) def nao_tem_outro_transtorno(self): self.halt()
class ControlEngine(KnowledgeEngine): def __init__(self): super().__init__() self.returnv={} #### RULES TO MODIFY #### ## Input processing rules @Rule(Input(T=MATCH.T, T_max=MATCH.Tmax, T_min=MATCH.Tmin, heating=True), TEST(lambda T,Tmax, Tmin : T >= Tmin + 0.1), #Tmax - (Tmax-Tmin)/2), salience=5) def _high_temp(self): self.declare(State(heating = False)) @Rule(Input(T=MATCH.T, T_min=MATCH.Tmin, T_max = MATCH.Tmax, heating=False, P_max=MATCH.Pmax), TEST(lambda T,Tmin, Tmax : T < Tmin+0.1),#Tmin + (Tmax-Tmin)/2), salience=5) def _low_temp(self): self.declare(State(heating = True)) @Rule(Input(SOC=MATCH.soc), TEST(lambda soc : soc < 0.9 and soc > 0.1), salience=5) def _SOCok(self,soc): self.declare(State(SOCok= True, SOC=soc)) @Rule(Input(SOC=MATCH.soc), TEST(lambda soc : soc >= 0.9 or soc <= 0.1), salience=5) def _SOCbad(self, soc): self.declare(State(SOCok= False, SOC=soc)) ## Decision processing rules @Rule(Input(P_max=MATCH.Pmax, Pset_heat = MATCH.Pset), State(heating=True), salience=3) def _heating1(self,Pmax, Pset): self.declare(Output(newPset_heat = -0.1*Pmax + (1-0.1)*Pset , heating=True)) @Rule(State(heating=False), salience=3) def _heating2(self): self.declare(Output(newPset_heat = 0.0, heating=False)) @Rule(Input(heating=True, P_max=MATCH.Pmax, Pset_heat = MATCH.Pset), NOT(State(heating=W())), salience=3) def _heating3(self,Pmax, Pset): self.declare(Output(newPset_heat = -0.7*Pmax + (1-0.7)*Pset,heating=True)) @Rule(State(SOCok=True), Input(Pgrid = MATCH.P_grid), TEST(lambda P_grid : P_grid <= 0), salience=4) def _socokout(self): self.declare(Output(newPset_batt = -0.5)) # ADAPT this #print("charging battery") @Rule(State(SOCok=True), Input(Pgrid = MATCH.P_grid, P_max = MATCH.Pmax, SOC = MATCH.soc), TEST(lambda P_grid :P_grid > 0), TEST(lambda soc : soc >0.2), salience=3) def _socokout1(self, Pmax): self.declare(Output(newPset_batt = 0.4)) # ADAPT this # print("discharging battery") @Rule(State(SOCok=False), salience=3) def _socbadout(self): self.declare(Output(newPset_batt = -0)) # this is the default @Rule(Input(heating=False), NOT(State(heating=W())), salience=3) def _heating4(self): self.declare(Output(newPset_heat = 0.0,heating=False)) #@Rule(Input(zs = MATCH.ZS), TEST(lambda ZS: ZS>-0.01 )) #def _too_much_sun(self): # self.declare(Output(newPset_heat = 0.0,heating=False)) # rule to return values last @Rule(AS.out << Output(), salience=0) # def _returnoutputs(self,out): self.returnv.update(**out.retrieve()) #print("generated this output: " +str(out.retrieve())) #### END OF RULES #### def get_return(self,key): return self.returnv.get(key) def set_return(self,returnvaluedict): self.returnv = returnvaluedict
class Person_KE(KnowledgeEngine): @Rule(NOT(ConflictResolver(resolved=True)), AND(Person(age=W('age')), Person(age=~W("age")))) def same_name(self, age): nonlocal executions executions.append(age)
class Person_KE(KnowledgeEngine): @Rule(Person(age=W('age')), Person(age=~W("age"))) def same_name(self, age): nonlocal executions executions.append(age)
class Person_KE(KnowledgeEngine): @Rule(Person(name=W("name")), NOT(Person(surname=W('name')))) def same_name(self, name): nonlocal executions executions.append(name)
class Bipolar(KnowledgeEngine): """ Coleta dos dados """ @Rule(NOT(Sintomas(pensamentos_morte=W()))) def ask_pensamentos_morte(self): self.declare( Sintomas(pensamentos_morte=ask("prejuiso_area_importancia? "))) @Rule(NOT(Sintomas(alteracao_pensamento=W()))) def ask_alteracao_pensamento(self): self.declare( Sintomas(alteracao_pensamento=ask("prejuiso_area_importancia? "))) @Rule(NOT(Sintomas(sentimento_depressivo=W()))) def ask_sentimento_depressivo(self): self.declare( Sintomas(sentimento_depressivo=ask("prejuiso_area_importancia? "))) @Rule(NOT(Sintomas(cansaco=W()))) def ask_cansaco(self): self.declare(Sintomas(cansaco=ask("prejuiso_area_importancia? "))) @Rule(NOT(Sintomas(alteracao_comportamentao=W()))) def ask_alteracao_comportamentao(self): self.declare( Sintomas( alteracao_comportamentao=ask("prejuiso_area_importancia? "))) @Rule(NOT(Sintomas(alteracao_sono=W()))) def ask_alteracao_sono(self): self.declare( Sintomas(alteracao_sono=ask("prejuiso_area_importancia? "))) @Rule(NOT(Sintomas(alteracao_alimentacao=W()))) def ask_alteracao_alimentacao(self): self.declare( Sintomas(alteracao_alimentacao=ask("prejuiso_area_importancia? "))) @Rule(NOT(Sintomas(perda_interesse=W()))) def ask_perda_interesse(self): self.declare( Sintomas(perda_interesse=ask("prejuiso_area_importancia? "))) @Rule(NOT(Sintomas(humor_deprimido=W()))) def ask_humor_deprimido(self): self.declare( Sintomas(humor_deprimido=ask("prejuiso_area_importancia? "))) @Rule( AND( NOT(Sintomas(verifica_sintomas_depressivos=W())), AND(OR(Sintomas(humor_deprimido=0), Sintomas(humor_deprimido=1)), Sintomas(humor_deprimido=MATCH.humor_deprimido)), AND(OR(Sintomas(perda_interesse=0), Sintomas(perda_interesse=1)), Sintomas(perda_interesse=MATCH.perda_interesse)), AND( OR(Sintomas(alteracao_alimentacao=0), Sintomas(alteracao_alimentacao=1)), Sintomas(alteracao_alimentacao=MATCH.alteracao_alimentacao)), AND(OR(Sintomas(alteracao_sono=0), Sintomas(alteracao_sono=1)), Sintomas(alteracao_sono=MATCH.alteracao_sono)), AND( OR(Sintomas(alteracao_comportamentao=0), Sintomas(alteracao_comportamentao=1)), Sintomas( alteracao_comportamentao=MATCH.alteracao_comportamentao)), AND(OR(Sintomas(cansaco=0), Sintomas(cansaco=1)), Sintomas(cansaco=MATCH.cansaco)), AND( OR(Sintomas(sentimento_depressivo=0), Sintomas(sentimento_depressivo=1)), Sintomas(sentimento_depressivo=MATCH.sentimento_depressivo)), AND( OR(Sintomas(alteracao_pensamento=0), Sintomas(alteracao_pensamento=1)), Sintomas(alteracao_pensamento=MATCH.alteracao_pensamento)), AND( OR(Sintomas(pensamentos_morte=0), Sintomas(pensamentos_morte=1)), Sintomas(pensamentos_morte=MATCH.pensamentos_morte)))) def define_sintomas_depressivos(self, humor_deprimido, perda_interesse, alteracao_alimentacao, alteracao_sono, alteracao_comportamentao, cansaco, sentimento_depressivo, alteracao_pensamento, pensamentos_morte): self.declare( Sintomas(verifica_sintomas_depressivos=verifica_conjunto([ humor_deprimido, perda_interesse, alteracao_alimentacao, alteracao_sono, alteracao_comportamentao, cansaco, sentimento_depressivo, alteracao_pensamento, pensamentos_morte ], 5))) @Rule( AND(OR(Sintomas(humor_deprimido=1), Sintomas(perda_interesse=1)), Sintomas(verifica_sintomas_depressivos=1))) def sintomas_depressivos(self): print("sintomas_depressivos") self.declare(Sintomas(sintomas_depressivos=1))
class Mania(KnowledgeEngine): """ Coleta dos dados """ result = { 'variable': None, 'isFinalAnswer': False, 'answer': None, } is_rest = True def ask(self, variable): if not self.is_rest: return ask(variable) else: self.result['variable'] = variable self.result['isFinalAnswer'] = False self.result['answer'] = None self.halt() def send(self, message): if not self.is_rest: print(message) else: self.result['variable'] = None self.result['isFinalAnswer'] = True self.result['answer'] = message self.halt() @Rule(Sintomas(fisiologico=None)) def ask_data_fisiologico(self): self.declare(Sintomas(fisiologico=self.ask("fisiologico"))) @Rule(Sintomas(prejuizo_social=None)) def ask_data_prejuizo_social(self): self.declare(Sintomas(prejuizo_social=self.ask("prejuizo_social"))) @Rule(Sintomas(prejuiso_profissional=None)) def ask_data_prejuiso_profissional(self): self.declare( Sintomas(prejuiso_profissional=self.ask("prejuiso_profissional"))) @Rule(Sintomas(psicose=None)) def ask_data_psicose(self): self.declare(Sintomas(psicose=self.ask("psicose"))) @Rule(Sintomas(autoestima_inflada=None)) def ask_data_autoestima_inflada(self): self.declare( Sintomas(autoestima_inflada=self.ask("autoestima_inflada"))) @Rule(Sintomas(grafndiosidade=None)) def ask_data_grandiosidade(self): self.declare(Sintomas(grandiosidade=self.ask("grandiosidade"))) @Rule(Sintomas(loquaz=None)) def ask_data_loquaz(self): self.declare(Sintomas(loquaz=self.ask("loquaz"))) @Rule(Sintomas(pressao_continuar_falando=None)) def ask_data_pressao_continuar_falando(self): self.declare( Sintomas(pressao_continuar_falando=self.ask( "pressao_continuar_falando"))) @Rule(Sintomas(fuga_ideias=None)) def ask_data_fuga_ideias(self): self.declare(Sintomas(fuga_ideias=self.ask("fuga_ideias"))) @Rule(Sintomas(pensamento_acelerado=None)) def ask_data_pensamento_acelerado(self): self.declare( Sintomas(pensamento_acelerado=self.ask("pensamento_acelerado"))) @Rule(Sintomas(aumento_atividade_objetivo=None)) def ask_data_aumento_atividade_objetivo(self): self.declare( Sintomas(aumento_atividade_objetivo=self.ask( "aumento_atividade_objetivo"))) @Rule(Sintomas(agitacao_psicomotora=None)) def ask_data_agitacao_psicomotora(self): self.declare( Sintomas(agitacao_psicomotora=self.ask("agitacao_psicomotora"))) @Rule(Sintomas(reducao_sono=None)) def ask_data_reducao_sono(self): self.declare(Sintomas(reducao_sono=self.ask("reducao_sono"))) @Rule(Sintomas(distrabilidade=None)) def ask_data_distrabilidade(self): self.declare(Sintomas(distrabilidade=self.ask("distrabilidade"))) @Rule(Sintomas(envolvimento_atividade_risco=None)) def ask_data_envolvimento_atividade_risco(self): self.declare( Sintomas(envolvimento_atividade_risco=self.ask( "envolvimento_atividade_risco"))) @Rule( AND( NOT(Sintomas(mudanca_comportamental=W())), AND( OR(Sintomas(autoestima_excessiva=0), Sintomas(autoestima_excessiva=1)), Sintomas(autoestima_excessiva=MATCH.autoestima_excessiva)), AND(OR(Sintomas(reducao_sono=0), Sintomas(reducao_sono=1)), Sintomas(reducao_sono=MATCH.reducao_sono)), AND(OR(Sintomas(aumento_fala=0), Sintomas(aumento_fala=1)), Sintomas(aumento_fala=MATCH.aumento_fala)), AND( OR(Sintomas(mudanca_modo_pensar=0), Sintomas(mudanca_modo_pensar=1)), Sintomas(mudanca_modo_pensar=MATCH.mudanca_modo_pensar)), AND(OR(Sintomas(distrabilidade=0), Sintomas(distrabilidade=1)), Sintomas(distrabilidade=MATCH.distrabilidade)), AND(OR(Sintomas(agitacao=0), Sintomas(agitacao=1)), Sintomas(agitacao=MATCH.agitacao)), AND( OR(Sintomas(envolvimento_atividade_risco=0), Sintomas(envolvimento_atividade_risco=1)), Sintomas(envolvimento_atividade_risco=MATCH. envolvimento_atividade_risco)))) def define_mudanca_comportamental(self, autoestima_excessiva, reducao_sono, aumento_fala, mudanca_modo_pensar, distrabilidade, agitacao, envolvimento_atividade_risco): self.declare( Sintomas(mudanca_comportamental=verifica_conjunto([ autoestima_excessiva, reducao_sono, aumento_fala, mudanca_modo_pensar, distrabilidade, agitacao, envolvimento_atividade_risco ], 3))) """ Verificação das regras """ @Rule( AND(Sintomas(mudanca_comportamental=1), Sintomas(fisiologico=1), Sintomas(psicose=1))) def mania(self): self.declare(Sintomas(mania=1)) self.send("mania:1") @Rule( AND(Sintomas(mudanca_comportamental=1), Sintomas(fisiologico=1), Sintomas(psicose=0))) def hipomania(self): self.declare(Sintomas(hipomania=1)) self.send("hipomania:1") @Rule(Sintomas(fisiologico=0)) def nao_fisiologico(self): self.declare(Sintomas(mania=0)) self.declare(Sintomas(hipomania=0)) self.send(":0") @Rule(Sintomas(mudanca_comportamental=0)) def nao_mudanca_comportamental(self): self.declare(Sintomas(mania=0)) self.declare(Sintomas(hipomania=0)) self.send(":0") @Rule(OR(Sintomas(prejuizo_social=1), Sintomas(prejuiso_profissional=1))) def prejuiso_acentuado(self): self.declare(Sintomas(prejuizo_acentuado=1)) @Rule(AND(Sintomas(prejuizo_social=0), Sintomas(prejuiso_profissional=0))) def nao_prejuiso_acentuado(self): self.declare(Sintomas(prejuizo_acentuado=0)) @Rule(OR(Sintomas(autoestima_inflada=1), Sintomas(grandiosidade=1))) def autoestima_excessiva(self): self.declare(Sintomas(autoestima_excessiva=1)) @Rule(AND(Sintomas(autoestima_inflada=0), Sintomas(grandiosidade=0))) def nao_autoestima_excessiva(self): self.declare(Sintomas(autoestima_excessiva=0)) @Rule(OR(Sintomas(loquaz=1), Sintomas(pressao_continuar_falando=1))) def aumento_fala(self): self.declare(Sintomas(aumento_fala=1)) @Rule(AND(Sintomas(loquaz=0), Sintomas(pressao_continuar_falando=0))) def nao_aumento_fala(self): self.declare(Sintomas(aumento_fala=0)) @Rule(OR(Sintomas(fuga_ideias=1), Sintomas(pensamento_acelerado=1))) def mudanca_modo_pensar(self): self.declare(Sintomas(mudanca_modo_pensar=1)) @Rule(AND(Sintomas(fuga_ideias=0), Sintomas(pensamento_acelerado=0))) def nao_mudanca_modo_pensar(self): self.declare(Sintomas(mudanca_modo_pensar=0)) @Rule( OR(Sintomas(aumento_atividade_objetivo=1), Sintomas(agitacao_psicomotora=1))) def agitacao(self): self.declare(Sintomas(agitacao=1)) @Rule( AND(Sintomas(aumento_atividade_objetivo=0), Sintomas(agitacao_psicomotora=0))) def nao_agitacao(self): self.declare(Sintomas(agitacao=0))