Пример #1
0
def test_contraposition_theorem():
    kb = KnowledgeBase()

    kb.add_axiom(Proposition('''p -> q'''))
    kb.add_goal(Proposition('''(~q -> ~p)'''))

    assert kb.prove() == True
Пример #2
0
def test_implication_distribution():
    kb = KnowledgeBase()

    kb.add_axiom(Proposition('''p -> (q -> r)'''))
    kb.add_goal(Proposition('''(p -> q) -> (p -> r)'''))

    assert kb.prove() == True
def test_biconditional_elimination_v4():
    kb = KnowledgeBase()

    axioms = ['p = q', '¬q']
    [kb.add_axiom(Proposition(statement)) for statement in axioms]
    kb.add_goal(Proposition('''!p'''))

    assert kb.prove() == True
Пример #4
0
def test_biconditional_elimination_unsat_v5():
    kb = KnowledgeBase()

    axioms = ['j <-> r', 'r v j']
    [kb.add_axiom(Proposition(statement)) for statement in axioms]
    kb.add_goal(Proposition('''!(r & j)'''))

    assert kb.prove() == False
Пример #5
0
def test_biconditional_elimination_unsat_v3():
    kb = KnowledgeBase()

    axioms = ['p = q', '!p']
    [kb.add_axiom(Proposition(statement)) for statement in axioms]
    kb.add_goal(Proposition('''q'''))

    assert kb.prove() == False
Пример #6
0
def test_hypothetical_syllogism_fails_when_conclusion_negated():
    kb = KnowledgeBase()

    axioms = ['a -> b', 'b -> c', 'c -> d', 'd -> e', 'e -> f', 'f -> g', 'a']
    [kb.add_axiom(Proposition(statement)) for statement in axioms]
    kb.add_goal(Proposition('''~g'''))

    assert kb.prove() == False
def test_constructive_dilemma():
    kb = KnowledgeBase()

    axioms = ['a -> b', 'c -> d', 'a v c']
    [kb.add_axiom(Proposition(statement)) for statement in axioms]
    kb.add_goal(Proposition('''(b v d)'''))

    assert kb.prove() == True
def test_case_analysis():
    kb = KnowledgeBase()

    axioms = ['a -> b', 'c -> b', 'a v c']
    [kb.add_axiom(Proposition(statement)) for statement in axioms]
    kb.add_goal(Proposition('''b'''))

    assert kb.prove() == True
def test_disjunctive_syllogism_v2():
    kb = KnowledgeBase()

    axioms = ['p v q', '~q']
    [kb.add_axiom(Proposition(statement)) for statement in axioms]
    kb.add_goal(Proposition('''p'''))

    assert kb.prove() == True
Пример #10
0
def test_absorption():
    kb = KnowledgeBase()

    kb.add_axiom(Proposition('''(p -> q)'''))
    kb.add_axiom(Proposition('''(p -> (p & q))'''))
    kb.add_goal(Proposition('''(p -> q)'''))

    assert kb.prove() == True
Пример #11
0
def test_modus_tollens():
    kb = KnowledgeBase()

    axioms = ['p -> q', '~q']
    [kb.add_axiom(Proposition(statement)) for statement in axioms]
    kb.add_goal(Proposition('''~p'''))

    assert kb.prove() == True
def test_biconditional_introduction():
    kb = KnowledgeBase()

    axioms = ['e -> f', 'f -> e']
    [kb.add_axiom(Proposition(statement)) for statement in axioms]
    kb.add_goal(Proposition('''e <-> f'''))

    assert kb.prove() == True
Пример #13
0
def test_hypothetical_syllogism():
    kb = KnowledgeBase()

    axioms = ['a -> b', 'b -> c', 'c -> d', 'd -> e', 'e -> f', 'f -> g', 'a']
    [kb.add_axiom(Proposition(statement)) for statement in axioms]
    kb.add_goal(Proposition('''g'''))

    assert kb.prove() == True
Пример #14
0
def test_multiple_goal_clauses():
    kb = KnowledgeBase()

    kb.add_axiom(Proposition('''p -> q'''))
    kb.add_axiom(Proposition('''r -> s'''))
    kb.add_goal(Proposition('''(p v r) -> (q v s)'''))

    assert kb.prove() == True
def test_biconditional_elimination_v6():
    kb = KnowledgeBase()

    axioms = ['j <-> r', '~r v ~j']
    [kb.add_axiom(Proposition(statement)) for statement in axioms]
    kb.add_goal(Proposition('''(~r & ~j)'''))

    assert kb.prove() == True
Пример #16
0
def test_affirming_the_consequent():
    ''' Affirming the consequent should return False '''
    kb = KnowledgeBase()

    axioms = ['p -> q', 'q']
    [kb.add_axiom(Proposition(statement)) for statement in axioms]
    kb.add_goal(Proposition('''p'''))

    assert kb.prove() == False
Пример #17
0
def test_another_multiple_goal_clauses():
    kb = KnowledgeBase()

    kb.add_axiom(Proposition('''(p -> q) -> q'''))
    kb.add_axiom(Proposition('''(p -> p) -> r'''))
    kb.add_axiom(Proposition('''(r -> s) -> ~(s -> q)'''))
    kb.add_goal(Proposition('''r'''))

    assert kb.prove() == True
Пример #18
0
def test_exercise_5_4():
    ''' http://intrologic.stanford.edu/exercises/exercise_05_04.html '''
    kb = KnowledgeBase()

    kb.add_axiom(Proposition('''p -> q'''))
    kb.add_axiom(Proposition('''r -> s'''))
    kb.add_goal(Proposition('''(p v r) -> (q v s)'''))

    assert kb.prove() == True
Пример #19
0
def test_lem_and_lnc_imply_one_another():
    kb = KnowledgeBase()

    lem = Proposition('''p v ~p''')
    lnc = Proposition('''~(p & ~p)''')

    kb.add_axiom(lem)
    kb.add_goal(lnc)

    assert kb.prove() == True
Пример #20
0
def test_lnc_conflicts_with_negated_lnc():
    """ You should *not* be able to derive a negation of a theorem (from itself)! """
    kb = KnowledgeBase()

    lnc = Proposition('''~(p & ~p)''')
    negated_lnc = Proposition('''~(~(p & ~p))''')

    kb.add_axiom(lnc)
    kb.add_goal(negated_lnc)

    assert kb.prove() == False
Пример #21
0
def test_constructive_dilemma():
    '''
    It is the inference that, if P implies Q and R implies S and either P or R is true, then Q or S has to be true.
    Source: https://en.wikipedia.org/wiki/Constructive_dilemma
    '''
    kb = KnowledgeBase()

    axioms = ['p -> q', 'r -> s', 'p v r']
    [kb.add_axiom(Proposition(statement)) for statement in axioms]
    kb.add_goal(Proposition('''q v s'''))

    assert kb.prove() == True
Пример #22
0
def test_medium_sized_kb():
    ''' https://www.ics.uci.edu/~welling/teaching/271fall09/HW6_sol.pdf '''
    kb = KnowledgeBase()

    axioms = [
        'a', 'b', 'c', '(a & b) -> d', '(b & d) -> f', 'f -> g',
        '(a & e) -> h', '(a & c) -> e'
    ]
    [kb.add_axiom(Proposition(statement)) for statement in axioms]
    kb.add_goal(Proposition('''h'''))

    assert kb.prove() == True
Пример #23
0
def test_anything_follows_from_a_contradiction():
    kb = KnowledgeBase()

    negated_lnc = Proposition('''~(~(p & ~p))''')
    kb.add_axiom(negated_lnc)
    kb.add_goal(Proposition('''z'''))

    kb2 = KnowledgeBase()

    kb2.add_axiom(negated_lnc)
    kb2.add_goal(Proposition('''~r -> s'''))

    assert (kb.prove() == True and kb2.prove() == True)
Пример #24
0
def test_minimal_kb_proof():
    kb = KnowledgeBase()

    pq = Proposition('''p v q''')
    pr = Proposition('''p -> r''')
    qr = Proposition('''q -> r''')

    kb.add_axiom(pq)
    kb.add_axiom(pr)
    kb.add_axiom(qr)

    r = Proposition('''r''')
    kb.add_goal(r)
    conclusion = kb.prove()
    assert conclusion == True
Пример #25
0
def test_cc_for_biconditional_introduction():
    kb = KnowledgeBase()

    axioms = ['e -> f', 'f -> e']
    [kb.add_axiom(Proposition(statement)) for statement in axioms]
    kb.add_goal(Proposition('''e <-> f'''))

    p = kb.prove(return_proof=True)
    cc = {
        frozenset({'e', 'f'}),
        frozenset({'e', '~f'}),
        frozenset({'~e', '~f'}),
        frozenset({'f', '~e'})
    }

    assert p.clause_collection == cc
Пример #26
0
def test_unsatisfiable_clause_collection():
    ''' http://intrologic.stanford.edu/exercises/exercise_05_03.html '''
    goal_as_prop = Proposition('''p v q''')
    goal = group_cnf(cnf(expressify(goal_as_prop)))

    negated_goal_as_prop = Proposition('''!(p v q)''')
    negated_goal = group_cnf(cnf(expressify(negated_goal_as_prop)))

    c1, c2, c3, c4 = goal[0], {'~p', 'r'}, {'~p', '~r'}, {'p', '~q'}

    goal = c1
    unsatisfiable = Proof(goal,
                          negated_goal,
                          clause_collection=[c1, c2, c3, c4])
    # If a contradiction (empty clause) is found, the set of clauses is unsatisfiable
    assert unsatisfiable.find() == True
Пример #27
0
def test_lem_is_theorem():
    kb = KnowledgeBase()

    lem = Proposition('''p v ~p''')
    kb.add_axiom(lem)
    kb.add_goal(lem)

    assert kb.prove() == True
Пример #28
0
def test_lnc_is_theorem():
    kb = KnowledgeBase()

    lnc = Proposition('''~(p & ~p)''')

    kb.add_axiom(lnc)
    kb.add_goal(lnc)

    assert kb.prove() == True
Пример #29
0
def test_negated_lnc():
    prop = Proposition('''~(~(p and ~p))''')
    assert prop.is_contradiction() == True
Пример #30
0
def test_negated_lem():
    prop = Proposition('''~(p or ~p)''')
    assert prop.is_contradiction() == True