def p_expr_noteq(p: Any) -> None: '''expr : expr NOTEQ expr | expr NOTEQ2 expr''' l: syntax.Expr = p[1] r: syntax.Expr = p[3] span = loc_join(l.span, r.span) p[0] = syntax.BinaryExpr('NOTEQ', l, r, span=span)
def negate_clause(c: Expr) -> Expr: if isinstance(c, syntax.Bool): return syntax.Bool(not c.val) elif isinstance(c, syntax.UnaryExpr): assert c.op == 'NOT' return c.arg elif isinstance(c, syntax.BinaryExpr): assert c.op in ['EQUAL', 'NOTEQ'] op = 'NOTEQ' if c.op == 'EQUAL' else 'EQUAL' return syntax.BinaryExpr(op, c.arg1, c.arg2) elif isinstance(c, syntax.NaryExpr): assert c.op == 'OR' return syntax.NaryExpr('AND', [negate_clause(arg) for arg in c.args]) elif isinstance(c, syntax.AppExpr) or isinstance(c, syntax.Id): return syntax.Not(c) else: assert False, f'unsupported expression {c} in negate_clause'
def negate_clause(c: Expr) -> Expr: if isinstance(c, syntax.Bool): return syntax.Bool(not c.val) elif isinstance(c, syntax.UnaryExpr): assert c.op == 'NOT' return c.arg elif isinstance(c, syntax.BinaryExpr): assert c.op in ['EQUAL', 'NOTEQ'] op = 'NOTEQ' if c.op == 'EQUAL' else 'EQUAL' return syntax.BinaryExpr(op, c.arg1, c.arg2) elif isinstance(c, syntax.NaryExpr): assert c.op == 'OR' return syntax.NaryExpr('AND', tuple(negate_clause(arg) for arg in c.args)) elif isinstance(c, syntax.AppExpr) or isinstance(c, syntax.Id): return syntax.Not(c) elif isinstance(c, syntax.QuantifierExpr): assert c.quant == 'FORALL' return syntax.QuantifierExpr('EXISTS', c.get_vs(), negate_clause(c.body)) else: assert False, f'unsupported expression {c} in negate_clause'
def p_expr_noteq(p: Any) -> None: 'expr : expr NOTEQ expr' p[0] = syntax.BinaryExpr(p.slice[2], 'NOTEQ', p[1], p[3])
def p_expr_eq(p: Any) -> None: 'expr : expr EQUAL expr' p[0] = syntax.BinaryExpr(p.slice[2], 'EQUAL', p[1], p[3])
def p_expr_implies(p: Any) -> None: 'expr : expr IMPLIES expr' p[0] = syntax.BinaryExpr(p.slice[2], 'IMPLIES', p[1], p[3])
def p_expr_iff(p: Any) -> None: 'expr : expr IFF expr' p[0] = syntax.BinaryExpr(p.slice[2], 'IFF', p[1], p[3])
def p_expr_implies(p: Any) -> None: 'expr : expr IMPLIES expr' l: syntax.Expr = p[1] r: syntax.Expr = p[3] span = loc_join(l.span, r.span) p[0] = syntax.BinaryExpr('IMPLIES', l, r, span=span)
def p_expr_eq(p: Any) -> None: 'expr : expr EQUAL expr' l: syntax.Expr = p[1] r: syntax.Expr = p[3] span = loc_join(l.span, r.span) p[0] = syntax.BinaryExpr('EQUAL', l, r, span=span)
def p_expr_iff(p: Any) -> None: 'expr : expr IFF expr' l: syntax.Expr = p[1] r: syntax.Expr = p[3] span = loc_join(l.span, r.span) p[0] = syntax.BinaryExpr('IFF', l, r, span=span)
def p_expr_mult(p: Any) -> None: 'expr : expr STAR expr' l: syntax.Expr = p[1] r: syntax.Expr = p[3] span = loc_join(l.span, r.span) p[0] = syntax.BinaryExpr('MULT', l, r, span=span)
def p_expr_sub(p: Any) -> None: 'expr : expr SUB expr' l: syntax.Expr = p[1] r: syntax.Expr = p[3] span = loc_join(l.span, r.span) p[0] = syntax.BinaryExpr('SUB', l, r, span=span)
def p_expr_plus(p: Any) -> None: 'expr : expr PLUS expr' l: syntax.Expr = p[1] r: syntax.Expr = p[3] span = loc_join(l.span, r.span) p[0] = syntax.BinaryExpr('PLUS', l, r, span=span)
def p_expr_le(p: Any) -> None: 'expr : expr LE expr' l: syntax.Expr = p[1] r: syntax.Expr = p[3] span = loc_join(l.span, r.span) p[0] = syntax.BinaryExpr('LE', l, r, span=span)