Mastermind via Logic
In [ ]:
Copied!
from logic import *
from logic import *
In [ ]:
Copied!
colors = ["red", "blue", "green", "yellow"]
symbols = []
for i in range(4):
for color in colors:
symbols.append(Symbol(f"{color}{i}"))
colors = ["red", "blue", "green", "yellow"]
symbols = []
for i in range(4):
for color in colors:
symbols.append(Symbol(f"{color}{i}"))
In [ ]:
Copied!
knowledge = And()
knowledge = And()
In [ ]:
Copied!
# 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")
))
# 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")
))
In [ ]:
Copied!
# 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 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}"))
))
In [ ]:
Copied!
# 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"))
))
"""
knowledge.add(And(
Symbol("blue0"),
Symbol("red1"),
Symbol("green2"),
Symbol("yellow3")
))
# 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"))
))
"""
knowledge.add(And(
Symbol("blue0"),
Symbol("red1"),
Symbol("green2"),
Symbol("yellow3")
))
In [ ]:
Copied!
In [ ]:
Copied!
for symbol in symbols:
if model_check(knowledge, symbol):
print(symbol)
for symbol in symbols:
if model_check(knowledge, symbol):
print(symbol)