def testMultZeroRight(self): """Proof of n * 0 = 0 by induction.""" thy = basic.load_theory('nat') n = Var("n", nat.natT) state = ProofState.init_state(thy, [n], [], Term.mk_equals(nat.times(n, nat.zero), nat.zero)) state.apply_induction(0, "nat_induct", "n") state.rewrite_goal(0, "times_def_1") state.introduction(1, names=["n"]) state.rewrite_goal((1, 2), "times_def_2") state.rewrite_goal((1, 2), "plus_def_1") self.assertEqual(state.check_proof(no_gaps=True), Thm.mk_equals(nat.times(n, nat.zero), nat.zero))
def testMultZeroRight(self): """Proof of n * 0 = 0 by induction.""" thy = basic.load_theory('nat') n = Var("n", nat.natT) eq = Term.mk_equals prf = Proof() prf.add_item(0, "theorem", args="nat_induct") prf.add_item(1, "substitution", args={ "P": Term.mk_abs(n, eq(nat.times(n, nat.zero), nat.zero)), "x": n }, prevs=[0]) prf.add_item(2, "beta_norm", prevs=[1]) prf.add_item(3, "theorem", args="times_def_1") prf.add_item(4, "substitution", args={"n": nat.zero}, prevs=[3]) prf.add_item(5, "implies_elim", prevs=[2, 4]) prf.add_item(6, "assume", args=eq(nat.times(n, nat.zero), nat.zero)) prf.add_item(7, "theorem", args="times_def_2") prf.add_item(8, "substitution", args={ "m": n, "n": nat.zero }, prevs=[7]) prf.add_item(9, "theorem", args="plus_def_1") prf.add_item(10, "substitution", args={"n": nat.times(n, nat.zero)}, prevs=[9]) prf.add_item(11, "transitive", prevs=[8, 10]) prf.add_item(12, "transitive", prevs=[11, 6]) prf.add_item(13, "implies_intr", args=eq(nat.times(n, nat.zero), nat.zero), prevs=[12]) prf.add_item(14, "forall_intr", args=n, prevs=[13]) prf.add_item(15, "implies_elim", prevs=[5, 14]) th = Thm.mk_equals(nat.times(n, nat.zero), nat.zero) self.assertEqual(thy.check_proof(prf), th)
def testPrintUnicode(self): test_data = [ (conj(A, B), "A ∧ B"), (disj(A, B), "A ∨ B"), (imp(A, B), "A ⟶ B"), (abs(a, P(a)), "λa. P a"), (all(a, P(a)), "∀a. P a"), (exists(a, P(a)), "∃a. P a"), (neg(A), "¬A"), (nat.plus(m, n), "m + n"), (nat.times(m, n), "m * n"), ] for t, s in test_data: self.assertEqual(printer.print_term(thy, t, unicode=True), s)
def testPrintArithmetic(self): test_data = [ (nat.plus(m, n), "m + n"), (nat.plus(nat.plus(m, n), p), "m + n + p"), (nat.plus(m, nat.plus(n, p)), "m + (n + p)"), (nat.times(m, n), "m * n"), (nat.times(nat.times(m, n), p), "m * n * p"), (nat.times(m, nat.times(n, p)), "m * (n * p)"), (nat.plus(m, nat.times(n, p)), "m + n * p"), (nat.times(m, nat.plus(n, p)), "m * (n + p)"), (nat.zero, "0"), (nat.plus(nat.zero, nat.zero), "0 + 0"), (nat.times(m, nat.zero), "m * 0"), ] for t, s in test_data: self.assertEqual(printer.print_term(thy, t), s)
def times(self, lhs, rhs): return nat.times(lhs, rhs)
def times_expr(self, e1, e2): return nat.times(e1, e2)