def ex42(f):
    s = ""
    if Eval.satisfiable(f):
        s += "satisfiable "
    if Eval.unsatisfiable(f):
        s += "unsatisfiable "
    if Eval.tautology(f):
        s += "tautology"

    return s + "\n(satisfiable: %s, unsatisfiable %s, tautology: %s)" % (Eval.satisfiable(f), Eval.unsatisfiable(f), Eval.tautology(f))
    def test_exercise42(self):
        f1 = "Smoke => Smoke"
        self.assertTrue(Eval.satisfiable(f1))
        self.assertFalse(Eval.unsatisfiable(f1))
        self.assertTrue(Eval.tautology(f1))

        f1 = "(Smoke => Fire) => (~Smoke => ~Fire)"
        self.assertTrue(Eval.satisfiable(f1))
        self.assertFalse(Eval.unsatisfiable(f1))
        self.assertFalse(Eval.tautology(f1))

        f1 = "Smoke \\/ Fire\\/ ~Fire"
        self.assertTrue(Eval.satisfiable(f1))
        self.assertFalse(Eval.unsatisfiable(f1))
        self.assertTrue(Eval.tautology(f1))

        f1 = "(Fire => Smoke) /\\ Fire /\\ ~Smoke"
        self.assertFalse(Eval.satisfiable(f1))
        self.assertTrue(Eval.unsatisfiable(f1))
        self.assertFalse(Eval.tautology(f1))
 def test_questoin423(self):
     self.assertFalse(Eval.tautology("~(kb /\ ~A) => (kb /\ A)"))
 def test_tautology(self):
     self.assertFalse(Eval.tautology("a /\\ b"))
     self.assertTrue(Eval.tautology("a <=> a"))
     self.assertFalse(Eval.tautology("a <=> b"))