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

puzzle = puzzlepedia.parse("""
name in {Beth, Charles, David, Frank, Jessica, Karen, Taylor}
occupation in {orn, paleo, radio, seismo, toxic, vulcano, zoo}
horoscope in {Aquarius, Gemini, Libra, Pisces, Scorpio, Taurus, Virgo}
rooms in {Library, Lounge*2, Big, Small, Sitting, Outdoors}
crime in {guilty, innocent*6}

first_floor = [Lounge, Library]
second_floor = [Small, Big, Sitting]

#1: Setup occupation.

#2: Setup horoscopes.

#3a:
Taylor != Pisces
Taylor == Outdoors
{Library, Sitting} == {seismo, Virgo}
Seismo != Virgo

#4:
{toxic, vulcano, zoo} == {Aquarius, Pisces, Scorpio}

#5:
{Charles, Gemini, Taurus} == {Big, Small, Sitting}
{Charles} != {Gemini, Taurus}

#6:
vulcano != sitting
paleo != guilty

#7: First floor is guilty. Second floor isn't.
Lounge.guilty or Library.guilty

#8:
orn != small
taurus != small

#9:
Beth == Lounge
Beth != Libra
Libra == Lounge
Beth != guilty
Libra != guilty
Beth != Aquarius

#10:
paleo != Libra
Jessica != Libra

#11:
David != library
David != Small
David != Outdoors
David != zoo
zoo != Outdoors
David != vulcano

#12:
Frank != vulcano
Beth != vulcano
Taylor != vulcano

#13:
Jessica != Aquarius
Jessica != Virgo
Jessica != Small
Small != Aquarius
Small != Virgo

#14:
Karen != seismo
Karen != vulcano

#15:
radio != Karen
radio != Library
Karen != Library
Taylor != Aquarius
""")

In [ ]: