  Data-driven approaches are becoming more common as problem-solving techniques
in many areas of research and industry. In most cases, machine learning models
are the key component of these solutions, but a solution involves multiple such
models, along with significant levels of reasoning with the models' output and
input. Current technologies do not make such techniques easy to use for
application experts who are not fluent in machine learning nor for machine
learning experts who aim at testing ideas and models on real-world data in the
context of the overall AI system. We review key efforts made by various AI
communities to provide languages for high-level abstractions over learning and
reasoning techniques needed for designing complex AI systems. We classify the
existing frameworks based on the type of techniques and the data and knowledge
representations they use, provide a comparative study of the way they address
the challenges of programming real-world applications, and highlight some
shortcomings and future directions.
