from logic import * AKnight = Symbol("A is a Knight") AKnave = Symbol("A is a Knave") BKnight = Symbol("B is a Knight") BKnave = Symbol("B is a Knave") CKnight = Symbol("C is a Knight") CKnave = Symbol("C is a Knave") # Puzzle 0 # A says "I am both a knight and a knave." knowledge0 = And( Not(And(AKnave, AKnight)), Or(AKnave, AKnight), Implication(AKnight, And(AKnave, AKnight)) ) # Puzzle 1 # A says "We are both knaves." # B says nothing. knowledge1 = And( Not(And(AKnave, AKnight)), Or(AKnave, AKnight), Not(And(BKnave, BKnight)), Or(BKnave, BKnight), Implication(AKnight, And(AKnave, BKnave)), Implication(AKnave, Not(And(AKnave, BKnave))) ) # Puzzle 2 # A says "We are the same kind." # B says "We are of different kinds." knowledge2 = And( Not(And(AKnave, AKnight)), Or(AKnave, AKnight), Not(And(BKnave, BKnight)), Or(BKnave, BKnight), Implication(AKnight, And(AKnight, BKnight)), Implication(BKnave, And(AKnight, BKnight)), Implication(BKnight, And(Not(And(BKnight, AKnight)), Not(And(BKnave, AKnave)))) ) # Puzzle 3 # A says either "I am a knight." or "I am a knave.", but you don't know which. # B says "A said 'I am a knave'." # B says "C is a knave." # C says "A is a knight." knowledge3 = And( Not(And(AKnave, AKnight)), Or(AKnave, AKnight), Not(And(BKnave, BKnight)), Or(BKnave, BKnight), Not(And(CKnave, CKnight)), Or(CKnave, CKnight), Implication(AKnave, AKnight), Biconditional(AKnave, BKnight), Biconditional(BKnave, CKnight), Biconditional(AKnight, CKnight) ) def main(): symbols = [AKnight, AKnave, BKnight, BKnave, CKnight, CKnave] puzzles = [ ("Puzzle 0", knowledge0), ("Puzzle 1", knowledge1), ("Puzzle 2", knowledge2), ("Puzzle 3", knowledge3) ] for puzzle, knowledge in puzzles: print(puzzle) if len(knowledge.conjuncts) == 0: print(" Not yet implemented.") else: for symbol in symbols: if model_check(knowledge, symbol): print(f" {symbol}") if __name__ == "__main__": main()