class EvaluationToMemberAgent(MindAgent):
    def __init__(self):
        self.chainer = None

    def create_chainer(self, atomspace):
        self.chainer = Chainer(atomspace,
                               stimulateAtoms=False,
                               allow_output_with_variables=True,
                               delete_temporary_variables=True)

        self.chainer.add_rule(
            GeneralEvaluationToMemberRule(self.chainer, 0, 2))
        self.chainer.add_rule(MemberToInheritanceRule(self.chainer))
        self.chainer.add_rule(
            DeductionRule(self.chainer, types.InheritanceLink))
        self.chainer.add_rule(
            InheritanceToMemberRule(self.chainer))
        self.chainer.add_rule(
            MemberToEvaluationRule(self.chainer))

    def run(self, atomspace):
        if self.chainer is None:
            self.create_chainer(atomspace)
            return

        result = self.chainer.forward_step()
        return result
Example #2
0
class InferenceAgent(MindAgent):
    def __init__(self):
        self.chainer = None

    def create_chainer(self, atomspace):
        self.chainer = Chainer(atomspace,
                               stimulateAtoms=False,
                               allow_output_with_variables=True)

        # EvaluationToMember, MemberToInheritance
        self.chainer.add_rule(
            EvaluationToMemberRule(self.chainer, 0, 1))
        self.chainer.add_rule(MemberToEvaluationRule(self.chainer))
        self.chainer.add_rule(MemberToInheritanceRule(self.chainer))
        self.chainer.add_rule(InheritanceToMemberRule(self.chainer))

        # For predicates with 2 arguments,
        # with the 0th argument made into a variable
        self.chainer.add_rule(
            EvaluationToMemberRule(self.chainer, 0, 2))

        # ModusPonens:
        # Implication smokes(x) cancer(X)
        # smokes(Anna)
        # |= cancer(Anna)
        self.chainer.add_rule(
            ModusPonensRule(self.chainer, types.ImplicationLink))

    def run(self, atomspace):
        if self.chainer is None:
            self.create_chainer(atomspace)
            return

        result = self.chainer.forward_step()
        return result
Example #3
0
class InferenceAgent(MindAgent):
    def __init__(self):
        self.chainer = None

    def create_chainer(self, atomspace, stimulate_atoms=True):
        self.chainer = Chainer(atomspace,
                               agent=self,
                               stimulateAtoms=stimulate_atoms,
                               allow_output_with_variables=False,
                               preferAttentionalFocus=True,
                               delete_temporary_variables=True)

        # ModusPonens:
        # Implication smokes(x) cancer(X)
        # smokes(Anna)
        # |= cancer(Anna)
        self.chainer.add_rule(
            ModusPonensRule(self.chainer, types.ImplicationLink))

    def run(self, atomspace):
        if self.chainer is None:
            self.create_chainer(atomspace)
            return

        if not check_result(atomspace):
            result = self.chainer.forward_step()
            return result
Example #4
0
class InferenceAgent(MindAgent):
    def __init__(self):
        self.chainer = None

    def create_chainer(self, atomspace):
        self.chainer = Chainer(atomspace, stimulateAtoms=False)

        # Note:
        # The API for adding Rules and Links to a PLN Chainer is
        # hard to use. It could be redesigned so that you would
        # just pass a list of rule types and link types when you
        # instantiate the Chainer, without having to be aware of
        # the different sets of rules that require different
        # argument sets.

        for rule in RULES_CHAINER_LINKTYPE:
            for link_type in LINK_TYPES:
                print rule, link_type
                self.chainer.add_rule(rule(self.chainer, link_type))

        for rule in RULES_CHAINER:
            self.chainer.add_rule(rule(self.chainer))

    def run(self, atomspace):
        if self.chainer is None:
            self.create_chainer(atomspace)
            return

        result = self.chainer.forward_step()

        if __VERBOSE__:
            print result

        return result
Example #5
0
class InferenceAgent(MindAgent):
    def __init__(self):
        self.chainer = None
        print "Initializing InferenceAgent."

    def create_chainer(self, atomspace, stimulate_atoms=True):
        self.chainer = Chainer(atomspace,
                               agent=self,
                               stimulateAtoms=stimulate_atoms,
                               allow_output_with_variables=False,
                               preferAttentionalFocus=True,
                               delete_temporary_variables=True)

        # ModusPonens:
        # Implication smokes(x) cancer(X)
        # smokes(Anna)
        # |= cancer(Anna)
        self.chainer.add_rule(
            ModusPonensRule(self.chainer, types.ImplicationLink))

    def run(self, atomspace):
        if self.chainer is None:
            self.create_chainer(atomspace)
            print "PLN Chainer created."
            return

        print "PLN continuing."

        target = atomspace[scheme_eval_h(atomspace, "query")]

        if not check_result(atomspace):
            result = self.chainer.forward_step()
            self.chainer._give_stimulus(target, TARGET_STIMULUS)

            return result
Example #6
0
class InferenceAgent(MindAgent):
    def __init__(self):
        self.chainer = None
        print "Initializing InferenceAgent."

    def create_chainer(self, atomspace, stimulate_atoms=True):
        self.chainer = Chainer(atomspace,
                               agent=self,
                               stimulateAtoms=stimulate_atoms,
                               allow_output_with_variables=False,
                               preferAttentionalFocus=True,
                               delete_temporary_variables=True)

        # ModusPonens:
        # Implication smokes(x) cancer(X)
        # smokes(Anna)
        # |= cancer(Anna)
        self.chainer.add_rule(
            ModusPonensRule(self.chainer, types.ImplicationLink))

    def run(self, atomspace):
        if self.chainer is None:
            self.create_chainer(atomspace)
            print "PLN Chainer created."
            return

        print "PLN continuing."

        target = atomspace[scheme_eval_h(atomspace, "query")]

        if not check_result(atomspace):
            result = self.chainer.forward_step()
            self.chainer._give_stimulus(target, TARGET_STIMULUS)

            return result
Example #7
0
class DeceptionAgent(MindAgent):
    def __init__(self):
        self.chainer = None
        print "Initialized DeceptionAgent."

    def create_chainer(self, atomspace, stimulate_atoms=False):
        self.chainer = Chainer(atomspace,
                               agent=self,
                               stimulateAtoms=stimulate_atoms,
                               allow_output_with_variables=False,
                               delete_temporary_variables=True)

        self.chainer.add_rule(
            ModusPonensRule(self.chainer, types.ImplicationLink))

    def run(self, atomspace):
        if self.chainer is None:
            self.create_chainer(atomspace)
            return

        result = self.chainer.forward_step()

        # if __VERBOSE__:
        #     print result

        return result

    def get_trails(self):
        return self.chainer.trails

    def get_history(self):
        return self.chainer.history.get_history()
class DeductionAgent(MindAgent):
    def __init__(self):
        self.chainer = None

    def create_chainer(self, atomspace):
        self.chainer = Chainer(atomspace, stimulateAtoms=False)

        link_types = [types.InheritanceLink]

        for link_type in link_types:
            self.chainer.add_rule(DeductionRule(self.chainer, link_type))

    def run(self, atomspace):
        # Run is invoked on every cogserver cognitive cycle
        # If it is the first time it has been invoked, then the chainer
        # needs to be created
        if self.chainer is None:
            self.create_chainer(atomspace)
            return

        result = self.chainer.forward_step()

        if __VERBOSE__:
            print result

        return result

    def get_trails(self):
        return self.chainer.trails

    def get_history(self):
        return self.chainer.history.get_history()
Example #9
0
class InferenceAgent(MindAgent):
    def __init__(self):
        self.chainer = None

    def create_chainer(self, atomspace, stimulate_atoms=True):
        self.chainer = Chainer(atomspace,
                               agent=self,
                               stimulateAtoms=stimulate_atoms,
                               allow_output_with_variables=False,
                               preferAttentionalFocus=True,
                               delete_temporary_variables=True)

        # ModusPonens:
        # Implication smokes(x) cancer(X)
        # smokes(Anna)
        # |= cancer(Anna)
        self.chainer.add_rule(
            ModusPonensRule(self.chainer, types.ImplicationLink))

    def run(self, atomspace):
        if self.chainer is None:
            self.create_chainer(atomspace)
            return

        if not check_result(atomspace):
            result = self.chainer.forward_step()
            return result
Example #10
0
class DeceptionAgent(MindAgent):
    def __init__(self):
        self.chainer = None
        print "Initialized DeceptionAgent."

    def create_chainer(self, atomspace, stimulate_atoms=False):
        self.chainer = Chainer(atomspace,
                               agent=self,
                               stimulateAtoms=stimulate_atoms,
                               allow_output_with_variables=False,
                               delete_temporary_variables=True)

        self.chainer.add_rule(
            ModusPonensRule(self.chainer, types.ImplicationLink))

    def run(self, atomspace):
        if self.chainer is None:
            self.create_chainer(atomspace)
            return

        result = self.chainer.forward_step()

        # if __VERBOSE__:
        #     print result

        return result

    def get_trails(self):
        return self.chainer.trails

    def get_history(self):
        return self.chainer.history.get_history()
Example #11
0
class InferenceAgent(MindAgent):
    def __init__(self):
        self.chainer = None
        self.query = None
        print "Initializing InferenceAgent."

    def create_chainer(self, atomspace, stimulate_atoms=True):
        """
        Creates the chainer for the "smokes" example. Optionally, you can
         define the target query before calling this method, by defining a
         Scheme expression named "query". For example, you can issue the
         Scheme expression "(define query hasCancer)" in reference to the
         predicate defined in smokes.scm before loading this agent. Once
         defined, the target query will receive stimulus at every time step.
         Stimulus requires the agent to be running in a CogServer.
         For a complete example that incorporates this behavior, see
         example.py here:
           https://github.com/opencog/external-tools/tree/master/attention
        """
        self.chainer = Chainer(atomspace,
                               agent=self,
                               stimulateAtoms=stimulate_atoms,
                               allow_output_with_variables=False,
                               preferAttentionalFocus=True,
                               delete_temporary_variables=True)

        # ModusPonens:
        # Implication smokes(x) cancer(X)
        # smokes(Anna)
        # |= cancer(Anna)
        self.chainer.add_rule(
            ModusPonensRule(self.chainer, types.ImplicationLink))

        # stimulateAtoms is only enabled when the agent is ran inside the
        # CogServer, since the functionality requires a CogServer and
        # attention allocation
        if self.chainer._stimulateAtoms:
            self.query = scheme_eval_h(atomspace, "query")

    def run(self, atomspace):
        if self.chainer is None:
            self.create_chainer(atomspace)
            print "PLN Chainer created."
            return

        print "PLN continuing."

        if not check_result(atomspace):
            result = self.chainer.forward_step()

            if self.query is not None:
                self.chainer._give_stimulus(atomspace[self.query],
                                            TARGET_STIMULUS)

            return result
Example #12
0
class BackwardInferenceAgent(MindAgent):
    def __init__(self):
        self.chainer = None

    def create_chainer(self, atomspace):
        self.chainer = Chainer(atomspace, stimulateAtoms=False, agent=self)

        deduction_link_types = [types.InheritanceLink]
        #            types.SubsetLink, types.IntensionalInheritanceLink]
        for link_type in deduction_link_types:
            self.chainer.add_rule(rules.InversionRule(self.chainer, link_type))
            self.chainer.add_rule(rules.DeductionRule(self.chainer, link_type))

#        self.chainer.add_rule(rules.NotCreationRule(self.chainer))
#        self.chainer.add_rule(rules.NotEliminationRule(self.chainer))

#        for rule in rules.create_and_or_rules(self.chainer, 1, 5):
#            self.chainer.add_rule(rule)

#        self.chainer.add_rule(EvaluationToMemberRule(self.chainer))
#        self.chainer.add_rule(MemberToInheritanceRule(self.chainer))

    def run(self, atomspace):
        # incredibly exciting futuristic display!
        #import os
        #os.system('cls' if os.name=='nt' else 'clear')

        #        try:
        if self.chainer is None:
            self.create_chainer(atomspace)

        result = self.chainer.backward_step()
        if result:
            (outputs, inputs) = result

            if False:
                print '==== Inference ===='
                print show_atoms(outputs), '<=', show_atoms(inputs)

                print
                print '==== Attentional Focus ===='
                for atom in get_attentional_focus(atomspace)[0:30]:
                    print str(atom), atom.av

                #print '==== Result ===='
                #print output
                #print '==== Trail ===='
                #print_atoms( self.chainer.trails[output] )

            if self.chainer._all_nonzero_tvs(inputs):
                raw_input()

        else:
            print 'Invalid inference attempted'
Example #13
0
class BackwardInferenceAgent(MindAgent):
    def __init__(self):
        self.chainer = None

    def create_chainer(self, atomspace):
        self.chainer = Chainer(atomspace, stimulateAtoms = False, agent = self)

        deduction_link_types = [types.InheritanceLink]
#            types.SubsetLink, types.IntensionalInheritanceLink]
        for link_type in deduction_link_types:
            self.chainer.add_rule(rules.InversionRule(self.chainer, link_type))
            self.chainer.add_rule(rules.DeductionRule(self.chainer, link_type))

#        self.chainer.add_rule(rules.NotCreationRule(self.chainer))
#        self.chainer.add_rule(rules.NotEliminationRule(self.chainer))

#        for rule in rules.create_and_or_rules(self.chainer, 1, 5):
#            self.chainer.add_rule(rule)

#        self.chainer.add_rule(EvaluationToMemberRule(self.chainer))
#        self.chainer.add_rule(MemberToInheritanceRule(self.chainer))

    def run(self, atomspace):
        # incredibly exciting futuristic display!
        #import os
        #os.system('cls' if os.name=='nt' else 'clear')

#        try:
        if self.chainer is None:
            self.create_chainer(atomspace)

        result = self.chainer.backward_step()
        if result:
            (outputs, inputs) = result

            if False:
                print '==== Inference ===='
                print show_atoms(outputs), '<=', show_atoms(inputs)

                print
                print '==== Attentional Focus ===='
                for atom in get_attentional_focus(atomspace)[0:30]:
                    print str(atom), atom.av

                #print '==== Result ===='
                #print output
                #print '==== Trail ===='
                #print_atoms( self.chainer.trails[output] )

            if self.chainer._all_nonzero_tvs(inputs):
                raw_input()

        else:
            print 'Invalid inference attempted'
Example #14
0
def create_chainer(atomspace, rule_concept_nodes):
    """
    :param atomspace: the atomspace to be used by the chainer
    :param concept_nodes: list of ConceptNodes where the name is the name of a
    rule optionally amended by a link_type separated with ":", e.g.
    [ConceptNode "ModusPonensRule:ImplicationLink"]
    :return: the chainer that has been created
    """
    chainer = Chainer(atomspace,
                      stimulateAtoms=False,
                      allow_output_with_variables=True,
                      delete_temporary_variables=True)
    for rule_concept_node in rule_concept_nodes:
        rule_name, link_type = rule_concept_node.name.split(":")
        chainer.add_rule(rules[rule_name](chainer, link_types[link_type]))
    return chainer
def create_chainer(atomspace, rule_concept_nodes):
    """
    :param atomspace: the atomspace to be used by the chainer
    :param concept_nodes: list of ConceptNodes where the name is the name of a
    rule optionally amended by a link_type separated with ":", e.g.
    [ConceptNode "ModusPonensRule:ImplicationLink"]
    :return: the chainer that has been created
    """
    chainer = Chainer(atomspace,
                      stimulateAtoms=False,
                      allow_output_with_variables=True,
                      delete_temporary_variables=True)
    for rule_concept_node in rule_concept_nodes:
        rule_name, link_type = rule_concept_node.name.split(":")
        chainer.add_rule(rules[rule_name](chainer, link_types[link_type]))
    return chainer
Example #16
0
class InferenceAgent(MindAgent):
    def __init__(self):
        self.chainer = None

    def create_chainer(self, atomspace):
        self.chainer = Chainer(atomspace, stimulateAtoms=False)

        self.chainer.add_rule(
            ModusPonensRule(self.chainer, types.ImplicationLink))

    def run(self, atomspace):
        if self.chainer is None:
            self.create_chainer(atomspace)
            return

        result = self.chainer.forward_step()
        return result
Example #17
0
class InferenceAgent(MindAgent):
    def __init__(self):
        self.chainer = None
        self.antecedents = []

    def create_chainer(self, atomspace):
        self.chainer = Chainer(atomspace,
                               agent=self,
                               stimulateAtoms=True,
                               preferAttentionalFocus=True,
                               delete_temporary_variables=True,
                               allow_output_with_variables=True)

        self.chainer.add_rule(
            ModusPonensRule(self.chainer, types.ImplicationLink))

    def run(self, atomspace):
        if self.chainer is None:
            self.create_chainer(atomspace)

            implications = atomspace.get_atoms_by_type(types.ImplicationLink)
            for implication in implications:
                outgoing = atomspace.get_outgoing(implication.h)
                and_link = outgoing[0]
                self.antecedents.append(and_link)

            return

        # Run a forward step of the chainer with the ModusPonensRule so as to
        # perform inference using the "domain rules" defined as
        # ImplicationLinks
        self.chainer.forward_step()

        # Run a backward step of the chainer with the AndCreationRule for each
        # of the antecedents of the defined "domain rules" so as to
        # successfully ground the variables.
        for antecedent in self.antecedents:
            num_predicates = len(atomspace.get_outgoing(antecedent.h))
            self.chainer.backward_step(
                AndCreationRule(self.chainer, num_predicates), [antecedent])

        return
Example #18
0
class TemporalAgent(MindAgent):
    def __init__(self):
        self.chainer = None

    def create_chainer(self, atomspace):
        self.chainer = Chainer(atomspace,
                               stimulateAtoms=False,
                               preferAttentionalFocus=False,
                               allow_output_with_variables=True,
                               delete_temporary_variables=True)

        for rule in create_temporal_rules(self.chainer):
            self.chainer.add_rule(rule)

    def run(self, atomspace):
        if self.chainer is None:
            self.create_chainer(atomspace)
            return

        result = self.chainer.forward_step()
        return result
Example #19
0
class BackwardAgent(MindAgent):
    def __init__(self):
        self.chainer = None

    def create_chainer(self, atomspace):
        self.chainer = Chainer(atomspace,
                               stimulateAtoms=False,
                               allow_output_with_variables=True,
                               delete_temporary_variables=True)

        self.chainer.add_rule(
            ModusPonensRule(self.chainer, types.ImplicationLink))

    def run(self, atomspace):
        if self.chainer is None:
            self.create_chainer(atomspace)
            print "PLN Chainer created."
            return

        result = self.chainer.backward_step()
        return result
Example #20
0
class TemporalAgent(MindAgent):
    def __init__(self):
        self.chainer = None

    def create_chainer(self, atomspace):
        self.chainer = Chainer(atomspace,
                               stimulateAtoms=False,
                               preferAttentionalFocus=False,
                               allow_output_with_variables=True,
                               delete_temporary_variables=True)

        for rule in create_composition_rules(self.chainer, composition_table):
            self.chainer.add_rule(rule)
            print(rule.name)

    def run(self, atomspace):
        if self.chainer is None:
            self.create_chainer(atomspace)
            return

        result = self.chainer.forward_step()
        return result
Example #21
0
class ForwardInferenceAgent(MindAgent):
    def __init__(self):
        self.chainer = None

    def run(self, atomspace):
        if self.chainer is None:
            self.chainer = Chainer(atomspace, stimulateAtoms = True, agent = self)

            self.chainer.add_rule(rules.InversionRule(self.chainer))
            self.chainer.add_rule(rules.DeductionRule(self.chainer))

        # incredibly exciting futuristic display!
        #import os
        #os.system('cls' if os.name=='nt' else 'clear')

        try:
            result = self.chainer.forward_step()
            if result:
                (output, inputs) = result

                print '==== Inference ===='
                print output,str(output.av),'<=',' '.join(str(i)+str(output.av) for i in inputs)

                print
                print '==== Attentional Focus ===='
                for atom in get_attentional_focus(atomspace)[0:30]:
                    print str(atom), atom.av

                #print '==== Result ===='
                #print output
                #print '==== Trail ===='
                #print_atoms( self.chainer.trails[output] )
            else:
                print 'Invalid inference attempted'
        except Exception, e:
            print e
class EvaluationToMemberAgent(MindAgent):
    def __init__(self):
        self.chainer = None

    def create_chainer(self, atomspace):
        self.chainer = Chainer(atomspace,
                               stimulateAtoms=False,
                               allow_output_with_variables=True,
                               delete_temporary_variables=True)

        self.chainer.add_rule(EvaluationToMemberRule(self.chainer, 0, 2))
        self.chainer.add_rule(MemberToInheritanceRule(self.chainer))
        self.chainer.add_rule(
            DeductionRule(self.chainer, types.InheritanceLink))
        self.chainer.add_rule(InheritanceToMemberRule(self.chainer))
        self.chainer.add_rule(MemberToEvaluationRule(self.chainer))

    def run(self, atomspace):
        if self.chainer is None:
            self.create_chainer(atomspace)
            return

        result = self.chainer.forward_step()
        return result
class EvaluationToMemberAgent(MindAgent):
    def __init__(self):
        self.chainer = None

    def create_chainer(self, atomspace):
        self.chainer = Chainer(atomspace, stimulateAtoms=False)

        # EvaluationToMemberRule only accepts predicates with 1 argument
        # For predicates with more arguments, GeneralEvaluationToMemberRule
        # is used.
        self.chainer.add_rule(
            GeneralEvaluationToMemberRule(self.chainer, 0, 2))
        self.chainer.add_rule(MemberToInheritanceRule(self.chainer))
        self.chainer.add_rule(
            DeductionRule(self.chainer, types.InheritanceLink))

    def run(self, atomspace):
        if self.chainer is None:
            self.create_chainer(atomspace)
            return

        result = self.chainer.forward_step()
        return result
class EvaluationToMemberAgent(MindAgent):
    def __init__(self):
        self.chainer = None

    def create_chainer(self, atomspace):
        self.chainer = Chainer(atomspace, stimulateAtoms=False)

        # EvaluationToMemberRule only accepts predicates with 1 argument
        # For predicates with more arguments, GeneralEvaluationToMemberRule
        # is used.
        self.chainer.add_rule(GeneralEvaluationToMemberRule(
            self.chainer, 0, 2))
        self.chainer.add_rule(MemberToInheritanceRule(self.chainer))
        self.chainer.add_rule(
            DeductionRule(self.chainer, types.InheritanceLink))

    def run(self, atomspace):
        if self.chainer is None:
            self.create_chainer(atomspace)
            return

        result = self.chainer.forward_step()
        return result
Example #25
0
class InferenceAgent(MindAgent):
    def __init__(self):
        self.chainer = None
        self.num_steps_per_cycle = 100

    def create_chainer(self, atomspace):
        # Note: using stimulateAtoms will cause a segfault if you create the Agent from the Python shell (use the agents-start command in the cogserver shell)
        self.chainer = Chainer(atomspace, stimulateAtoms = False, agent = self, learnRuleFrequencies=True)

        # ImplicationLink is MixedImplicationLink, you could also have Extensional and Intensional Implication. etc. but that's a bit much.
#        similarity_types = [types.SimilarityLink, types.ExtensionalSimilarityLink, types.IntensionalSimilarityLink]
#            types.EquivalenceLink]
#        conditional_probability_types = [types.InheritanceLink, types.SubsetLink, types.IntensionalInheritanceLink, types.ImplicationLink]

        # always use the mixed inheritance types, because human inference is normally a mix of intensional and extensional
        conditional_probability_types = [types.InheritanceLink, types.ImplicationLink, types.PredictiveImplicationLink]
        similarity_types = [types.SimilarityLink, types.EquivalenceLink]

        for link_type in conditional_probability_types:
            self.chainer.add_rule(rules.InversionRule(self.chainer, link_type))
            self.chainer.add_rule(rules.DeductionRule(self.chainer, link_type))
            self.chainer.add_rule(rules.InductionRule(self.chainer, link_type))
            self.chainer.add_rule(rules.AbductionRule(self.chainer, link_type))
            # Seems better than Modus Ponens - it doesn't make anything up
            self.chainer.add_rule(rules.TermProbabilityRule(self.chainer, link_type))
            self.chainer.add_rule(rules.ModusPonensRule(self.chainer, link_type))

        for link_type in similarity_types:
            # SimilarityLinks don't require an InversionRule obviously
            self.chainer.add_rule(rules.TransitiveSimilarityRule(self.chainer, link_type))
            self.chainer.add_rule(rules.SymmetricModusPonensRule(self.chainer, link_type))

        self.chainer.add_rule(predicate_rules.EvaluationImplicationRule(self.chainer))

        # These two Rules create mixed links out of intensional and extensional links
        self.chainer.add_rule(rules.InheritanceRule(self.chainer))
        self.chainer.add_rule(rules.SimilarityRule(self.chainer))

        # boolean links
        for rule in boolean_rules.create_and_or_rules(self.chainer, 2, 8):
            self.chainer.add_rule(rule)

        # create probabilistic logical links out of MemberLinks

        self.chainer.add_rule(rules.AndEvaluationRule(self.chainer))
        self.chainer.add_rule(rules.OrEvaluationRule(self.chainer))

        # These two "macro rules" make the individual rules redundant
        self.chainer.add_rule(rules.ExtensionalLinkEvaluationRule(self.chainer))
        self.chainer.add_rule(rules.IntensionalLinkEvaluationRule(self.chainer))
        #self.chainer.add_rule(rules.SubsetEvaluationRule(self.chainer))
        self.chainer.add_rule(rules.NegatedSubsetEvaluationRule(self.chainer))
        #self.chainer.add_rule(rules.ExtensionalSimilarityEvaluationRule(self.chainer))
        #self.chainer.add_rule(rules.IntensionalInheritanceEvaluationRule(self.chainer))
        #self.chainer.add_rule(rules.IntensionalSimilarityEvaluationRule(self.chainer))

        self.member_rules = [rules.EvaluationToMemberRule(self.chainer)]
        self.member_rules += rules.create_general_evaluation_to_member_rules(self.chainer)
        for rule in self.member_rules:
            self.chainer.add_rule(rule)

        # It's important to have both of these
        self.chainer.add_rule(rules.MemberToInheritanceRule(self.chainer))
#        self.chainer.add_rule(rules.InheritanceToMemberRule(self.chainer))

        # AttractionLink could be useful for causality
        self.chainer.add_rule(rules.AttractionRule(self.chainer))

        self.chainer.add_rule(quantifier_rules.ScholemRule(self.chainer))

        #self.chainer.add_rule(rules.OntologicalInheritanceRule(self.chainer))

#        for rule in temporal_rules.create_temporal_rules(self.chainer):
#            self.chainer.add_rule(rule)

#        higher_order_rules = []
#        for rule in self.chainer.rules:
#            higher_order_rules.append(quantifier_rules.HigherOrderRule(self.chainer, rule))
#
#        contextual_rules = []
#        for rule in self.chainer.rules:
#            contextual_rules.append(context_rules.ContextualRule(self.chainer, rule))
#
#        for rule in higher_order_rules + contextual_rules:
#            self.chainer.add_rule(rule)
#
#        self.chainer.add_rule(context_rules.AndToContextRule(self.chainer, types.InheritanceLink))

    def run(self, atomspace):
        if self.chainer is None:
            self.create_chainer(atomspace)
            # For simplicity, do nothing the first time. Silly APIs mean you have to call run to set the atomspace
            return

        # Update all of the node probabilities at each step
        #self.chainer.update_all_node_probabilities()

        for i in xrange(0, self.num_steps_per_cycle):
            self.step()

    def step(self):
        result = self.chainer.forward_step()
        result = self.chainer.backward_step()
Example #26
0
class ForwardInferenceAgent(MindAgent):
    def __init__(self):
        self.chainer = None

    def create_chainer(self, atomspace):
        self.chainer = Chainer(atomspace, stimulateAtoms = False, agent = self, learnRuleFrequencies=False)

        # ImplicationLink is MixedImplicationLink, you could also have Extensional and Intensional Implication. etc. but that's a bit much.
#        similarity_types = [types.SimilarityLink, types.ExtensionalSimilarityLink, types.IntensionalSimilarityLink]
#            types.EquivalenceLink]
#        conditional_probability_types = [types.InheritanceLink, types.SubsetLink, types.IntensionalInheritanceLink, types.ImplicationLink]

        # always use the mixed inheritance types, because human inference is normally a mix of intensional and extensional
        conditional_probability_types = [types.InheritanceLink, types.ImplicationLink]
        similarity_types = [types.SimilarityLink, types.EquivalenceLink]

        for link_type in conditional_probability_types:
            self.chainer.add_rule(rules.InversionRule(self.chainer, link_type))
            self.chainer.add_rule(rules.DeductionRule(self.chainer, link_type))
            self.chainer.add_rule(rules.InductionRule(self.chainer, link_type))
            self.chainer.add_rule(rules.AbductionRule(self.chainer, link_type))
            # Seems better than Modus Ponens - it doesn't make anything up
            self.chainer.add_rule(rules.TermProbabilityRule(self.chainer, link_type))

        self.chainer.add_rule(rules.TransitiveSimilarityRule(self.chainer))
        # We also want symmetric Modus Ponens. It doesn't need inversion though obviously

        # These two Rules create mixed links out of intensional and extensional links
        self.chainer.add_rule(rules.InheritanceRule(self.chainer))
        self.chainer.add_rule(rules.SimilarityRule(self.chainer))

        # boolean links
        for rule in boolean_rules.create_and_or_rules(self.chainer, 2, 3):
            self.chainer.add_rule(rule)

        # create probabilistic logical links out of MemberLinks

        self.chainer.add_rule(rules.AndEvaluationRule(self.chainer))
        self.chainer.add_rule(rules.OrEvaluationRule(self.chainer))

        # These two "macro rules" make the individual rules redundant
        self.chainer.add_rule(rules.ExtensionalLinkEvaluationRule(self.chainer))
        self.chainer.add_rule(rules.IntensionalLinkEvaluationRule(self.chainer))
        #self.chainer.add_rule(rules.SubsetEvaluationRule(self.chainer))
        self.chainer.add_rule(rules.NegatedSubsetEvaluationRule(self.chainer))
        #self.chainer.add_rule(rules.ExtensionalSimilarityEvaluationRule(self.chainer))
        #self.chainer.add_rule(rules.IntensionalInheritanceEvaluationRule(self.chainer))
        #self.chainer.add_rule(rules.IntensionalSimilarityEvaluationRule(self.chainer))

        self.member_rules = [rules.EvaluationToMemberRule(self.chainer)]
        self.member_rules += rules.create_general_evaluation_to_member_rules(self.chainer)
        for rule in self.member_rules:
            self.chainer.add_rule(rule)

        # It's important to have both of these
        self.chainer.add_rule(rules.MemberToInheritanceRule(self.chainer))
#        self.chainer.add_rule(rules.InheritanceToMemberRule(self.chainer))

        # AttractionLink could be useful for causality
        self.chainer.add_rule(rules.AttractionRule(self.chainer))

        self.chainer.add_rule(rules.OntologicalInheritanceRule(self.chainer))

#        for rule in temporal_rules.create_temporal_rules(self.chainer):
#            self.chainer.add_rule(rule)

        higher_order_rules = []
        for rule in self.chainer.rules:
            higher_order_rules.append(quantifier_rules.HigherOrderRule(self.chainer, rule))

        contextual_rules = []
#        for rule in self.chainer.rules:
#            contextual_rules.append(context_rules.ContextualRule(self.chainer, rule))

        for rule in higher_order_rules + contextual_rules:
            self.chainer.add_rule(rule)

        self.chainer.add_rule(context_rules.AndToContextRule(self.chainer, types.InheritanceLink))

    def run(self, atomspace):
        # incredibly exciting futuristic display!
        #import os
        #os.system('cls' if os.name=='nt' else 'clear')

        def show_atoms(atoms):
            return ' '.join(str(atom)+str(atom.av) for atom in atoms)

        if self.chainer is None:
            self.create_chainer(atomspace)
            # For simplicity, do nothing the first time. Silly APIs mean you have to call run to set the atomspace
            return

        # Update all of the node probabilities at each step
        #self.chainer.update_all_node_probabilities()

        result = self.chainer.forward_step()
        if result:
            (rule, inputs, outputs) = result

            print '==== Inference ===='
            print rule.name, show_atoms(outputs), '<=', show_atoms(inputs)

            #print
            #print '==== Attentional Focus ===='
            #for atom in get_attentional_focus(atomspace)[0:30]:
            #    print str(atom), atom.av

            #print '==== Result ===='
            #print output
            #print '==== Trail ===='
            #print_atoms( self.chainer.trails[output] )
        else:
            print 'Invalid inference attempted'

        try:
            pass
        except AssertionError:
            import sys,traceback
            _,_,tb = sys.exc_info()
            traceback.print_tb(tb) # Fixed format

            tbInfo = traceback.extract_tb(tb)
            filename,line,func,text = tbInfo[-1]
            print ('An error occurred on line ' + str(line) + ' in statement ' + text)
            exit(1)
        except Exception, e:
            print e
            print e.args
            e.print_traceback()

            import sys,traceback
            _,_,tb = sys.exc_info()
            traceback.print_tb(tb) # Fixed format

            tbInfo = traceback.extract_tb(tb)
            filename,line,func,text = tbInfo[-1]
            print ('An error occurred on line ' + str(line) + ' in statement ' + text)
            exit(1)
Example #27
0
class InferenceAgent(MindAgent):
    def __init__(self):
        self.chainer = None
        self.num_steps_per_cycle = 100

    def create_chainer(self, atomspace):
        # Note: using stimulateAtoms will cause a segfault if you
        # create the Agent from the Python shell (use the agents-start
        # command in the cogserver shell). It's because giving atoms
        # stimulus only works if the MindAgent is added to the
        # CogServer's list of agents.
        self.chainer = Chainer(atomspace,
                               stimulateAtoms=False,
                               agent=self,
                               learnRuleFrequencies=True)

        # Todo: Cleanup the following section where rules are added

        # ImplicationLink is MixedImplicationLink, you could also have
        # Extensional and Intensional Implication. etc. but that's a bit
        # much.
        # similarity_types =
        # [types.SimilarityLink,
        # types.ExtensionalSimilarityLink,
        # types.IntensionalSimilarityLink,
        # types.EquivalenceLink]
        #
        # conditional_probability_types =
        # [types.InheritanceLink,
        # types.SubsetLink,
        # types.IntensionalInheritanceLink,
        # types.ImplicationLink]

        # always use the mixed inheritance types, because human inference
        # is normally a mix of intensional and extensional
        conditional_probability_types = [types.InheritanceLink,
                                         types.ImplicationLink,
                                         types.PredictiveImplicationLink]
        similarity_types = [types.SimilarityLink,
                            types.EquivalenceLink]

        for link_type in conditional_probability_types:
            self.chainer.add_rule(InversionRule(self.chainer, link_type))
            self.chainer.add_rule(DeductionRule(self.chainer, link_type))
            self.chainer.add_rule(InductionRule(self.chainer, link_type))
            self.chainer.add_rule(AbductionRule(self.chainer, link_type))
            # Seems better than Modus Ponens - it doesn't make anything up
            self.chainer.add_rule(TermProbabilityRule(self.chainer, link_type))
            self.chainer.add_rule(ModusPonensRule(self.chainer, link_type))

        for link_type in similarity_types:
            # SimilarityLinks don't require an InversionRule obviously
            self.chainer.add_rule(TransitiveSimilarityRule(self.chainer,
                                                           link_type))
            self.chainer.add_rule(SymmetricModusPonensRule(self.chainer,
                                                           link_type))

        self.chainer.add_rule(EvaluationImplicationRule(self.chainer))

        # These two Rules create mixed links out of intensional and
        # extensional links
        self.chainer.add_rule(InheritanceRule(self.chainer))
        self.chainer.add_rule(SimilarityRule(self.chainer))

        # boolean links
        for rule in create_and_or_rules(self.chainer, 2, 8):
            self.chainer.add_rule(rule)

        self.chainer.add_rule(
            boolean_rules.AndBulkEvaluationRule(self.chainer))

        # create probabilistic logical links out of MemberLinks

        self.chainer.add_rule(AndEvaluationRule(self.chainer))
        self.chainer.add_rule(OrEvaluationRule(self.chainer))

        # These two "macro rules" make the individual rules redundant
        self.chainer.add_rule(ExtensionalLinkEvaluationRule(self.chainer))
        self.chainer.add_rule(IntensionalLinkEvaluationRule(self.chainer))
        #self.chainer.add_rule(SubsetEvaluationRule(self.chainer))
        self.chainer.add_rule(NegatedSubsetEvaluationRule(self.chainer))
        #self.chainer.add_rule(
        #    ExtensionalSimilarityEvaluationRule(self.chainer))
        #self.chainer.add_rule(
        #    IntensionalInheritanceEvaluationRule(self.chainer))
        #self.chainer.add_rule(
        #    IntensionalSimilarityEvaluationRule(self.chainer))

        self.member_rules = [EvaluationToMemberRule(self.chainer),
            MemberToEvaluationRule(self.chainer)]
        self.member_rules += \
            create_general_evaluation_to_member_rules(self.chainer)
        for rule in self.member_rules:
            self.chainer.add_rule(rule)

        # It's important to have both of these
        self.chainer.add_rule(MemberToInheritanceRule(self.chainer))
        self.chainer.add_rule(InheritanceToMemberRule(self.chainer))

        # AttractionLink could be useful for causality
        self.chainer.add_rule(AttractionRule(self.chainer))

        self.chainer.add_rule(ScholemRule(self.chainer))

        boolean_transformation_rules = create_boolean_transformation_rules(self.chainer)
        for rule in boolean_transformation_rules:
            self.chainer.add_rule(rule)

        #self.chainer.add_rule(OntologicalInheritanceRule(self.chainer))

        #for rule in temporal_create_temporal_rules(self.chainer):
        #self.chainer.add_rule(rule)

        #higher_order_rules = []
        #for rule in self.chainer.rules:
        #higher_order_append(HigherOrderRule(self.chainer, rule))

        #contextual_rules = []
        #for rule in self.chainer.rules:
        #   contextual_append(ContextualRule(self.chainer, rule))

        #for rule in higher_order_rules + contextual_rules:
        #   self.chainer.add_rule(rule)

        #self.chainer.add_rule(AndToContextRule(self.chainer,
        #                                       types.InheritanceLink))

    def run(self, atomspace):
        if self.chainer is None:
            self.create_chainer(atomspace)
            # For simplicity, do nothing the first time. Silly APIs
            # mean you have to call run to set the atomspace
            return

        # Update all of the node probabilities at each step
        #self.chainer.update_all_node_probabilities()

        for i in xrange(0, self.num_steps_per_cycle):
            self.step()

    # Todo: The variable 'result' is never used
    def step(self):
        result = self.chainer.forward_step()
        result = self.chainer.backward_step()
Example #28
0
class SocratesAgent(MindAgent):
    def __init__(self):
        self.chainer = None

    def create_chainer(self, atomspace):
        self.chainer = Chainer(atomspace,
                               #stimulates atoms (stimulus of 10 at the moment)
                               stimulateAtoms=True,
                               #agent selects atoms with higher stis
                               preferAttentionalFocus=False,
                               allow_output_with_variables=True,
                               delete_temporary_variables=True)

        self.chainer.add_rule(
            GeneralEvaluationToMemberRule(self.chainer, 0, 2))
        self.chainer.add_rule(MemberToInheritanceRule(self.chainer))
        self.chainer.add_rule(
            DeductionRule(self.chainer, types.InheritanceLink))
        self.chainer.add_rule(
            InheritanceToMemberRule(self.chainer))
        self.chainer.add_rule(
            MemberToEvaluationRule(self.chainer))
        self.chainer.add_rule(
            AbductionRule(self.chainer, types.InheritanceLink))

    def run(self, atomspace):
        if self.chainer is None:
            self.create_chainer(atomspace)
            return

        result = self.chainer.forward_step()
        return result
Example #29
0
class DeceptionAgent(MindAgent):
    def __init__(self, mode):
        self.chainer = None
        self.query = None
        self.mode = mode  # used to switch between inference and behavior outputs
        print "Initialized DeceptionAgent."

    def create_chainer(self, atomspace, stimulate_atoms=False):
        # if mode == 1 it is deception inference mode else it is deception
        # behavior mode
        if self.mode == 1:
            enable_variable_outputs = True
        else:
            enable_variable_outputs = False

        self.chainer = Chainer(atomspace,
                               agent=self,
                               stimulateAtoms=False,
                               preferAttentionalFocus=False,
                               allow_output_with_variables=enable_variable_outputs,
                               delete_temporary_variables=True)

        # Transformation rules
        # This rules are invoked randomly and are run in the background because,
        # they imply the creation of AndLinks between different sets of Links so
        # as to represent the existance of a state in the world or of state of knowledge
        # being simulated. In the ure this wouldn't be required as AndLink is used to denote
        # the existance of the required set of Links without the need of creating
        # the AndLink. If one wants to match AndLinked set of Links then the QuoteLink
        # can be used.(This is based on the assumption that ure doesn't make a fundamental
        # change on how the pattern matcher works presently)
        if self.mode == 1:
            self.chainer.add_rule(ImplicationAndRule(self.chainer))
        else:
            self.chainer.add_rule(AndCreationRule(self.chainer, 2))
            self.chainer.add_rule(AndCreationRule(self.chainer, 2, types.EvaluationLink))
            self.chainer.add_rule(AndCreationRule(self.chainer, 3, types.EvaluationLink))
            self.chainer.add_rule(ModusPonensRule(self.chainer, types.ImplicationLink))


    def run(self, atomspace):
        if self.chainer is None:
            self.create_chainer(atomspace)
            return

        # This insures that one of the added rules are invoked in the background
        # on each step.
#        self.chainer.forward_step()

        # Any rule that is used below is assured to be executed on each step
#        self.chainer.forward_step(AndCreationRule(self.chainer, 2))

        # Depending on choice of demo, either the result on deception reasoning
        # or the behavior that result because of the reasoning can be enabled
        if self.mode == 1:
            # * Enable output of reasoning on rules
#            result = self.chainer.forward_step(ImplicationAndRule(self.chainer))
            result = self.chainer.forward_step()
        else:
            # * Enable ouput of behavior
#            result = self.chainer.forward_step(ModusPonensRule(self.chainer, types.ImplicationLink))
            result = self.chainer.forward_step()

        return result

    def get_trails(self):
        return self.chainer.trails

    def get_history(self):
        return self.chainer.history.get_history()
Example #30
0
class PLNUnitTester(TestCase):
    def setUp(self):
        self.atomSpaceFileData = AtomSpace()
        self.atomSpaceInputs = AtomSpace()
        self.atomSpaceExpected = AtomSpace()
        self.testFiles = []

        # Code below is to get us to the OC (git) root based on predictable test launch locations.

        self.chainer = Chainer(self.atomSpaceInputs,
                               stimulateAtoms=False, agent=self,
                               learnRuleFrequencies=False,
                               allow_output_with_variables=True,
                               allow_backchaining_with_variables=True)

        self.addTestFile("DeductionRule_InheritanceLink.scm")
        self.addTestFile("OrRule_new.scm")

    def tearDown(self):
        del self.atomSpaceFileData
        del self.atomSpaceInputs
        del self.atomSpaceExpected
        del self.chainer

    def test_all(self):
        for testFile in self.testFiles:
            print "Testing file: " + testFile
            self.run_file(testFile)

    def addTestFile(self, testFile):
        # Again, default to dev mode
        ruleFolder = str(os.getcwd()) + "/scm/specific_rules/"

        if not __DEV_MODE__:
            ruleFolder = os.getenv("PROJECT_SOURCE_DIR") + "/tests/python/test_pln/scm/specific_rules/"

        fullTestFile = ruleFolder + testFile

        self.testFiles.append(fullTestFile)

    def reset_atom_spaces(self):
        self.reset_atom_space(self.atomSpaceFileData)
        self.reset_atom_space(self.atomSpaceInputs)
        self.reset_atom_space(self.atomSpaceExpected)

    def load_file_into_atomspace(self, fullPath, atomSpace):
        load_scm(atomSpace, fullPath)

    def reset_atom_space(self, atomspaceToReset):
        atomspaceToReset.clear()

        # Default to dev mode
        # Build folder is up, up, up, /build
        coreTypes = "atomspace/core_types.scm"
        # Source root is up, up, up
        utilities = "scm/utilities.scm"

        if __VERBOSE__:
            if (os.path.exists(coreTypes)):
                print "Path '" + coreTypes + "' exists."

            if (os.path.exists(utilities)):
                print "Path '" + utilities + "' exists."

        if not __DEV_MODE__:
            sourceFolder = os.getenv("PROJECT_SOURCE_DIR")
            binFolder = os.getenv("PROJECT_BINARY_DIR")

            coreTypes = binFolder + "/opencog/atomspace/core_types.scm"
            utilities = sourceFolder + "/opencog/scm/utilities.scm"

        self.load_file_into_atomspace(coreTypes, atomspaceToReset)
        self.load_file_into_atomspace(utilities, atomspaceToReset)

    def fill_atomspace(self, atomspace, atomList):
        for atom in atomList:
            self.transfer_atom(atomspace, atom)

    def load_inputs(self):
        self.fill_atomspace(self.atomSpaceInputs, self.get_predicate_arguments(self.atomSpaceFileData, "inputs"))

        if __VERBOSE__:
            self.print_atomspace(self.atomSpaceInputs)

    def print_atomspace(self, atomspace):
        allNodes = atomspace.get_atoms_by_type(types.Node)

        for node in allNodes:
            print str(node.type) + " called " + node.name

        allLinks = atomspace.get_atoms_by_type(types.Link)

        for link in allLinks:
            print str(link.type) + " called " + link.name
            for out in link.out:
                print "  has a node of type " + str(out.type) + " called " + out.name

    def load_outputs(self):
        self.fill_atomspace(self.atomSpaceExpected, self.get_predicate_arguments(self.atomSpaceFileData, "outputs"))

    def load_rules(self):
        rules = self.get_predicate_arguments(self.atomSpaceFileData, "rules")

        allRules = AllRules(self.atomSpaceFileData, self.chainer)

        for rule in rules:
            #allRules.import_rule(rule, self.chainer)
            self.chainer.add_rule(allRules.lookup_rule(rule))


    def run_chaining_steps(self):
        if __VERBOSE__:
            print "Rules that can be applied:"
            print [" *" + r.name for r in self.chainer.rules]

        numberOfSteps = 1
        try:
            numberOfStepsNode = self.get_predicate_arguments(self.atomSpaceFileData, "forwardSteps")
            numberOfSteps = int(numberOfStepsNode[0].name)
        except:
            numberOfSteps = 1


        while numberOfSteps > 0:
            result = self.chainer.forward_step()

            if not result is None:
                numberOfSteps -= 1
                if __VERBOSE__:
                    print result

    def atomspace_links_to_list(self, atomSpace):
        result = []

        expectedLinks = atomSpace.get_atoms_by_type(types.Link)

        for link in expectedLinks:
            atomStringToCheckFor = atomSpace.get_atom_string(link.h)
            if not "standardize_apart" in atomStringToCheckFor:
                atomStringToCheckFor = re.sub(r"\[[0-9]+\]", "", atomStringToCheckFor)
                result.append(atomStringToCheckFor)

        return result

    def check_atomspace_contains_atomspace(self, atomSpaceChecklist, atomSpaceToCheck):
        result = True
        error = ""

        expectedList = self.atomspace_links_to_list(atomSpaceChecklist)
        actualList = self.atomspace_links_to_list(atomSpaceToCheck)

        for listItem in expectedList:
            if not (listItem in actualList):
                if not "VariableNode" in listItem:
                    if not "ListLink" in listItem:
                        result = False
                        error = "Unable to find \n" + listItem
                        print error

        return result

    def verify_result(self):
        allPredictedItemsExist = False
        allItemsWerePredicted = False

        print "Checking if all predicted items exist:"

        if self.check_atomspace_contains_atomspace(self.atomSpaceExpected, self.atomSpaceInputs):
            print "  Yes, all predicted items exist"
            allPredictedItemsExist = True
        else:
            print "  No, not all predicted items were created (see above for details)"
        print "Checking if all items were predicted:"

        if self.check_atomspace_contains_atomspace(self.atomSpaceInputs, self.atomSpaceExpected):
            print "  Yes, all created items were predicted"
            allItemsWerePredicted = True
        else:
            print "  No, not created items were predicted (see above for details)"

        self.assertTrue(allPredictedItemsExist and allItemsWerePredicted)

    def run_file(self, filename):
        print "Running test file: " + filename

        print os.path.realpath(filename)

        self.reset_atom_spaces()

        self.load_file_into_atomspace(filename, self.atomSpaceFileData)

        self.load_inputs()
        self.load_outputs()
        self.load_rules()

        self.run_chaining_steps()

        self.verify_result()

    def transfer_atom(self, new_atomspace, atom):
        """
        transfer (or rather copy) an atom from one atomspace to
        another. Assumes that both AtomSpaces have the same list of
        Atom types!
        returns the equivalent of atom in new_atomspace. creates it if
        necessary, including the outgoing set of links.
        """
        # The AtomSpace probably clones the TV objects, and it wouldn't
        # matter much anyway
        #tv = TruthValue(atom.tv.mean, atom.tv.count)

        if atom.is_node():
            return new_atomspace.add_node(atom.type, atom.name, tv=atom.tv)
        else:
            outgoing = [self.transfer_atom(new_atomspace, out)
                        for out in atom.out]
            return new_atomspace.add_link(atom.type, outgoing, tv=atom.tv)

    def get_predicate_arguments(self, atomspace, predicate_name):
        """
        Find the EvaluationLink for the predicate, and return the list
        of arguments (as a python list of Atoms). There must be only
        one EvaluationLink for it
        """
        var = self.new_variable(atomspace)
        template = self.link(atomspace, types.EvaluationLink,
                             [self.node(atomspace, types.PredicateNode, predicate_name),
                              var])

        queries = self.lookup_atoms(atomspace, template)
        # It will often find the original template in the results!
        queries.remove(template)
        #queries = [query for query in queries if query.tv.count > 0]
        if len(queries) != 1:
            raise ValueError("Predicate " + predicate_name +
                             " must have 1 EvaluationLink")
        return queries[0].out[1].out

    def lookup_atoms(self, atomspace, template):
        if len(self.variables(template)) == 0:
            return [template]

        if template.type == types.VariableNode:
            root_type = types.Atom
            atoms = atomspace.get_atoms_by_type(root_type)
        else:
            # If the atom is a link with all variables below it, then
            # lookup all links of that type. If it has any nodes
            # (which aren't VariableNodes!), then lookup the incoming
            # set for that node
            first_node = self.get_first_node(template)
            if first_node is None:
                root_type = template.type
                atoms = atomspace.get_atoms_by_type(root_type)
            else:
                atoms = self.get_incoming_recursive(first_node)

        return atoms

    def new_variable(self, atomspace, prefix='$pln_var_'):
        return atomspace.add_node(types.VariableNode,
                                        prefix,
                                        prefixed=True)

    def link(self, atomspace, type, out):
        return atomspace.add_link(type, out)

    def node(self, atomspace, type, name):
        return atomspace.add_node(type, name)

    def variables(self, atom):
        """
        Find all the variables in an expression (which may be
        repeated)
        """
        if atom.is_node():
            if self.is_variable(atom):
                return [atom]
            else:
                return []
        else:
            result = []
            for o in atom.out:
                result += self.variables(o)
            return result

    def get_first_node(self, atom):
        """
        Using a depth first search on the link, return the first Node
        found. If atom is a Node just return that.
        """
        if atom.is_node() and not self.is_variable(atom):
            return atom
        else:
            for o in atom.out:
                ret = self.get_first_node(o)
                if not ret is None:
                    return ret
            return None

    def get_incoming_recursive(self, atom):
        inc = atom.incoming
        ret = []
        ret += inc
        for link in inc:
            ret += self.get_incoming_recursive(link)
        return ret

    def is_variable(self, atom):
        return atom.is_a(types.VariableNode)
Example #31
0
class InferenceAgent(MindAgent):
    def __init__(self):
        self.chainer = None
        self.query = None
        print "Initializing InferenceAgent."

    def create_chainer(self, atomspace, stimulate_atoms=True):
        """
        Creates the chainer for the "smokes" example. Optionally, you can
         define the target query before calling this method, by defining a
         Scheme expression named "query". For example, you can issue the
         Scheme expression "(define query hasCancer)" in reference to the
         predicate defined in smokes.scm before loading this agent. Once
         defined, the target query will receive stimulus at every time step.
         Stimulus requires the agent to be running in a CogServer.
         For a complete example that incorporates this behavior, see
         example.py here:
           https://github.com/opencog/external-tools/tree/master/attention
        """
        self.chainer = Chainer(atomspace,
                               agent=self,
                               stimulateAtoms=stimulate_atoms,
                               allow_output_with_variables=False,
                               preferAttentionalFocus=True,
                               delete_temporary_variables=True)

        # ModusPonens:
        # Implication smokes(x) cancer(X)
        # smokes(Anna)
        # |= cancer(Anna)
        self.chainer.add_rule(
            ModusPonensRule(self.chainer, types.ImplicationLink))

        # stimulateAtoms is only enabled when the agent is ran inside the
        # CogServer, since the functionality requires a CogServer and
        # attention allocation
        if self.chainer._stimulateAtoms:
            self.query = scheme_eval_h(atomspace, "query")

    def run(self, atomspace):
        if self.chainer is None:
            self.create_chainer(atomspace)
            print "PLN Chainer created."
            return

        print "PLN continuing."

        if not check_result(atomspace):
            result = self.chainer.forward_step()

            if self.query is not None:
                # Allow the stimulus amount to be set dynamically by setting
                # a configuration atom in the atomspace.
                stimulus_predicate = atomspace.add_node(
                    types.PredicateNode, 'CONFIG-StimulusAmount')

                # Only set TARGET_STIMULUS if this atom has been setup with
                # an appropriate NumberNode with the value.
                outgoing = stimulus_predicate.out
                if len(outgoing) > 0:
                    list = outgoing[0].incoming  # EvaluationLink
                    list = list[0].out  # ListLink
                    list = list[1].out  # NumberNode
                    value = list[0].name
                    TARGET_STIMULUS = int(value)
                    print "Target stimulus amount updated to {0}".\
                        format(TARGET_STIMULUS)

                self.chainer._give_stimulus(atomspace[self.query],
                                            TARGET_STIMULUS)

            return result
Example #32
0
class DeceptionAgent(MindAgent):
    def __init__(self, mode):
        self.chainer = None
        self.query = None
        self.mode = mode  # used to switch between inference and behavior outputs
        print "Initialized DeceptionAgent."

    def create_chainer(self, atomspace, stimulate_atoms=False):
        # if mode == 1 it is deception inference mode else it is deception
        # behavior mode
        if self.mode == 1:
            enable_variable_outputs = True
        else:
            enable_variable_outputs = False

        self.chainer = Chainer(
            atomspace,
            agent=self,
            stimulateAtoms=False,
            preferAttentionalFocus=False,
            allow_output_with_variables=enable_variable_outputs,
            delete_temporary_variables=True)

        # Transformation rules
        # This rules are invoked randomly and are run in the background because,
        # they imply the creation of AndLinks between different sets of Links so
        # as to represent the existance of a state in the world or of state of knowledge
        # being simulated. In the ure this wouldn't be required as AndLink is used to denote
        # the existance of the required set of Links without the need of creating
        # the AndLink. If one wants to match AndLinked set of Links then the QuoteLink
        # can be used.(This is based on the assumption that ure doesn't make a fundamental
        # change on how the pattern matcher works presently)
        if self.mode == 1:
            self.chainer.add_rule(ImplicationAndRule(self.chainer))
        else:
            self.chainer.add_rule(AndCreationRule(self.chainer, 2))
            self.chainer.add_rule(
                AndCreationRule(self.chainer, 2, types.EvaluationLink))
            self.chainer.add_rule(
                AndCreationRule(self.chainer, 3, types.EvaluationLink))
            self.chainer.add_rule(
                ModusPonensRule(self.chainer, types.ImplicationLink))

    def run(self, atomspace):
        if self.chainer is None:
            self.create_chainer(atomspace)
            return

        # This insures that one of the added rules are invoked in the background
        # on each step.


#        self.chainer.forward_step()

# Any rule that is used below is assured to be executed on each step
#        self.chainer.forward_step(AndCreationRule(self.chainer, 2))

# Depending on choice of demo, either the result on deception reasoning
# or the behavior that result because of the reasoning can be enabled
        if self.mode == 1:
            # * Enable output of reasoning on rules
            #            result = self.chainer.forward_step(ImplicationAndRule(self.chainer))
            result = self.chainer.forward_step()
        else:
            # * Enable ouput of behavior
            #            result = self.chainer.forward_step(ModusPonensRule(self.chainer, types.ImplicationLink))
            result = self.chainer.forward_step()

        return result

    def get_trails(self):
        return self.chainer.trails

    def get_history(self):
        return self.chainer.history.get_history()
Example #33
0
class AllRules(object):
    def __init__(self, atomspace, chainer):
        from pln.rules import rules, temporal_rules, boolean_rules, quantifier_rules, context_rules, predicate_rules

        # contains every rule
        self.chainer = Chainer(atomspace, stimulateAtoms = False, agent = self, learnRuleFrequencies=False)
        # contains only some rules
        self.test_chainer = chainer

        conditional_probability_types = [types.InheritanceLink, types.ImplicationLink, types.PredictiveImplicationLink]
        similarity_types = [types.SimilarityLink, types.EquivalenceLink]

        for link_type in conditional_probability_types:
            self.chainer.add_rule(rules.InversionRule(self.chainer, link_type))
            self.chainer.add_rule(rules.DeductionRule(self.chainer, link_type))
            self.chainer.add_rule(rules.InductionRule(self.chainer, link_type))
            self.chainer.add_rule(rules.AbductionRule(self.chainer, link_type))
            # Seems better than Modus Ponens - it doesn't make anything up
            self.chainer.add_rule(rules.TermProbabilityRule(self.chainer, link_type))
            self.chainer.add_rule(rules.ModusPonensRule(self.chainer, link_type))

        for link_type in similarity_types:
            # SimilarityLinks don't require an InversionRule obviously
            self.chainer.add_rule(rules.TransitiveSimilarityRule(self.chainer, link_type))
            self.chainer.add_rule(rules.SymmetricModusPonensRule(self.chainer, link_type))

        self.chainer.add_rule(predicate_rules.EvaluationImplicationRule(self.chainer))

        # These two Rules create mixed links out of intensional and extensional links
        self.chainer.add_rule(rules.InheritanceRule(self.chainer))
        self.chainer.add_rule(rules.SimilarityRule(self.chainer))

        # boolean links
        for rule in boolean_rules.create_and_or_rules(self.chainer, 2, 8):
            self.chainer.add_rule(rule)

        # create probabilistic logical links out of MemberLinks

        self.chainer.add_rule(rules.AndEvaluationRule(self.chainer))
        self.chainer.add_rule(rules.OrEvaluationRule(self.chainer))

        self.chainer.add_rule(rules.ExtensionalLinkEvaluationRule(self.chainer))
        self.chainer.add_rule(rules.IntensionalLinkEvaluationRule(self.chainer))
        self.chainer.add_rule(rules.SubsetEvaluationRule(self.chainer))
        self.chainer.add_rule(rules.NegatedSubsetEvaluationRule(self.chainer))
        self.chainer.add_rule(rules.ExtensionalSimilarityEvaluationRule(self.chainer))
        self.chainer.add_rule(rules.IntensionalInheritanceEvaluationRule(self.chainer))
        self.chainer.add_rule(rules.IntensionalSimilarityEvaluationRule(self.chainer))

        self.member_rules = [rules.EvaluationToMemberRule(self.chainer),
            rules.MemberToEvaluationRule(self.chainer)]
        self.member_rules += rules.create_general_evaluation_to_member_rules(self.chainer)
        for rule in self.member_rules:
            self.chainer.add_rule(rule)

        # It's important to have both of these
        self.chainer.add_rule(rules.MemberToInheritanceRule(self.chainer))
#        self.chainer.add_rule(rules.InheritanceToMemberRule(self.chainer))

        # AttractionLink could be useful for causality
        self.chainer.add_rule(rules.AttractionRule(self.chainer))

        self.chainer.add_rule(quantifier_rules.ScholemRule(self.chainer))

        for rule in temporal_rules.create_temporal_rules(self.chainer):
            self.chainer.add_rule(rule)

    def lookup_rule(self, rule_schema_node):
        rule = self.chainer.lookup_rule(rule_schema_node.name)
        rule._chainer = self.test_chainer
        return rule
Example #34
0
class InferenceAgent(MindAgent):
    def __init__(self):
        self.chainer = None
        self.num_steps_per_cycle = 100

    def create_chainer(self, atomspace):
        # Note: using stimulateAtoms will cause a segfault if you
        # create the Agent from the Python shell (use the agents-start
        # command in the cogserver shell). It's because giving atoms
        # stimulus only works if the MindAgent is added to the
        # CogServer's list of agents.
        self.chainer = Chainer(atomspace,
                               stimulateAtoms=False,
                               agent=self,
                               learnRuleFrequencies=True)

        # Todo: Cleanup the following section where rules are added

        # ImplicationLink is MixedImplicationLink, you could also have
        # Extensional and Intensional Implication. etc. but that's a bit
        # much.
        # similarity_types =
        # [types.SimilarityLink,
        # types.ExtensionalSimilarityLink,
        # types.IntensionalSimilarityLink,
        # types.EquivalenceLink]
        #
        # conditional_probability_types =
        # [types.InheritanceLink,
        # types.SubsetLink,
        # types.IntensionalInheritanceLink,
        # types.ImplicationLink]

        # always use the mixed inheritance types, because human inference
        # is normally a mix of intensional and extensional
        conditional_probability_types = [
            types.InheritanceLink, types.ImplicationLink,
            types.PredictiveImplicationLink
        ]
        similarity_types = [types.SimilarityLink, types.EquivalenceLink]

        for link_type in conditional_probability_types:
            self.chainer.add_rule(InversionRule(self.chainer, link_type))
            self.chainer.add_rule(DeductionRule(self.chainer, link_type))
            self.chainer.add_rule(InductionRule(self.chainer, link_type))
            self.chainer.add_rule(AbductionRule(self.chainer, link_type))
            # Seems better than Modus Ponens - it doesn't make anything up
            self.chainer.add_rule(TermProbabilityRule(self.chainer, link_type))
            self.chainer.add_rule(ModusPonensRule(self.chainer, link_type))
            self.chainer.add_rule(
                PreciseModusPonensRule(self.chainer, link_type))

        for link_type in similarity_types:
            # SimilarityLinks don't require an InversionRule obviously
            self.chainer.add_rule(
                TransitiveSimilarityRule(self.chainer, link_type))
            self.chainer.add_rule(
                SymmetricModusPonensRule(self.chainer, link_type))

        self.chainer.add_rule(EvaluationImplicationRule(self.chainer))

        # These two Rules create mixed links out of intensional and
        # extensional links
        self.chainer.add_rule(InheritanceRule(self.chainer))
        self.chainer.add_rule(SimilarityRule(self.chainer))

        for link_type in conditional_probability_types:
            self.chainer.add_rule(AndToSubsetRule1(self.chainer, link_type))

            for N in xrange(2, 8):
                self.chainer.add_rule(
                    AndToSubsetRuleN(self.chainer, link_type, N))

        # boolean links
        for rule in create_and_or_rules(self.chainer, 2, 8):
            self.chainer.add_rule(rule)

        for N in xrange(2, 8):
            self.chainer.add_rule(
                boolean_rules.AndBulkEvaluationRule(self.chainer, N))
        for N in xrange(3, 8):
            self.chainer.add_rule(
                boolean_rules.NegatedAndBulkEvaluationRule(self.chainer, N))

        # create probabilistic logical links out of MemberLinks

        self.chainer.add_rule(AndEvaluationRule(self.chainer))
        self.chainer.add_rule(OrEvaluationRule(self.chainer))

        # These two "macro rules" make the individual rules redundant
        self.chainer.add_rule(ExtensionalLinkEvaluationRule(self.chainer))
        self.chainer.add_rule(IntensionalLinkEvaluationRule(self.chainer))
        #self.chainer.add_rule(SubsetEvaluationRule(self.chainer))
        self.chainer.add_rule(NegatedSubsetEvaluationRule(self.chainer))
        #self.chainer.add_rule(
        #    ExtensionalSimilarityEvaluationRule(self.chainer))
        #self.chainer.add_rule(
        #    IntensionalInheritanceEvaluationRule(self.chainer))
        #self.chainer.add_rule(
        #    IntensionalSimilarityEvaluationRule(self.chainer))

        self.member_rules = [
            GeneralEvaluationToMemberRule(self.chainer),
            MemberToEvaluationRule(self.chainer)
        ]
        self.member_rules += \
            create_general_evaluation_to_member_rules(self.chainer)
        for rule in self.member_rules:
            self.chainer.add_rule(rule)

        # It's important to have both of these
        self.chainer.add_rule(MemberToInheritanceRule(self.chainer))
        self.chainer.add_rule(InheritanceToMemberRule(self.chainer))

        # AttractionLink could be useful for causality
        self.chainer.add_rule(AttractionRule(self.chainer))

        self.chainer.add_rule(ScholemRule(self.chainer))

        boolean_transformation_rules = create_boolean_transformation_rules(
            self.chainer)
        for rule in boolean_transformation_rules:
            self.chainer.add_rule(rule)

        #self.chainer.add_rule(OntologicalInheritanceRule(self.chainer))

        #for rule in temporal_create_temporal_rules(self.chainer):
        #self.chainer.add_rule(rule)

        #higher_order_rules = []
        #for rule in self.chainer.rules:
        #higher_order_append(HigherOrderRule(self.chainer, rule))

        #contextual_rules = []
        #for rule in self.chainer.rules:
        #   contextual_append(ContextualRule(self.chainer, rule))

        #for rule in higher_order_rules + contextual_rules:
        #   self.chainer.add_rule(rule)

        #self.chainer.add_rule(AndToContextRule(self.chainer,
        #                                       types.InheritanceLink))

    def run(self, atomspace):
        if self.chainer is None:
            self.create_chainer(atomspace)
            # For simplicity, do nothing the first time. Silly APIs
            # mean you have to call run to set the atomspace
            return

        # Update all of the node probabilities at each step
        #self.chainer.update_all_node_probabilities()

        for i in xrange(0, self.num_steps_per_cycle):
            self.step()

    # Todo: The variable 'result' is never used
    def step(self):
        result = self.chainer.forward_step()
        result = self.chainer.backward_step()
class SocratesAgent(MindAgent):
    def __init__(self):
        self.chainer = None

    def create_chainer(self, atomspace):
        self.chainer = Chainer(atomspace,
                               agent=self,
                               stimulateAtoms=True,
                               preferAttentionalFocus=True,
                               allow_output_with_variables=True,
                               delete_temporary_variables=True)

        self.chainer.add_rule(
            GeneralEvaluationToMemberRule(self.chainer, 0, 2))
        self.chainer.add_rule(MemberToInheritanceRule(self.chainer))
        self.chainer.add_rule(
            DeductionRule(self.chainer, types.InheritanceLink))
        self.chainer.add_rule(
            InheritanceToMemberRule(self.chainer))
        self.chainer.add_rule(
            MemberToEvaluationRule(self.chainer))
        self.chainer.add_rule(
            AbductionRule(self.chainer, types.InheritanceLink))

    def run(self, atomspace):
        if self.chainer is None:
            self.create_chainer(atomspace)
            print("PLN Chainer created.")
            return

        print("PLN continuing.")

        # there is no query here, so it doesn't give any stimulus

        if not check_result(atomspace):
            result = self.chainer.forward_step()
            return result
Example #36
0
class ContextAgent(MindAgent):
    def __init__(self):
        self.chainer = None

    def create_chainer(self, atomspace):
        self.chainer = Chainer(atomspace,
                               stimulateAtoms=False,
                               preferAttentionalFocus=False,
                               allow_output_with_variables=True,
                               delete_temporary_variables=True)

        self.chainer.add_rule(InheritanceToContextRule(self.chainer))
        self.chainer.add_rule(EvaluationToContextRule(self.chainer))
        self.chainer.add_rule(SubsetToContextRule(self.chainer))
        self.chainer.add_rule(ContextToInheritanceRule(self.chainer))
        self.chainer.add_rule(ContextToEvaluationRule(self.chainer))
        self.chainer.add_rule(ContextToSubsetRule(self.chainer))
        self.chainer.add_rule(ContextFreeToSensitiveRule(self.chainer))

    def run(self, atomspace):
        if self.chainer is None:
            self.create_chainer(atomspace)
            return

        result = self.chainer.forward_step()
        return result
Example #37
0
class SocratesAgent(MindAgent):
    def __init__(self):
        self.chainer = None

    def create_chainer(self, atomspace):
        self.chainer = Chainer(
            atomspace,
            #stimulates atoms (stimulus of 10 at the moment)
            stimulateAtoms=True,
            #agent selects atoms with higher stis
            preferAttentionalFocus=False,
            allow_output_with_variables=True,
            delete_temporary_variables=True)

        self.chainer.add_rule(GeneralEvaluationToMemberRule(
            self.chainer, 0, 2))
        self.chainer.add_rule(MemberToInheritanceRule(self.chainer))
        self.chainer.add_rule(
            DeductionRule(self.chainer, types.InheritanceLink))
        self.chainer.add_rule(InheritanceToMemberRule(self.chainer))
        self.chainer.add_rule(MemberToEvaluationRule(self.chainer))
        self.chainer.add_rule(
            AbductionRule(self.chainer, types.InheritanceLink))

    def run(self, atomspace):
        if self.chainer is None:
            self.create_chainer(atomspace)
            return

        result = self.chainer.forward_step()
        return result
Example #38
0
class AllRules(object):
    def __init__(self, atomspace, chainer):
        # contains every rule
        self.chainer = Chainer(atomspace,
                               stimulateAtoms=False,
                               agent=self,
                               learnRuleFrequencies=False)

        # contains only some rules
        self.test_chainer = chainer

        conditional_probability_types = [
            types.InheritanceLink, types.ImplicationLink,
            types.PredictiveImplicationLink
        ]
        similarity_types = [types.SimilarityLink, types.EquivalenceLink]

        for link_type in conditional_probability_types:
            self.chainer.add_rule(InversionRule(
                self.chainer, link_type))  # Rule test exists.
            self.chainer.add_rule(DeductionRule(
                self.chainer, link_type))  # Rule test exists.
            self.chainer.add_rule(InductionRule(
                self.chainer, link_type))  # Rule test exists.
            self.chainer.add_rule(AbductionRule(
                self.chainer, link_type))  # Rule test exists.
            # Seems better than Modus Ponens - it doesn't make anything up
            self.chainer.add_rule(TermProbabilityRule(self.chainer, link_type))
            self.chainer.add_rule(ModusPonensRule(self.chainer, link_type))
            self.chainer.add_rule(
                PreciseModusPonensRule(self.chainer, link_type))
            self.chainer.add_rule(
                AndAs1stArgInsideLinkRule(self.chainer, link_type))
            self.chainer.add_rule(
                AndAs2ndArgInsideLinkRule(self.chainer, link_type))

        for link_type in similarity_types:
            # SimilarityLinks don't require an InversionRule obviously
            self.chainer.add_rule(
                TransitiveSimilarityRule(self.chainer,
                                         link_type))  # Rule test exists.
            self.chainer.add_rule(
                SymmetricModusPonensRule(self.chainer, link_type))

        self.chainer.add_rule(EvaluationImplicationRule(
            self.chainer))  # No test, appears to produce a TV not new nodes.

        # These two Rules create mixed links out of intensional and
        # extensional links
        self.chainer.add_rule(InheritanceRule(
            self.chainer))  # Rule test exists.
        self.chainer.add_rule(SimilarityRule(self.chainer))

        for link_type in conditional_probability_types:
            self.chainer.add_rule(AndToSubsetRule1(self.chainer, link_type))

            for N in xrange(2, 8):
                self.chainer.add_rule(
                    AndToSubsetRuleN(self.chainer, link_type, N))

        # boolean links
        for rule in create_and_or_rules(self.chainer, 2, 8):
            self.chainer.add_rule(rule)
        for N in xrange(2, 8):
            self.chainer.add_rule(
                boolean_rules.AndBulkEvaluationRule(self.chainer, N))
        for N in xrange(3, 8):
            self.chainer.add_rule(
                boolean_rules.NegatedAndBulkEvaluationRule(self.chainer, N))

        general_evaluation_to_member_rules = create_general_evaluation_to_member_rules(
            self.chainer)
        for rule in general_evaluation_to_member_rules:
            self.chainer.add_rule(rule)

        # create probabilistic logical links out of MemberLinks

        self.chainer.add_rule(AndEvaluationRule(self.chainer))
        self.chainer.add_rule(OrEvaluationRule(self.chainer))

        self.chainer.add_rule(ExtensionalLinkEvaluationRule(self.chainer))
        self.chainer.add_rule(IntensionalLinkEvaluationRule(self.chainer))
        self.chainer.add_rule(SubsetEvaluationRule(self.chainer))
        self.chainer.add_rule(NegatedSubsetEvaluationRule(self.chainer))
        self.chainer.add_rule(ExtensionalSimilarityEvaluationRule(
            self.chainer))
        self.chainer.add_rule(
            IntensionalInheritanceEvaluationRule(self.chainer))
        self.chainer.add_rule(IntensionalSimilarityEvaluationRule(
            self.chainer))
        self.chainer.add_rule(SatisfyingSetToConceptRule(self.chainer, 1))

        # context rules
        self.chainer.add_rule(InheritanceToContextRule(self.chainer))
        self.chainer.add_rule(EvaluationToContextRule(self.chainer))
        self.chainer.add_rule(SubsetToContextRule(self.chainer))
        self.chainer.add_rule(ContextToInheritanceRule(self.chainer))
        self.chainer.add_rule(ContextToEvaluationRule(self.chainer))
        self.chainer.add_rule(ContextToSubsetRule(self.chainer))

        # self.member_rules = [GeneralEvaluationToMemberRule(self.chainer),
        #     MemberToEvaluationRule(self.chainer)]
        # self.member_rules += \
        #     create_general_evaluation_to_member_rules(self.chainer)
        # for rule in self.member_rules:
        #     self.chainer.add_rule(rule)

        # It's important to have both of these
        self.chainer.add_rule(MemberToInheritanceRule(self.chainer))
        #        self.chainer.add_rule(InheritanceToMemberRule(self.chainer))

        # AttractionLink could be useful for causality
        self.chainer.add_rule(AttractionRule(self.chainer))

        self.chainer.add_rule(ScholemRule(self.chainer))

        for rule in create_temporal_rules(self.chainer):
            self.chainer.add_rule(rule)

        boolean_transformation_rules = create_boolean_transformation_rules(
            self.chainer)
        for rule in boolean_transformation_rules:
            self.chainer.add_rule(rule)

    def lookup_rule(self, rule_schema_node):
        rule = self.chainer.lookup_rule(rule_schema_node.name)
        rule._chainer = self.test_chainer
        return rule
Example #39
0
class ForwardInferenceAgent(MindAgent):
    def __init__(self):
        self.chainer = None

    def create_chainer(self, atomspace):
        self.chainer = Chainer(atomspace,
                               stimulateAtoms=False,
                               agent=self,
                               learnRuleFrequencies=False)

        # ImplicationLink is MixedImplicationLink, you could also have Extensional and Intensional Implication. etc. but that's a bit much.
        #        similarity_types = [types.SimilarityLink, types.ExtensionalSimilarityLink, types.IntensionalSimilarityLink]
        #            types.EquivalenceLink]
        #        conditional_probability_types = [types.InheritanceLink, types.SubsetLink, types.IntensionalInheritanceLink, types.ImplicationLink]

        # always use the mixed inheritance types, because human inference is normally a mix of intensional and extensional
        conditional_probability_types = [
            types.InheritanceLink, types.ImplicationLink
        ]
        similarity_types = [types.SimilarityLink, types.EquivalenceLink]

        for link_type in conditional_probability_types:
            self.chainer.add_rule(rules.InversionRule(self.chainer, link_type))
            self.chainer.add_rule(rules.DeductionRule(self.chainer, link_type))
            self.chainer.add_rule(rules.InductionRule(self.chainer, link_type))
            self.chainer.add_rule(rules.AbductionRule(self.chainer, link_type))
            #self.chainer.add_rule(rules.ModusPonensRule(self.chainer, link_type))

        # As a hack, use the standard DeductionRule for SimilarityLinks. It needs its own formula really.
        for link_type in similarity_types:
            self.chainer.add_rule(rules.DeductionRule(self.chainer, link_type))

        # These two Rules create mixed links out of intensional and extensional links
        self.chainer.add_rule(rules.InheritanceRule(self.chainer))
        self.chainer.add_rule(rules.SimilarityRule(self.chainer))

        # boolean links
        for rule in boolean_rules.create_and_or_rules(self.chainer, 1, 2):
            self.chainer.add_rule(rule)

        # create probabilistic logical links out of MemberLinks

        self.chainer.add_rule(rules.AndEvaluationRule(self.chainer))
        self.chainer.add_rule(rules.OrEvaluationRule(self.chainer))

        # These two "macro rules" make the individual rules redundant
        self.chainer.add_rule(rules.ExtensionalLinkEvaluationRule(
            self.chainer))
        self.chainer.add_rule(rules.IntensionalLinkEvaluationRule(
            self.chainer))
        #self.chainer.add_rule(rules.SubsetEvaluationRule(self.chainer))
        self.chainer.add_rule(rules.NegatedSubsetEvaluationRule(self.chainer))
        #self.chainer.add_rule(rules.ExtensionalSimilarityEvaluationRule(self.chainer))
        #self.chainer.add_rule(rules.IntensionalInheritanceEvaluationRule(self.chainer))
        #self.chainer.add_rule(rules.IntensionalSimilarityEvaluationRule(self.chainer))

        self.member_rules = [rules.EvaluationToMemberRule(self.chainer)]
        self.member_rules += rules.create_general_evaluation_to_member_rules(
            self.chainer)
        for rule in self.member_rules:
            self.chainer.add_rule(rule)

        # It's important to have both of these
        self.chainer.add_rule(rules.MemberToInheritanceRule(self.chainer))
        #        self.chainer.add_rule(rules.InheritanceToMemberRule(self.chainer))

        # AttractionLink could be useful for causality
        self.chainer.add_rule(rules.AttractionRule(self.chainer))


#        for rule in temporal_rules.create_temporal_rules(self.chainer):
#            self.chainer.add_rule(rule)

    def run(self, atomspace):
        # incredibly exciting futuristic display!
        #import os
        #os.system('cls' if os.name=='nt' else 'clear')

        def show_atoms(atoms):
            return ' '.join(str(atom) + str(atom.av) for atom in atoms)

        if self.chainer is None:
            self.create_chainer(atomspace)
            # For simplicity, do nothing the first time. Silly APIs mean you have to call run to set the atomspace
            return

        # Update all of the node probabilities at each step
        self.chainer.update_all_node_probabilities()

        result = self.chainer.forward_step()
        if result:
            (rule, inputs, outputs) = result

            print '==== Inference ===='
            print rule.name, show_atoms(outputs), '<=', show_atoms(inputs)

            #print
            #print '==== Attentional Focus ===='
            #for atom in get_attentional_focus(atomspace)[0:30]:
            #    print str(atom), atom.av

            #print '==== Result ===='
            #print output
            #print '==== Trail ===='
            #print_atoms( self.chainer.trails[output] )
        else:
            print 'Invalid inference attempted'

        try:
            pass
        except AssertionError:
            import sys, traceback
            _, _, tb = sys.exc_info()
            traceback.print_tb(tb)  # Fixed format

            tbInfo = traceback.extract_tb(tb)
            filename, line, func, text = tbInfo[-1]
            print('An error occurred on line ' + str(line) + ' in statement ' +
                  text)
            exit(1)
        except Exception, e:
            print e
            print e.args
            e.print_traceback()

            import sys, traceback
            _, _, tb = sys.exc_info()
            traceback.print_tb(tb)  # Fixed format

            tbInfo = traceback.extract_tb(tb)
            filename, line, func, text = tbInfo[-1]
            print('An error occurred on line ' + str(line) + ' in statement ' +
                  text)
            exit(1)
Example #40
0
class AllRules(object):
    def __init__(self, atomspace, chainer):
        # contains every rule
        self.chainer = Chainer(atomspace,
                               stimulateAtoms=False,
                               agent=self,
                               learnRuleFrequencies=False)

        # contains only some rules
        self.test_chainer = chainer

        conditional_probability_types = [types.InheritanceLink,
                                         types.ImplicationLink,
                                         types.PredictiveImplicationLink]
        similarity_types = [types.SimilarityLink, types.EquivalenceLink]

        for link_type in conditional_probability_types:
            self.chainer.add_rule(InversionRule(self.chainer, link_type)) # Rule test exists.
            self.chainer.add_rule(DeductionRule(self.chainer, link_type)) # Rule test exists.
            self.chainer.add_rule(InductionRule(self.chainer, link_type)) # Rule test exists.
            self.chainer.add_rule(AbductionRule(self.chainer, link_type)) # Rule test exists.
            # Seems better than Modus Ponens - it doesn't make anything up
            self.chainer.add_rule(TermProbabilityRule(self.chainer, link_type))
            self.chainer.add_rule(ModusPonensRule(self.chainer, link_type))
            self.chainer.add_rule(PreciseModusPonensRule(self.chainer, link_type))

        for link_type in similarity_types:
            # SimilarityLinks don't require an InversionRule obviously
            self.chainer.add_rule(
                TransitiveSimilarityRule(self.chainer, link_type)) # Rule test exists.
            self.chainer.add_rule(
                SymmetricModusPonensRule(self.chainer, link_type))

        self.chainer.add_rule(EvaluationImplicationRule(self.chainer)) # No test, appears to produce a TV not new nodes.

        # These two Rules create mixed links out of intensional and
        # extensional links
        self.chainer.add_rule(InheritanceRule(self.chainer)) # Rule test exists.
        self.chainer.add_rule(SimilarityRule(self.chainer))

        for link_type in conditional_probability_types:
            self.chainer.add_rule(AndToSubsetRule1(self.chainer, link_type))

            for N in xrange(2, 8):
                self.chainer.add_rule(AndToSubsetRuleN(self.chainer, link_type, N))

        # boolean links
        for rule in create_and_or_rules(self.chainer, 2, 8):
            self.chainer.add_rule(rule)
        for N in xrange(2, 8):
            self.chainer.add_rule(
                boolean_rules.AndBulkEvaluationRule(self.chainer, N))
        for N in xrange(3, 8):
            self.chainer.add_rule(
                boolean_rules.NegatedAndBulkEvaluationRule(self.chainer, N))

        general_evaluation_to_member_rules = create_general_evaluation_to_member_rules(self.chainer)
        for rule in general_evaluation_to_member_rules:
            self.chainer.add_rule(rule)

        # create probabilistic logical links out of MemberLinks

        self.chainer.add_rule(AndEvaluationRule(self.chainer))
        self.chainer.add_rule(OrEvaluationRule(self.chainer))

        self.chainer.add_rule(ExtensionalLinkEvaluationRule(self.chainer))
        self.chainer.add_rule(IntensionalLinkEvaluationRule(self.chainer))
        self.chainer.add_rule(SubsetEvaluationRule(self.chainer))
        self.chainer.add_rule(NegatedSubsetEvaluationRule(self.chainer))
        self.chainer.add_rule(
            ExtensionalSimilarityEvaluationRule(self.chainer))
        self.chainer.add_rule(
            IntensionalInheritanceEvaluationRule(self.chainer))
        self.chainer.add_rule(
            IntensionalSimilarityEvaluationRule(self.chainer))

        # self.member_rules = [GeneralEvaluationToMemberRule(self.chainer),
        #     MemberToEvaluationRule(self.chainer)]
        # self.member_rules += \
        #     create_general_evaluation_to_member_rules(self.chainer)
        # for rule in self.member_rules:
        #     self.chainer.add_rule(rule)

        # It's important to have both of these
        self.chainer.add_rule(MemberToInheritanceRule(self.chainer))
#        self.chainer.add_rule(InheritanceToMemberRule(self.chainer))

        # AttractionLink could be useful for causality
        self.chainer.add_rule(AttractionRule(self.chainer))

        self.chainer.add_rule(ScholemRule(self.chainer))

        for rule in create_temporal_rules(self.chainer):
            self.chainer.add_rule(rule)

        boolean_transformation_rules = create_boolean_transformation_rules(self.chainer)
        for rule in boolean_transformation_rules:
            self.chainer.add_rule(rule)

    def lookup_rule(self, rule_schema_node):
        rule = self.chainer.lookup_rule(rule_schema_node.name)
        rule._chainer = self.test_chainer
        return rule
Example #41
0
class InferenceAgent(MindAgent):
    def __init__(self):
        self.chainer = None
        self.query = None
        print "Initializing InferenceAgent."

    def create_chainer(self, atomspace, stimulate_atoms=True):
        """
        Creates the chainer for the "smokes" example. Optionally, you can
         define the target query before calling this method, by defining a
         Scheme expression named "query". For example, you can issue the
         Scheme expression "(define query hasCancer)" in reference to the
         predicate defined in smokes.scm before loading this agent. Once
         defined, the target query will receive stimulus at every time step.
         Stimulus requires the agent to be running in a CogServer.
         For a complete example that incorporates this behavior, see
         example.py here:
           https://github.com/opencog/external-tools/tree/master/attention
        """
        self.chainer = Chainer(atomspace,
                               agent=self,
                               stimulateAtoms=stimulate_atoms,
                               allow_output_with_variables=False,
                               preferAttentionalFocus=True,
                               delete_temporary_variables=True)

        # ModusPonens:
        # Implication smokes(x) cancer(X)
        # smokes(Anna)
        # |= cancer(Anna)
        self.chainer.add_rule(
            ModusPonensRule(self.chainer, types.ImplicationLink))

        # stimulateAtoms is only enabled when the agent is ran inside the
        # CogServer, since the functionality requires a CogServer and
        # attention allocation
        if self.chainer._stimulateAtoms:
            self.query = scheme_eval_h(atomspace, "query")

    def run(self, atomspace):
        if self.chainer is None:
            self.create_chainer(atomspace)
            print "PLN Chainer created."
            return

        print "PLN continuing."

        if not check_result(atomspace):
            result = self.chainer.forward_step()

            if self.query is not None:
                # Allow the stimulus amount to be set dynamically by setting
                # a configuration atom in the atomspace.
                stimulus_predicate = atomspace.add_node(types.PredicateNode, 
                                                       'CONFIG-StimulusAmount')

                # Only set TARGET_STIMULUS if this atom has been setup with
                # an appropriate NumberNode with the value.
                outgoing = stimulus_predicate.out
                if len(outgoing) > 0:
                  list = outgoing[0].incoming  # EvaluationLink
                  list = list[0].out  # ListLink
                  list = list[1].out  # NumberNode
                  value = list[0].name
                  TARGET_STIMULUS = int(value)
                  print "Target stimulus amount updated to {0}".\
                      format(TARGET_STIMULUS)

                self.chainer._give_stimulus(atomspace[self.query],
                                            TARGET_STIMULUS)

            return result
class SocratesAgent(MindAgent):
    def __init__(self):
        self.chainer = None

    def create_chainer(self, atomspace):
        self.chainer = Chainer(atomspace,
                               agent=self,
                               stimulateAtoms=True,
                               preferAttentionalFocus=True,
                               allow_output_with_variables=True,
                               delete_temporary_variables=True)

        self.chainer.add_rule(GeneralEvaluationToMemberRule(
            self.chainer, 0, 2))
        self.chainer.add_rule(MemberToInheritanceRule(self.chainer))
        self.chainer.add_rule(
            DeductionRule(self.chainer, types.InheritanceLink))
        self.chainer.add_rule(InheritanceToMemberRule(self.chainer))
        self.chainer.add_rule(MemberToEvaluationRule(self.chainer))
        self.chainer.add_rule(
            AbductionRule(self.chainer, types.InheritanceLink))

    def run(self, atomspace):
        if self.chainer is None:
            self.create_chainer(atomspace)
            print("PLN Chainer created.")
            return

        print("PLN continuing.")

        # there is no query here, so it doesn't give any stimulus

        if not check_result(atomspace):
            result = self.chainer.forward_step()
            return result
Example #43
0
class ForwardInferenceAgent(MindAgent):
    def __init__(self):
        self.chainer = None

    def create_chainer(self, atomspace):
        self.chainer = Chainer(atomspace, stimulateAtoms = False, agent = self, learnRuleFrequencies=True)

        # ImplicationLink is MixedImplicationLink, you could also have Extensional and Intensional Implication. etc. but that's a bit much.
#        similarity_types = [types.SimilarityLink, types.ExtensionalSimilarityLink, types.IntensionalSimilarityLink]
#            types.EquivalenceLink]
#        conditional_probability_types = [types.InheritanceLink, types.SubsetLink, types.IntensionalInheritanceLink, types.ImplicationLink]

        # always use the mixed inheritance types, because human inference is normally a mix of intensional and extensional
        conditional_probability_types = [types.InheritanceLink, types.ImplicationLink]
        similarity_types = [types.SimilarityLink, types.EquivalenceLink]

        for link_type in conditional_probability_types:
            self.chainer.add_rule(rules.InversionRule(self.chainer, link_type))
            self.chainer.add_rule(rules.DeductionRule(self.chainer, link_type))
            self.chainer.add_rule(rules.ModusPonensRule(self.chainer, link_type))

        # As a hack, use the standard DeductionRule for SimilarityLinks. It needs its own formula really.
        for link_type in similarity_types:
            self.chainer.add_rule(rules.DeductionRule(self.chainer, link_type))

        # These two Rules create mixed links out of intensional and extensional links
        self.chainer.add_rule(rules.InheritanceRule(self.chainer))
        self.chainer.add_rule(rules.SimilarityRule(self.chainer))

        # and/or/not
        self.chainer.add_rule(rules.NotCreationRule(self.chainer))
        self.chainer.add_rule(rules.NotEliminationRule(self.chainer))
        for rule in rules.create_and_or_rules(self.chainer, 1, 2):
            self.chainer.add_rule(rule)

        # create probabilistic logical links out of MemberLinks
        self.chainer.add_rule(rules.SubsetEvaluationRule(self.chainer))
        self.chainer.add_rule(rules.IntensionalInheritanceEvaluationRule(self.chainer))

        self.chainer.add_rule(rules.ExtensionalSimilarityEvaluationRule(self.chainer))
        self.chainer.add_rule(rules.IntensionalSimilarityEvaluationRule(self.chainer))

        self.chainer.add_rule(rules.EvaluationToMemberRule(self.chainer))
        self.chainer.add_rule(rules.MemberToInheritanceRule(self.chainer))

        # AttractionLink could be useful for causality
        self.chainer.add_rule(rules.AttractionRule(self.chainer))

        for rule in temporal_rules.create_temporal_rules(self.chainer):
            self.chainer.add_rule(rule)

    def run(self, atomspace):
        # incredibly exciting futuristic display!
        #import os
        #os.system('cls' if os.name=='nt' else 'clear')

        def show_atoms(atoms):
            return ' '.join(str(atom)+str(atom.av) for atom in atoms)

        if self.chainer is None:
            self.create_chainer(atomspace)

        import pdb; pdb.set_trace()

        result = self.chainer.forward_step()
        if result:
            (rule, inputs, outputs) = result

            print '==== Inference ===='
            print rule.name, show_atoms(outputs), '<=', show_atoms(inputs)

            print
            print '==== Attentional Focus ===='
            for atom in get_attentional_focus(atomspace)[0:30]:
                print str(atom), atom.av

            #print '==== Result ===='
            #print output
            #print '==== Trail ===='
            #print_atoms( self.chainer.trails[output] )
        else:
            print 'Invalid inference attempted'

        try:
            pass
        except AssertionError:
            import sys,traceback
            _,_,tb = sys.exc_info()
            traceback.print_tb(tb) # Fixed format

            tbInfo = traceback.extract_tb(tb)
            filename,line,func,text = tbInfo[-1]
            print ('An error occurred on line ' + str(line) + ' in statement ' + text)
            exit(1)
        except Exception, e:
            print e
            print e.args
            e.print_traceback()

            import sys,traceback
            _,_,tb = sys.exc_info()
            traceback.print_tb(tb) # Fixed format

            tbInfo = traceback.extract_tb(tb)
            filename,line,func,text = tbInfo[-1]
            print ('An error occurred on line ' + str(line) + ' in statement ' + text)
            exit(1)
Example #44
0
data = "tests/python/test_pln/scm_disabled/temporal/temporalToyExample.scm"
# data = "opencog/python/pln_old/examples/temporal/temporal-r2l-input.scm"

# initialize atomspace
atomspace = AtomSpace()
__init__(atomspace)
for item in [coreTypes, utilities, timeLinks, data]:
    load_scm(atomspace, item)

# initialize chainer
chainer = Chainer(atomspace,
                  stimulateAtoms=False,
                  allow_output_with_variables=True,
                  delete_temporary_variables=True)
for rule in create_temporal_rules(chainer):
    chainer.add_rule(rule)

if print_starting_contents:
    print('AtomSpace starting contents:')
    atomspace.print_list()

outputs_produced = 0

for i in range(0, num_steps):
    result = chainer.forward_step()

    output = None
    input = None
    rule = None
    if result is not None:
        atomspace_string = ""
Example #45
0
class AllRules(object):
    def __init__(self, atomspace, chainer):
        from pln.rules import rules, temporal_rules, boolean_rules, quantifier_rules, context_rules, predicate_rules

        # contains every rule
        self.chainer = Chainer(atomspace,
                               stimulateAtoms=False,
                               agent=self,
                               learnRuleFrequencies=False)
        # contains only some rules
        self.test_chainer = chainer

        conditional_probability_types = [
            types.InheritanceLink, types.ImplicationLink,
            types.PredictiveImplicationLink
        ]
        similarity_types = [types.SimilarityLink, types.EquivalenceLink]

        for link_type in conditional_probability_types:
            self.chainer.add_rule(rules.InversionRule(self.chainer, link_type))
            self.chainer.add_rule(rules.DeductionRule(self.chainer, link_type))
            self.chainer.add_rule(rules.InductionRule(self.chainer, link_type))
            self.chainer.add_rule(rules.AbductionRule(self.chainer, link_type))
            # Seems better than Modus Ponens - it doesn't make anything up
            self.chainer.add_rule(
                rules.TermProbabilityRule(self.chainer, link_type))
            self.chainer.add_rule(
                rules.ModusPonensRule(self.chainer, link_type))

        for link_type in similarity_types:
            # SimilarityLinks don't require an InversionRule obviously
            self.chainer.add_rule(
                rules.TransitiveSimilarityRule(self.chainer, link_type))
            self.chainer.add_rule(
                rules.SymmetricModusPonensRule(self.chainer, link_type))

        self.chainer.add_rule(
            predicate_rules.EvaluationImplicationRule(self.chainer))

        # These two Rules create mixed links out of intensional and extensional links
        self.chainer.add_rule(rules.InheritanceRule(self.chainer))
        self.chainer.add_rule(rules.SimilarityRule(self.chainer))

        # boolean links
        for rule in boolean_rules.create_and_or_rules(self.chainer, 2, 8):
            self.chainer.add_rule(rule)

        # create probabilistic logical links out of MemberLinks

        self.chainer.add_rule(rules.AndEvaluationRule(self.chainer))
        self.chainer.add_rule(rules.OrEvaluationRule(self.chainer))

        self.chainer.add_rule(rules.ExtensionalLinkEvaluationRule(
            self.chainer))
        self.chainer.add_rule(rules.IntensionalLinkEvaluationRule(
            self.chainer))
        self.chainer.add_rule(rules.SubsetEvaluationRule(self.chainer))
        self.chainer.add_rule(rules.NegatedSubsetEvaluationRule(self.chainer))
        self.chainer.add_rule(
            rules.ExtensionalSimilarityEvaluationRule(self.chainer))
        self.chainer.add_rule(
            rules.IntensionalInheritanceEvaluationRule(self.chainer))
        self.chainer.add_rule(
            rules.IntensionalSimilarityEvaluationRule(self.chainer))

        self.member_rules = [
            rules.EvaluationToMemberRule(self.chainer),
            rules.MemberToEvaluationRule(self.chainer)
        ]
        self.member_rules += rules.create_general_evaluation_to_member_rules(
            self.chainer)
        for rule in self.member_rules:
            self.chainer.add_rule(rule)

        # It's important to have both of these
        self.chainer.add_rule(rules.MemberToInheritanceRule(self.chainer))
        #        self.chainer.add_rule(rules.InheritanceToMemberRule(self.chainer))

        # AttractionLink could be useful for causality
        self.chainer.add_rule(rules.AttractionRule(self.chainer))

        self.chainer.add_rule(quantifier_rules.ScholemRule(self.chainer))

        for rule in temporal_rules.create_temporal_rules(self.chainer):
            self.chainer.add_rule(rule)

    def lookup_rule(self, rule_schema_node):
        rule = self.chainer.lookup_rule(rule_schema_node.name)
        rule._chainer = self.test_chainer
        return rule