Below is the code we used in class.
In the cslab, it can also be found in /cslab/class/cs243/relatprop.ml
.
datatype Tribe = Asher | Naphtali | Zebulun | Issachar | Dan | Gad | Manasseh | Reuben | Ephraim | Benjamin | Judah | Simeon; datatype WaterBody = Mediterranean | Dead | Jordan | Chinnereth | Arnon | Jabbok; fun isElementOf(x, []) = false | isElementOf(x, y::rest) = if x = y then true else isElementOf(x, rest); fun isRelatedTo(a, b, relat) = isElementOf((a,b), relat); fun isTransitive(relation) = let fun testOnePair((a,b), []) = true | testOnePair((a,b), (c, d)::rest) = if b = c then isElementOf((a, d), relation) andalso testOnePair((a, b), rest) else testOnePair((a,b), rest); fun test([]) = true | test((a,b) :: rest) = testOnePair((a,b), relation) andalso test(rest); in test(relation) end; val waterWestOf = [(Mediterranean, Chinnereth), (Mediterranean, Jordan), (Mediterranean, Dead), (Mediterranean, Jabbok), (Mediterranean, Arnon), (Chinnereth, Jabbok), (Chinnereth, Arnon), (Jordan, Jabbok), (Jordan, Arnon), (Dead, Jabbok), (Dead, Arnon)]; fun counterTransitive(relation) = let fun testOnePair((a,b), []) = [] | testOnePair((a,b), (c, d)::rest) = if b = c then (if isElementOf((a, d), relation) then testOnePair((a,b), rest) else (a,d):: testOnePair((a,b), rest)) else testOnePair((a,b), rest); fun test([]) = [] | test((a,b) :: rest) = testOnePair((a,b), relation) @ test(rest); in test(relation) end; val waterImmedWestOf = [(Mediterranean, Chinnereth), (Mediterranean, Jordan), (Mediterranean, Dead), (Chinnereth, Jabbok), (Chinnereth, Arnon), (Jordan, Jabbok), (Jordan, Arnon), (Dead, Jabbok), (Dead, Arnon)]; val waterVerticalAlign = [(Chinnereth, Jordan), (Chinnereth, Dead), (Jordan, Chinnereth), (Jordan, Dead), (Dead, Chinnereth), (Dead, Jordan), (Jabbok, Arnon), (Arnon, Jabbok), (Mediterranean, Mediterranean)]; val wvaCorrected = makeNoRepeats(waterVerticalAlign @ counterTransitive(waterVerticalAlign)); fun makeNoRepeats([]) =[] | makeNoRepeats(a :: rest) = if isElementOf(a,rest) then makeNoRepeats(rest) else a::makeNoRepeats(rest);