Source: http://www-inf.telecom-sudparis.eu/cours/CSC4002/ChapEns/qlangc-chapens.pdf