Source code for autstr.utils.logic

import nltk
from nltk.sem.logic import Expression, AllExpression, ExistsExpression, NegatedExpression, ApplicationExpression, AndExpression, OrExpression
from typing import List


[docs] def get_free_elementary_vars(phi: Expression) -> List[str]: """ Get an ordered list of all free elementary variables of phi. :param phi: The formula :return: Ordered list with all elementary variable names """ types = phi.typecheck() free_vars = [ str(v) for v in [x for x in phi.free() if isinstance(types[str(x)], nltk.sem.logic.EntityType)] ] free_vars.sort() return free_vars
[docs] def optimize_query(query: Expression) -> Expression: """ Optimize a query for optimized automata construction. :param query: The query expression :return: Optimized query expression """ if isinstance(query, AllExpression): query.term = optimize_query(query.term) if query.variable.name in get_free_elementary_vars(query): return query.term else: return query elif isinstance(query, ExistsExpression): query.term = optimize_query(query.term) if query.variable.name in get_free_elementary_vars(query): return query.term else: return query elif isinstance(query, NegatedExpression): if isinstance(query.term, AllExpression): term = optimize_query(NegatedExpression(query.term)) return ExistsExpression(query.variable, term) elif isinstance(query.term, NegatedExpression): return optimize_query(query.term.term) else: return NegatedExpression(optimize_query(query.term)) else: return query