-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmastermind.py
56 lines (48 loc) · 1.62 KB
/
mastermind.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
from logic import *
colors = ["red", "blue", "green", "yellow"]
symbols = []
for i in range(4):
for color in colors:
symbols.append(Symbol(f"{color}{i}"))
knowledge = And()
# Each color has a position.
for color in colors:
knowledge.add(Or(
Symbol(f"{color}0"),
Symbol(f"{color}1"),
Symbol(f"{color}2"),
Symbol(f"{color}3")
))
# Only one position per color.
for color in colors:
for i in range(4):
for j in range(4):
if i != j:
knowledge.add(Implication(
Symbol(f"{color}{i}"), Not(Symbol(f"{color}{j}"))
))
# Only one color per position.
for i in range(4):
for c1 in colors:
for c2 in colors:
if c1 != c2:
knowledge.add(Implication(
Symbol(f"{c1}{i}"), Not(Symbol(f"{c2}{i}"))
))
knowledge.add(Or(
And(Symbol("red0"), Symbol("blue1"), Not(Symbol("green2")), Not(Symbol("yellow3"))),
And(Symbol("red0"), Symbol("green2"), Not(Symbol("blue1")), Not(Symbol("yellow3"))),
And(Symbol("red0"), Symbol("yellow3"), Not(Symbol("blue1")), Not(Symbol("green2"))),
And(Symbol("blue1"), Symbol("green2"), Not(Symbol("red0")), Not(Symbol("yellow3"))),
And(Symbol("blue1"), Symbol("yellow3"), Not(Symbol("red0")), Not(Symbol("green2"))),
And(Symbol("green2"), Symbol("yellow3"), Not(Symbol("red0")), Not(Symbol("blue1")))
))
knowledge.add(And(
Not(Symbol("blue0")),
Not(Symbol("red1")),
Not(Symbol("green2")),
Not(Symbol("yellow3"))
))
for symbol in symbols:
if model_check(knowledge, symbol):
print(symbol)