def predictSuccess(current_skills, equation): curr_skills_KB = FolKB() required_skills_KB = FolKB() required_skills = set() # Create KnowledgeBase for current skills that exist for skill in current_skills: curr_skills_KB.tell(expr(skill)) steps_for_solving = solveEquation(equation) lht = getLeftTerms(equation) rht = getRightTerms(equation) divisor = calcDivisor(lht, rht) rht_var_combine = calcCombineVars(rht) lht_var_combine = calcCombineVars(lht) for step in steps_for_solving: if 'addVar' in step: if step[6] == '-': required_skills.add('S2') else: required_skills.add('S1') elif 'addConst' in step: if step[9] == '-': required_skills.add('S4') else: required_skills.add('S3') elif 'divide' in step: if divisor > 0: required_skills.add('S5') else: required_skills.add('S6') elif ('combineRightConst' or 'combineRightConstTwo') in step: required_skills.add('S9') elif 'combineLeftVar': if (rht_var_combine > 0) | (lht_var_combine > 0): required_skills.add('S7') else: required_skills.add('S8') for sk in required_skills: required_skills_KB.tell(expr(sk)) for curr_sk in curr_skills_KB.clauses: if curr_sk in required_skills_KB.clauses: required_skills_KB.retract(curr_sk) missing_skills = required_skills_KB.clauses return missing_skills
def act(self, kb, args): """Executes the action on the state's knowledge base""" if isinstance(kb, list): kb = FolKB(kb) if not self.check_precond(kb, args): raise Exception('Action pre-conditions not satisfied') for clause in self.effect: kb.tell(self.substitute(clause, args)) if clause.op[:3] == 'Not': new_clause = Expr(clause.op[3:], *clause.args) if kb.ask(self.substitute(new_clause, args)) is not False: kb.retract(self.substitute(new_clause, args)) else: new_clause = Expr('Not' + clause.op, *clause.args) if kb.ask(self.substitute(new_clause, args)) is not False: kb.retract(self.substitute(new_clause, args)) return kb