def get_induct_eq_hyp(p, split, restrs, n): details = (split, (0, 1), []) (tag, _) = p.node_tags[split] visit = split_visit_one_visit(tag, details, restrs, vc_offs(0)) from syntax import mk_var, word32T, mk_word32 return eq_hyp((mk_var("%n", word32T), visit), (mk_word32(n), visit), (split, 0))
def linear_eq_induct_base_checks (p, restrs, hyps, tag, split, eqs): tests = [] details = (split, (0, 1), eqs) for i in [0, 1]: reach = split_visit_one_visit (tag, details, restrs, vc_num (i)) nhyps = [pc_true_hyp (reach)] tests.extend ([(hyps + nhyps, hyp, 'Base check (%s, %d) at induct step for %d' % (desc, i, split)) for (hyp, desc) in linear_eq_hyps_at_visit (tag, split, eqs, restrs, vc_num (i))]) return tests
def linear_eq_induct_step_checks(p, restrs, hyps, tag, split, eqs_assume, eqs): details = (split, (0, 1), eqs_assume + eqs) cont = split_visit_one_visit(tag, details, restrs, vc_offs(1)) hyps = ( [pc_true_hyp(cont)] + hyps + [h for (h, _) in linear_eq_hyps_at_visit(tag, split, eqs_assume + eqs, restrs, vc_offs(0))] ) return [ (hyps, hyp, "Induct check (%s) at inductive step for %d" % (desc, split)) for (hyp, desc) in linear_eq_hyps_at_visit(tag, split, eqs, restrs, vc_offs(1)) ]
def linear_eq_induct_step_checks (p, restrs, hyps, tag, split, eqs): details = (split, (0, 1), eqs) cont = split_visit_one_visit (tag, details, restrs, vc_offs (1)) # the 'trivial' hyp here ensures the representation includes a loop # of the rhs when proving const equations on the lhs hyps = ([pc_true_hyp (cont)] + hyps + [h for (h, _) in linear_eq_hyps_at_visit (tag, split, eqs, restrs, vc_offs (0))]) return [(hyps, hyp, 'Induct check (%s) at inductive step for %d' % (desc, split)) for (hyp, desc) in linear_eq_hyps_at_visit (tag, split, eqs, restrs, vc_offs (1))]
def linear_eq_hyps_at_visit (tag, split, eqs, restrs, visit_num): details = (split, (0, 1), eqs) visit = split_visit_one_visit (tag, details, restrs, visit_num) start = split_visit_one_visit (tag, details, restrs, vc_num (0)) from syntax import mk_word32, mk_plus, mk_var, word32T def mksub (v): return lambda exp: logic.var_subst (exp, {('%i', word32T) : v}, must_subst = False) zsub = mksub (mk_word32 (0)) if visit_num.kind == 'Number': isub = mksub (mk_word32 (visit_num.n)) else: isub = mksub (mk_plus (mk_var ('%n', word32T), mk_word32 (visit_num.n))) hyps = [(Hyp ('PCImp', visit, start), '%s pc imp' % tag)] hyps += [(eq_hyp ((zsub (exp), start), (isub (exp), visit), (split, 0)), '%s const' % tag) for exp in eqs if logic.inst_eq_at_visit (exp, visit_num)] return hyps