def make_argument(self, conclusion: Atom): """ Constructs an argument that leads to conclusion. :param conclusion: Atom - conclusion :return: str - string that describes argument """ if not (conclusion.is_ground()): raise ValueError('Invalid conclusion') else: query_conclusion_str = ':-' + str(conclusion) + '.' if self.ask(HornClause.from_str(query_conclusion_str))[0]: s = '' known_clauses = self.get_clauses(conclusion.predicate) for known_clause in known_clauses: subs_dict = unify(known_clause.conclusion, conclusion) if subs_dict: substituted_clause = known_clause.substitute(subs_dict) query = HornClause(None, substituted_clause.premises) found, solutions = self.ask(query) if found: if solutions: substituted_query = query.substitute(solutions[0]) else: substituted_query = query for p in substituted_query.premises: s += str(p) + '.\n' s += str(known_clause) + '\n' s += '\u2234 ' + str(conclusion) break else: s = 'Argument does not exist.' return s