def orComm(): A = Var("a") B = Var("b") p1 = premise(Or(A, B)) return orE( p1, arrowI(assume(A), orIR(assumed(A), Or(B, A)), Arrow(A, Or(B, A))), arrowI(assume(B), orIL(assumed(B), Or(B, A)), Arrow(B, Or(B, A))), Or(B, A))
def contra(): return arrowI( assume(parse("EX x. P(x)")), arrowE( existsE( assumed(parse("EX x. P(x)")), "a", arrowI(assume(parse("P(a)")), assumed(parse("P(a)")), Arrow(parse("P(a)"), parse("P(a)"))), parse("P(a)")), forallE(premise(parse("FA x. (P(x)->Q)")), "a", parse("P(a)->Q")), Var("Q")), Arrow(parse("EX x. P(x)"), Var("Q")))
def disSyl(): A = Var("a") B = Var("b") p1 = premise(Or(A, B)) p2 = premise(Not(B)) return orE( p1, arrowI(assume(A), assumed(A), Arrow(A, A)), arrowI(assume(B), FE(notE(assumed(B), p2, false()), A), Arrow(B, A)), A)
def doubleNeg(p, a): l1 = LEM(Or(a, Not(a))) l2 = assume(a) l3 = assumed(a) l4 = arrowI(l2, l3, Arrow(a, a)) l5 = assume(Not(a)) l6 = assumed(Not(a)) l7 = notE(l6, p, false()) l8 = FE(l7, a) l9 = arrowI(l5, l8, Arrow(Not(a), a)) l10 = orE(l1, l4, l9, a) return l10
def DM2(): return notI( arrowI( assume(parse("FA x. P(x)")), notE( forallE(assumed(parse("FA x. P(x)")), "a", parse("P(a)")), existsE( premise(parse("EX x. ~P(x)")), "a", arrowI(assume(Not(parse("P(a)"))), assumed(Not(parse("P(a)"))), Arrow(Not(parse("P(a)")), Not(parse("P(a)")))), Not(parse("P(a)"))), false()), (Arrow(parse("FA x. P(x)"), false()))), Not(parse("FA x. P(x)")))
def contra(): return arrowI( assume(parse("EX x.P(x)")), existsE( assumed(parse("EX x.P(x)")), "c", forallE(premise(parse("FA x.P(x) -> Q")), "c", parse("P(c) -> Q")), parse("Q")), parse("(EX x.P(x)) -> Q"))
def Q3_1(): clear() A = Var("A") B = Var("B") p1 = premise(Or(A, B)) return orE(p1, arrowI(assume(A), orIR(assumed(A), Or(B, A)), Arrow(A, Or(B, A))), arrowI(assume(B), orIL(assumed(B), Or(B, A)), Arrow(B, Or(B, A))), Or(B, A))
def exists_comm(): return existsE( premise(parse("EX x. EX y. P(x,y)")), "c", arrowI( assume(parse("EX y. P(c,y)")), existsE( assumed(parse("EX y. P(c,y)")), "d", arrowI( assume(parse("P(c,d)")), existsI( existsI(assumed(parse("P(c,d)")), "c", parse("EX x. P(x,d)")), "d", parse("EX y. EX x. P(x,y)")), parse("P(c,d) -> EX y. EX x. P(x,y)")), parse("EX y. EX x. P(x,y)")), parse("(EX y. P(c,y)) -> EX y. EX x. P(x,y)")), parse("EX y. EX x. P(x,y)"))
def Q3_2(): clear() A = Var("A") B = Var("B") p1 = premise(Or(A, B)) p2 = premise(Not(B)) return orE(p1, Arrow(A,A), arrowI(assume(B), FE(notE(assumed(B), p2, false()), A), Arrow(B, A)), A)
def Q3_3(): clear() A = Var("A") B = Var("B") p1 = premise(Or(Not(A), Not(B))) end = Not(And(A,B)) A_B = And(A,B) return orE(p1, arrowI(assume(Not(A)), notI(arrowI(assume(A_B), notE(andEL(assumed(A_B), A), assumed(Not(A)), false()), Arrow(A_B, false())), Not(A_B)), Arrow(Not(A), Not(A_B))), arrowI(assume(Not(B)), notI(arrowI(assume(A_B), notE(andER(assumed(A_B), B), assumed(Not(B)), false()), Arrow(A_B, false())), Not(A_B)), Arrow(Not(B), Not(A_B))), end)
def DM2(): return notI( arrowI( assume(parse("FA x. P(x)")), notE( forallE(assumed(parse("FA x. P(x)")), "c", parse("P(c)")), existsE( premise(parse("EX x. ~P(x)")), "d", arrowI( assume(parse("~P(d)")), FE( notE( forallE(assumed(parse("FA x. P(x)")), "d", parse("P(d)")), assumed(parse("~P(d)")), false()), parse("~P(c)")), parse("~P(d) -> ~P(c)")), parse("~P(c)")), false()), Arrow(parse("FA x. P(x)"), false())), parse("~FA x. P(x)"))
def DM3(): return forallI( assume(Var("a")), notI( arrowI( assume(parse("P(a)")), notE(existsI(assumed(parse("P(a)")), "a", parse("EX x. P(x)")), premise(Not(parse("EX x. P(x)"))), false()), Arrow(parse("P(a)"), false())), Not(parse("P(a)"))), parse("FA x. ~P(x)"))
def DL2(p1): a = Var("a") b = Var("b") return doubleNeg( notI( arrowI( assume(Not(b)), notE(orIR(assumed(Not(b)), Or(Not(a), Not(b))), p1, false()), Arrow(Not(b), false())), Not(Not(b))), b)
def example(): clear() p1 = premise(parse("EX x. FA y. P(x,y)")) a1 = assume(parse("FA y. P(u,y)")) a2 = assume(Var("v")) l1 = assumed(parse("FA y. P(u,y)")) l2 = forallE(l1, "v", parse("P(u,v)")) l3 = existsI(l2, "u", parse("EX x. P(x,v)")) l4 = forallI(a2, l3, parse("FA y. EX x. P(x,y)")) l5 = arrowI(a1, l4, parse("(FA y. P(u,y)) -> (FA y. EX x. P(x,y))")) l6 = existsE(p1, "u", l5, parse("FA y. EX x. P(x,y)")) return l6
def DM1(): A = Var("a") B = Var("b") p1 = premise(Or(Not(A), Not(B))) end = Not(And(A, B)) A_B = And(A, B) #I condensed parts of the proofs so I could substitute in things that made sense to me, otherwise I was going nuts return orE( p1, arrowI( assume(Not(A)), notI( arrowI(assume(A_B), notE(andEL(assumed(A_B), A), assumed(Not(A)), false()), Arrow(A_B, false())), Not(A_B)), Arrow(Not(A), Not(A_B))), arrowI( assume(Not(B)), notI( arrowI(assume(A_B), notE(andER(assumed(A_B), B), assumed(Not(B)), false()), Arrow(A_B, false())), Not(A_B)), Arrow(Not(B), Not(A_B))), end)
def arrTrans(): a = Var("A") b = Var("B") c = Var("C") p1 = premise(Arrow(a, b)) p2 = premise(Arrow(b, c)) a1 = assume(a) return arrowI(a1, \ arrowE(arrowE(assumed(a), \ p1, \ b), \ p2, \ c), \ Arrow(a,c))
def ren_exists(): return existsE( premise(parse("EX x. P(x)")), "c", arrowI(assume(parse("P(c)")), existsI(assumed(parse("P(c)")), "c", parse("EX z. P(z)")), parse("P(c) -> EX z. P(z)")), parse("EX z. P(z)"))