concrete PizzaEng of Pizza = { flags language = en_US; param Num = Sg | Pl ; ToppingUse = ToppAdj | ToppPrep ; Speaker = User | System ; Length = Empty | NonEmpty ; lincat Order = { s : Str } ; Item = { s : Str } ; [Item] = { s : Speaker => Str; l : Length } ; Number, PizzaNumber, DrinkNumber = { s : Str; n : Num } ; Size, PizzaSize, DrinkSize = { s : Str } ; Toppings = { s : ToppingUse => Str } ; Topping = { s : Str } ; ListTopping = { s : Str } ; DrinkType = { s : Num => Str } ; printname cat Order = "What would you like to order?" ; ListItem = "What else would you like?" ; PizzaSize = "What size pizzas would you like?" ; PizzaNumber = "How many pizzas would you like?" ; Toppings = "What toppings would you like?" ; DrinkSize = "What size drinks would you like?" ; DrinkNumber = "How many drinks would you like?" ; DrinkType = "What type of drink would you like?" ; lin order is = { s = is.s!User } ; ConsItem x xs = { s = table { User => variants { x.s ++ "and" ++ xs.s!User; x.s }; System => case xs.l of { Empty => x.s ++ xs.s!System; NonEmpty => x.s ++ "and" ++ xs.s!System } }; l = NonEmpty } ; BaseItem = { s = table { User => "nothing" ++ variants { "else" ; [] } ++ variants { please; thanks }; System => [] }; l = Empty } ; pizza n s ts = { s = giveMe ++ variants { n.s ++ s.s ++ pizza_N.s!n.n ++ ts.s!ToppPrep ; n.s ++ s.s ++ ts.s!ToppAdj ++ pizza_N.s!n.n ; -- no size given: n.s ++ pizza_N.s!n.n ++ ts.s!ToppPrep; n.s ++ ts.s!ToppAdj ++ pizza_N.s!n.n; -- no toppings given n.s ++ s.s ++ pizza_N.s!n.n; -- no toppings or size given: n.s ++ pizza_N.s!n.n } ++ please } ; drink n s t = { s = giveMe ++ variants { n.s ++ s.s ++ t.s!n.n; n.s ++ t.s!n.n } ++ please } ; lin pizzaNumber n = n ; drinkNumber n = n ; lin num_1 = { s = variants { "one"; "a" }; n = Sg } ; num_2 = { s = "two"; n = Pl } ; num_3 = { s = "three"; n = Pl } ; num_4 = { s = "four"; n = Pl } ; num_5 = { s = "five"; n = Pl } ; lin pizzaSize s = s ; drinkSize s = s ; lin small = { s = "small" } ; medium = { s = "medium" } ; large = { s = "large" } ; lin cheese = { s = "cheese" } ; ham = { s = "ham" } ; pepperoni = { s = "pepperoni" } ; anchovies = { s = "anchovies" } ; mushrooms = { s = "mushrooms" } ; lin toppings ts = { s = table { ToppAdj => ts.s; ToppPrep => "with" ++ ts.s } }; BaseTopping t = { s = t.s } ; ConsTopping t ts = { s = t.s ++ variants { "and"; []} ++ ts.s } ; lin coke = coke_N ; beer = beer_N ; oper giveMe = variants { [] ; ["I want"]; ["I would like"]; ["give me"]; ["I want to order"]; ["I would like to order"]; ["I want to have"]; } ; please = variants { [] ; "please" } ; thanks = variants { [] ; "thanks"; ["thank you"] } ; pizza_N = regN "pizza" ; coke_N = variants { regN "coke"; regN ["coca cola"] } ; beer_N = regN "beer" ; regN : Str -> { s : Num => Str } = \x -> { s = table { Sg => x; Pl => x + "s" } } ; lincat Output = { s : Str } ; lin confirm o t = { s = ["Thank you for ordering"] ++ o.s!System ++ "." ++ ["Your order will be ready in"] ++ t.s ++ minute_N.s!t.n ++ "." } ; oper minute_N = regN "minute" ; }