Exemple #1
0
def PopulateTokenFromANode(aNode,bindings):
    #print aNode, bindings
    termList = [isinstance(term,Variable) and bindings[term] or term
                    for term in aNode.triplePattern]
    token = ReteToken(tuple(termList))
    token.bindVariables(aNode)
    return token
Exemple #2
0
    def handleInferredTriple(self,
                             inferredTriple,
                             tokens,
                             termNode,
                             binding,
                             debug=False,
                             executeFn=None):
        inferredToken=ReteToken(inferredTriple)
        self.proofTracers.setdefault(inferredTriple,[]).append(binding)
        self.justifications.setdefault(inferredTriple,set()).add(termNode)
        if termNode.filter and inferredTriple not in self.filteredFacts:
            self.filteredFacts.add(inferredTriple)
        if inferredTriple not in self.inferredFacts and inferredToken not in self.workingMemory:
            if debug:
                lit = BuildUnitermFromTuple(inferredTriple,
                    newNss=self.nsMap)
                print "Inferred triple: ", lit, " from ",termNode.clauseRepresentation()
                inferredToken.debug = True
            if executeFn:
                #The indicated execute action is supposed to be triggered
                #when the indicates RHS triple is inferred for the
                #first time
                executeFn(termNode,inferredTriple,tokens,binding,debug)
            if self.goal is not None and self.goal == inferredTriple:#in self.inferredFacts:
                for binding in tokens.bindings:
                    rt=None#self.bfp.extractProof(binding,termNode.ruleNo,inferredTriple,applyBindings=True)
                    def depth(l):
                        assert isinstance(l,(tuple))
                        if isinstance(l,tuple):
                            depths = [depth(item) for item in l[2]]
                            return 1 + max(depths) if depths else 1
                            #self.bfp.proof = -1,rt#depth(rt),rt
                if debug:
                    "Proved goal " + repr(self.goal)
                raise InferredGoal("Proved goal " + repr(self.goal))
            self.inferredFacts.add(inferredTriple)
            self.addWME(inferredToken)
            currIdx = self.instanciations.get(termNode,0)
            currIdx+=1
            self.instanciations[termNode] = currIdx

        else:
            if debug:
                lit = BuildUnitermFromTuple(inferredTriple,
                    newNss=self.nsMap)
                print "Inferred triple skipped: ", lit
            if executeFn:
                #The indicated execute action is supposed to be triggered
                #when the indicates RHS triple is inferred for the
                #first time
                executeFn(termNode,inferredTriple,tokens,binding,debug)