Ejemplo n.º 1
0
    def from_str(cls, clause_str):
        """
        Creates a Horn clause from a Horn clause string.

        :param clause_str:
        :return: HornClause
        """
        if clause_str[-1] != '.' or clause_str.find(';') != -1:
            raise ValueError('Invalid clause.')
        if clause_str.find('%') != -1:
            return None
        clause_str = clause_str.replace('?-', ':-')
        conclusion_str, premises_str = split_clause(clause_str)
        premises = []
        conclusion = None
        if conclusion_str:
            conclusion = Atom.from_str(conclusion_str)
        for p in premises_str:
            premises.append(Atom.from_str(p))
        return cls(conclusion, premises)
Ejemplo n.º 2
0
if __name__ == "__main__":
    if len(sys.argv) == 4:
        kb = create_kb(sys.argv[1])
        queries = get_clauses_from_file(sys.argv[2])
        with open(sys.argv[3], 'w') as out_file:
            for query in queries:
                out_file.write(str(query) + '\n')
                out_file.write(to_str(kb.ask(query)) + '\n\n')
    # Demo
    else:
        # All men are mortal.
        # Socrates is a man.
        premises = ['mortal(X) :- man(X).', 'man("Socrates").']

        # Is Socrates mortal?
        query = ':- mortal("Socrates").'

        premise_clauses = [HornClause.from_str(x) for x in premises]
        kb = KnowledgeBase(premise_clauses)
        query_clause = HornClause.from_str(query)

        # Yes, he is.
        response = kb.ask(query_clause)[0]
        assert response

        # This is how it works
        conclusion = 'mortal("Socrates")'
        argument = kb.make_argument(Atom.from_str(conclusion))
        print(argument)