71 lines
2.4 KiB
Python
71 lines
2.4 KiB
Python
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
|
|
|
|
|