algorithm from FOLDOC