Ejemplo n.º 1
0
    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