(** People of Middle Earth **) type person = (* A Hobbit: its name and its size (in cm). *) | Hobbit of string * int (* A dwarf: its name and its age *) | Dwarf of string * int (* An elf: its name and its home region. *) | Elf of string * region (* Region of elves *) and region = Lorien | Imladris | Mirkwood (* This list of people can be used to test functions *) let people1 = [ Elf ("Amdir", Mirkwood) ; Elf ("Legolas", Mirkwood) ; Dwarf ("Thorin", 144) ; Hobbit ("Drogo", 98) ; Dwarf ("Oin", 134) ; Dwarf ("Bofur", 134) ; Hobbit ("Filibert", 106) ; Elf ("Arwen", Imladris) ; Elf ("Celebrian", Imladris) ; Dwarf ("Nori", 92) ; Dwarf ("Bombur", 140) ; Dwarf ("Fili", 92) ; Elf ("Lindir", Imladris) ; Dwarf ("Gloin", 140) ; Dwarf ("Bifur", 110) ; Dwarf ("Kili", 92) ; Dwarf ("Balin", 180) ; Elf ("Galathil", Lorien) ; Hobbit ("Adamanta", 104) ; Elf ("Tauriel", Mirkwood) ; Hobbit ("Rosa", 106) ; Dwarf ("Dwalin", 124) ; Hobbit ("Sam", 106) ; Elf ("Elladan", Imladris) ; Elf ("Gildor", Imladris) ; Hobbit ("Doderic", 82) ; Elf ("Galadriel", Lorien) ; Elf ("Oropher", Mirkwood) ; Hobbit ("Bill", 104) ; Hobbit ("Pippin", 121) ; Dwarf ("Ori", 116) ; Dwarf ("Dori", 124) ; Hobbit ("Bilbo", 102) ; Elf ("Thranduil", Mirkwood) ; Elf ("Celeborn", Lorien) ; Elf ("Orophin", Lorien) ; Elf ("Elrond", Imladris) ; Hobbit ("Gorbulas", 98) ; Elf ("Haldir", Lorien) ; Hobbit ("Merry", 121) ; Hobbit ("Frodo", 109) ] (* This type is used in the last questions. *) type 'a room = { (* Each room has a guard. *) guard: person ; (* Room tag. *) tag: 'a ; (* There can be at most two ways out of a room, to other rooms. *) out1: 'a room option ; out2: 'a room option ; } (* Rooms form a kind of labyrinth, with no cycle (it is actually a tree). *)