fun isRelatedTo(a, b, []) = false | isRelatedTo(a, b, (h1, h2)::rest) = (a = h1 andalso b = h2) orelse isRelatedTo(a, b, rest); datatype city = Vancouver | LosAngeles | Mexico | Denver | Omaha | KansasCity | Minneapolis | StLouis | Memphis | NewOrleans | Chicago | Cincinnati | Pittsburgh | Montreal | NewYork; datatype river = Missouri | Platte | NPlatte | SPlatte | Arkansas | Canadian | Kansas | Mississippi | Tennessee | Ohio | Allegheny | Monongahela; val isOnRiver = [(Denver, SPlatte), (Omaha, Missouri), (Omaha, Platte), (KansasCity, Missouri), (KansasCity, Kansas), (Minneapolis, Mississippi), (StLouis, Mississippi), (StLouis, Missouri), (Memphis, Mississippi), (NewOrleans, Mississippi), (Cincinnati, Ohio), (Pittsburgh, Ohio), (Pittsburgh, Allegheny), (Pittsburgh, Monongahela)]; val flowsInto = [(Platte, Missouri), (Kansas, Missouri), (Missouri, Mississippi), (Canadian, Arkansas), (Arkansas, Mississippi), (Allegheny, Ohio), (Monongahela, Ohio), (Tennessee, Ohio), (Ohio, Mississippi), (NPlatte, Platte), (SPlatte, Platte)]; datatype Tribe = Asher | Naphtali | Zebulun | Issachar | Dan | Gad | Manasseh | Reuben | Ephraim | Benjamin | Judah | Simeon; datatype WaterBody = Mediterranean | Dead | Jordan | Chinnereth | Arnon | Jabbok; val tribeBordersWater = [(Asher, Mediterranean), (Manasseh, Mediterranean), (Ephraim, Mediterranean), (Naphtali, Chinnereth), (Naphtali, Jordan), (Issachar, Jordan), (Manasseh, Jordan), (Gad, Jordan), (Benjamin, Jordan), (Judah, Jordan), (Reuben, Jordan), (Judah, Dead), (Reuben, Dead), (Simeon, Dead), (Gad, Jabbok), (Reuben, Jabbok), (Reuben, Arnon)]; val waterImmedWestOf = [(Mediterranean, Chinnereth), (Mediterranean, Jordan), (Mediterranean, Dead), (Chinnereth, Jabbok), (Chinnereth, Arnon), (Jordan, Jabbok), (Jordan, Arnon), (Dead, Jabbok), (Dead, Arnon)];