Functional Dependency Detection: An Information Theoretic Algorithm