Chapter 1 Generic programming for domain reasoners