import core.builtin_helpers from core.builtin_concepts import ParserResultConcept, BuiltinConcepts from evaluators.BaseEvaluator import OneReturnValueEvaluator from parsers.DefaultParser import IsaConceptNode ALL_STEPS = [ BuiltinConcepts.BEFORE_PARSING, BuiltinConcepts.PARSING, BuiltinConcepts.EVALUATION, BuiltinConcepts.AFTER_EVALUATION ] class AddConceptInSetEvaluator(OneReturnValueEvaluator): """ Tells that a concept is a part of a set """ NAME = "AddConceptInSet" def __init__(self): super().__init__(self.NAME, 50) def matches(self, context, return_value): return return_value.status and \ isinstance(return_value.value, ParserResultConcept) and \ isinstance(return_value.value.value, IsaConceptNode) def eval(self, context, return_value): def _resolve(name_node): ret_val = sheerka.ret( self.name, True, sheerka.new(BuiltinConcepts.USER_INPUT, body=name_node.tokens, user_name="N/A")) sub_context = context.push(desc=f"Recognizing '{name_node}'") r = sheerka.execute(sub_context, ret_val, ALL_STEPS, self.verbose_log) return core.builtin_helpers.expect_one(context, r) isa_node = return_value.value.value sheerka = context.sheerka context.log(self.log, f"Adding a concept {isa_node.concept} to set {isa_node.set}", self.name) # Try to recognize the concept res = _resolve(isa_node.concept) if not res.status: return sheerka.ret( self.name, False, sheerka.new(BuiltinConcepts.UNKNOWN_CONCEPT, body=str(isa_node.concept)), parents=[return_value]) concept = res.value res = _resolve(isa_node.set) if not res.status: return sheerka.ret( self.name, False, sheerka.new(BuiltinConcepts.UNKNOWN_CONCEPT, body=str(isa_node.set)), parents=[return_value]) concept_set = res.value res = sheerka.add_concept_to_set(context, concept, concept_set, self.verbose_log) if not res.status: context.log(self.log, f"Failed. Reason: {sheerka.value(res.body)}.", self.name) else: context.log(self.log, f"Concept added.", self.name) return res