cnf(truthteller_or_liar,axiom,
    ( a_truth(truthteller(X))
    | a_truth(liar(X)) ) ).

cnf(not_both,axiom,
    ( ~ a_truth(truthteller(X))
    | ~ a_truth(liar(X)) ) ).

cnf(truthtellers_tell_truth,axiom,
    ( ~ a_truth(truthteller(Truthteller))
    | ~ a_truth(says(Truthteller,Statement))
    | a_truth(Statement) ) ).

cnf(liars_lie,axiom,
    ( ~ a_truth(liar(Liar))
    | ~ a_truth(says(Liar,Statement))
    | ~ a_truth(Statement) ) ).

cnf(truths_are_told_by_truthtellers,axiom,
    ( ~ a_truth(Statement)
    | ~ a_truth(says(Truthteller,Statement))
    | a_truth(truthteller(Truthteller)) ) ).

cnf(liars_are_told_by_liars,axiom,
    ( a_truth(Statement)
    | ~ a_truth(says(Liar,Statement))
    | a_truth(liar(Liar)) ) ).

cnf(a_mumbles,hypothesis,
    a_truth(says(a,mumble)) ).

cnf(b_says_a_says_hes_a_liar,hypothesis,
    a_truth(says(b,says(a,liar(a)))) ).

cnf(c_says_b_is_a_liar,hypothesis,
    a_truth(says(c,liar(b))) ).

cnf(prove_c_is_a_truthteller,negated_conjecture,
    ~ a_truth(truthteller(c)) ).
