def integrate(self, concept: Concept) -> Concept: integrated = self.get_concept(concept) if integrated is None: ip = [] # type: list[Concept] for p in concept.parents: ip.append(self.integrate(p)) integrated = Concept(concept.name, concept.relation, ip, concept.probability) integrated.store = self integrated.register_with_parents() self.add_concept(integrated) if integrated.relation == Relation.Word: word = integrated.name if word not in self._words: w = Word(word) w.add_meaning(integrated) self._words[word] = w elif integrated.relation == Relation.Implication: integrated.propagate_probability_from_parent( integrated.parents[0]) else: integrated.merge_probability(concept.probability) return integrated