In [2]:
import forge
from puzzle.puzzlepedia import puzzlepedia

puzzle = puzzlepedia.parse("""
name in {Beth, Charles, David, Frank, Jessica, Karen, Taylor}
city in {Abu_Dhabi, Beijing, Chennai, Manila, Seoul, Singapore, Tokyo}
occupation in {historian, investigator, journalist, knitter, linguist, magician, numismatist}
weeks_ago in {3, 3, 2, 2, 2, 1, 1}
crime in {innocent*6, guilty}

#1: Setup: Occupations, 1 thief.

#2: Setup: Locations.

#3:
{Charles, Frank, Karen} == {linguist, magician, numismatist}
all(Charles[w] == Frank[w] == Karen[w] for w in [1, 2, 3])

#4:
Chennai != knitter

#5:
magician != Beijing
numismatist != Beijing

#6:
{Manila} == {knitter, linguist, magician}
investigator != Seoul
investigator == innocent
all(investigator[w] == guilty[w] for w in [1, 2, 3])

#7:
Beth.weeks_ago > knitter.weeks_ago
Jessica.weeks_ago > historian.weeks_ago

#8:
all(Chennai[w] == Tokyo[w] for w in [1, 2, 3])

#9:
if Beth.innocent:
  Charles == Abu_Dhabi or Charles == Beijing

#10:
if Charles.innocent:
  David == Beijing or David == Chennai

#10:
if David.innocent:
  Frank == Chennai or Frank == Manila

#10:
if Frank.innocent:
  Jessica == Manila or Jessica == Seoul

#10:
if Jessica.innocent:
  Karen == Seoul or Karen == Singapore

#10:
if Karen.innocent:
  Taylor == Singapore or Taylor == Tokyo 

#10:
if Taylor.innocent:
  Beth == Tokyo or Beth == Abu_Dhabi
""")

In [ ]: