-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpuzzle.py
105 lines (88 loc) · 3.04 KB
/
puzzle.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
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(
# information about the structure of the problem itself
Or(AKnight, AKnave),
Not(And(AKnight, AKnave)),
# information about what the characters actually said
Implication(AKnight, And(AKnight, AKnave)),
Implication(AKnave, Not(And(AKnight, AKnave)))
)
# Puzzle 1
# A says "We are both knaves."
# B says nothing.
knowledge1 = And(
# information about the structure of the problem itself
Or(AKnight, AKnave),
Not(And(AKnight, AKnave)),
Or(BKnight, BKnave),
Not(And(BKnight, BKnave)),
# information about what the characters actually said
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(
# information about the structure of the problem itself
Or(AKnight, AKnave),
Not(And(AKnight, AKnave)),
Or(BKnight, BKnave),
Not(And(BKnight, BKnave)),
# information about what the characters actually said
Implication(AKnight, Or(And(AKnight, BKnight), And(AKnave, BKnave))),
Implication(AKnave, Not(Or(And(AKnight, BKnight), And(AKnave, BKnave)))),
Implication(BKnight, Or(And(AKnight, BKnave), And(AKnave, BKnight))),
Implication(BKnave, Not(Or(And(AKnight, BKnave), And(AKnave, BKnight))))
)
# 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(
# information about the structure of the problem itself
Or(AKnight, AKnave),
Not(And(AKnight, AKnave)),
Or(BKnight, BKnave),
Not(And(BKnight, BKnave)),
Or(CKnight, CKnave),
Not(And(CKnight, CKnave)),
# information about what the characters actually said
Implication(AKnight, Or(AKnight, AKnave)),
Implication(AKnave, Not(Or(AKnight, AKnave))),
Implication(CKnight, AKnight),
Implication(CKnave, Not(AKnight)),
Implication(BKnight, CKnave),
Implication(BKnave, Not(CKnave)),
Implication(And(BKnight, AKnight), AKnave),
Implication(And(BKnight, AKnave), Not(AKnave)),
Implication(And(BKnave, AKnight), Not(AKnave)),
Implication(And(BKnave, AKnave), AKnave)
)
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()