Exemple #1
0
def test_prepare_rule__or_starting_with_not():
    from pyknow import Rule, InitialFact, NOT, Fact, OR, AND

    rule = Rule(OR(NOT(Fact(1)), NOT(Fact(2))))(lambda: None)

    assert list(utils.prepare_rule(rule)) == [
        OR(AND(InitialFact(), NOT(Fact(1))), AND(InitialFact(), NOT(Fact(2))))
    ]
Exemple #2
0
def test_prepare_rule_is_dnf():
    from pyknow import Rule, NOT, AND, OR, Fact
    from pyknow.matchers.rete.dnf import dnf

    rule = Rule(AND(Fact(0), NOT(OR(Fact(1), Fact(2)))))(lambda: None)

    assert list(
        utils.prepare_rule(rule)) == [Fact(0),
                                      NOT(Fact(1)),
                                      NOT(Fact(2))]
Exemple #3
0
class Engine(KnowledgeEngine):
    @classmethod
    def from_rulesets(cls, rulesets):
        mixins = list()
        for name, ruleset in rulesets.items():
            mixins.append(RuleSet.build(name, ruleset))

        return type("RuleEngine", tuple([cls] + mixins), {})

    @DefFacts()
    def initial_vector(self, vectors):
        self.tasks = list()
        for vector in vectors:
            vector["_lineage"] = list()
            yield vector

    @Rule(AS.info << Info(_id=MATCH.id, _type=NE("error") & MATCH.type),
          NOT(Vector(_id=MATCH.id, _type=MATCH.type)))
    def info_to_vector_promotion(self, info):
        """New vector appeared."""
        self.declare(Vector(**info.as_dict()))

    @Rule(AS.task << TaskRequest())
    def launch_task(self, task):
        runner = plugin_runner(task["command"])
        lineage = unfreeze(task["lineages"])
        stdin = unfreeze(task["stdin"])

        self.tasks.append(runner(lineage, stdin))

    def start(self, vectors):
        # Declare initial facts
        self.reset(vectors=vectors)

        fresh_facts = True
        while self.tasks or fresh_facts:
            self.run()
            fresh_facts = False

            try:
                # Run all tasks and gather results
                for task in self.tasks:
                    for lineage in task:
                        info = Info.from_lineage(lineage)
                        self.declare(info)
                        fresh_facts = True
            except KeyboardInterrupt:
                # The user aborted the task
                break

            self.tasks = list()

        # Print a dirty report
        for fact in self.facts.values():
            if isinstance(fact, Info):
                yield unfreeze(fact.as_dict())
Exemple #4
0
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)])
Exemple #5
0
    class ControlEngine(KnowledgeEngine):
        def __init__(self):
            super().__init__()
            self.returnv = {}

        #### RULES TO MODIFY ####

        @Rule(Input(coffee_time=MATCH.coffee_time), salience=3)
        def no_coffee(self):
            self.declare(Output(coffee_on=False))

        @Rule(Input(coffee_time=MATCH.coffee_time, time=MATCH.time),
              NOT(Output(coffee_on=True)),
              TEST(lambda coffee_time, time: coffee_time == time),
              salience=5)
        def _time_for_coffee(self, time):

            self.declare(Output(coffee_on=True))
            print('something happened at %d' % time)

        @Rule(Input(time=MATCH.time))
        def _print_time(self, time):
            print(time)

        #### RULES FOR COFFEE MACHINE ####

        # rule to return values last
        @Rule(AS.out << Output(), salience=0)  #
        def _returnoutputs(self, out):
            self.returnv.update(**out.retrieve())

        #### END OF RULES ####

        def get_return(self, key):
            return self.returnv.get(key)

        def set_return(self, returnvaluedict):
            self.returnv = returnvaluedict
Exemple #6
0
 class KE(KnowledgeEngine):
     @Rule(Fact(x='x' << W()), NOT(Fact(y='x' << W())))
     def r1(self):
         pass
Exemple #7
0
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
Exemple #9
0
 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)
Exemple #10
0
 class Person_KE(KnowledgeEngine):
     @Rule(Person(name=W("name")), NOT(Person(surname=W('name'))))
     def same_name(self, name):
         nonlocal executions
         executions.append(name)
Exemple #11
0
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))
Exemple #12
0
def test_extract_facts():
    from pyknow import Rule, NOT, AND, OR, Fact

    rule = Rule(OR(AND(Fact(1), NOT(Fact(2))), Fact(3)))

    assert utils.extract_facts(rule) == {Fact(1), Fact(2), Fact(3)}
Exemple #13
0
def test_prepare_rule__rule_starting_with_not():
    from pyknow import Rule, InitialFact, NOT, Fact

    rule = Rule(NOT(Fact(1)))(lambda: None)

    assert list(utils.prepare_rule(rule)) == [InitialFact(), NOT(Fact(1))]
Exemple #14
0
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))