Zebra puzzle: Difference between revisions

Content added Content deleted
m (→‎General solver with relational algebra: update to stricter typing)
Line 6,993: Line 6,993:
A general solver for this type of puzzle, using relational algebra. This solver can also be used for "Dinesman's multiple-dwelling problem"
A general solver for this type of puzzle, using relational algebra. This solver can also be used for "Dinesman's multiple-dwelling problem"
<lang tailspin>
<lang tailspin>
processor EinsteinSolver
// There are five houses.
// The English man lives in the red house.
// The Swede has a dog.
// The Dane drinks tea.
// The green house is immediately to the left of the white house.
// They drink coffee in the green house.
// The man who smokes Pall Mall has birds.
// In the yellow house they smoke Dunhill.
// In the middle house they drink milk.
// The Norwegian lives in the first house.
// The man who smokes Blend lives in the house next to the house with cats.
// In a house next to the house where they have a horse, they smoke Dunhill.
// The man who smokes Blue Master drinks beer.
// The German smokes Prince.
// The Norwegian lives next to the blue house.
// They drink water in a house next to the house where they smoke Blend.
//
// The question is, who owns the zebra?
//
//Additionally, list the solution for all the houses.
//Optionally, show the solution is unique.

data ES_temp__ <"1">

processor EinsteinSolver
@: [{|{}|}]; // A list of possible relations, start with one relation with an empty tuple
@: [{|{}|}]; // A list of possible relations, start with one relation with an empty tuple
$ -> \(
$ -> \(
Line 7,038: Line 7,014:


operator (a nextTo&{byField:, bMinusA:} b)
operator (a nextTo&{byField:, bMinusA:} b)
data ES_temp__ <"1"> local
@EinsteinSolver: [$@EinsteinSolver... -> \(
@EinsteinSolver: [$@EinsteinSolver... -> \(
def in: $;
def in: $;