In this paper we study the relationships between logic programming and functional programming, trying to answer the following basic question: to what extent is logic programming just functional programming in disguise? We develop a theory to formally express this correspondence, and exhibit a class that can by right be considered as the functional core of logic programming. Moreover, since the functional meaning of each program in this class is provided constructively, via a transformation from logic to functional programs, we show how the obtained theoretical results are useful also in the study of languages integration, termination issues, and practical implementations.