skip to main content
research-article
Open access

Flan: An Expressive and Efficient Datalog Compiler for Program Analysis

Published: 05 January 2024 Publication History

Abstract

Datalog has gained prominence in program analysis due to its expressiveness and ease of use. Its generic fixpoint resolution algorithm over relational domains simplifies the expression of many complex analyses. The performance and scalability issues of early Datalog approaches have been addressed by tools such as Soufflé through specialized code generation. Still, while pure Datalog is expressive enough to support a wide range of analyses, there is a growing need for extensions to accommodate increasingly complex analyses. This has led to the development of various extensions, such as Flix, Datafun, and Formulog, which enhance Datalog with features like arbitrary lattices and SMT constraints.
Most of these extensions recognize the need for full interoperability between Datalog and a full-fledged programming language, a functionality that high-performance systems like Soufflé lack. Specifically, in most cases, they construct languages from scratch with first-class Datalog support, allowing greater flexibility. However, this flexibility often comes at the cost of performance due to the conflicting requirements of prioritizing modularity and abstraction over efficiency. Consequently, achieving both flexibility and compilation to highly-performant specialized code poses a significant challenge.
In this work, we reconcile the competing demands of expressiveness and performance with Flan, a Datalog compiler fully embedded in Scala that leverages multi-stage programming to generate specialized code for enhanced performance. Our approach combines the flexibility of Flix with Soufflé’s performance, offering seamless integration with the host language that enables the addition of powerful extensions while generating specialized code for the entire computation. Flan’s simple operator interface allows the addition of an extensive set of features, including arbitrary aggregates, user-defined functions, and lattices, with multiple execution strategies such as binary and multi-way joins, supported by different indexing structures like specialized trees and hash tables, with minimal effort. We evaluate our system on a variety of benchmarks and compare it to established Datalog engines. Our results demonstrate competitive performance and speedups in the range of 1.4× to 12.5× compared to state-of-the-art systems for workloads of practical importance.

References

[1]
Christopher R. Aberger, Andrew Lamb, Susan Tu, Andres Nötzli, Kunle Olukotun, and Christopher Ré. 2017. EmptyHeaded: A Relational Engine for Graph Processing. ACM Trans. Database Syst., 42, 4 (2017), 20:1–20:44.
[2]
Supun Abeysinghe, Fei Wang, Grégory M. Essertel, and Tiark Rompf. 2023. Architecting Intermediate Layers for Efficient Composition of Data Management and Machine Learning Systems. CoRR, abs/2311.02781 (2023).
[3]
Serge Abiteboul, Richard Hull, and Victor Vianu. 1995. Foundations of Databases. Addison-Wesley. isbn:0-201-53771-0
[4]
Nicholas Allen, Bernhard Scholz, and Padmanabhan Krishnan. 2015. Staged Points-to Analysis for Large Code Bases. In CC (Lecture Notes in Computer Science, Vol. 9031). Springer, 131–150.
[5]
Nada Amin, William E. Byrd, and Tiark Rompf. 2019. Lightweight Functional Logic Meta-Programming. In APLAS (Lecture Notes in Computer Science, Vol. 11893). Springer, 225–243.
[6]
Lars Ole Andersen. 1994. Program analysis and specialization for the C programming language. Ph. D. Dissertation. Citeseer.
[7]
Tony Antoniadis, Konstantinos Triantafyllou, and Yannis Smaragdakis. 2017. Porting doop to Soufflé: a tale of inter-engine portability for Datalog-based analyses. In SOAP@PLDI. ACM, 25–30.
[8]
Samuel Arch, Xiaowen Hu, David Zhao, Pavle Subotic, and Bernhard Scholz. 2022. Building a Join Optimizer for Soufflé. In LOPSTR (Lecture Notes in Computer Science, Vol. 13474). Springer, 83–102.
[9]
Molham Aref, Balder ten Cate, Todd J. Green, Benny Kimelfeld, Dan Olteanu, Emir Pasalic, Todd L. Veldhuizen, and Geoffrey Washburn. 2015. Design and Implementation of the LogicBlox System. In SIGMOD Conference. ACM, 1371–1382.
[10]
Michael Arntzenius and Neel Krishnaswami. 2020. Seminaïve evaluation for a higher-order functional language. Proc. ACM Program. Lang., 4, POPL (2020), 22:1–22:28.
[11]
Michael Arntzenius and Neelakantan R. Krishnaswami. 2016. Datafun: a functional Datalog. In ICFP. ACM, 214–227.
[12]
Albert Atserias, Martin Grohe, and Dániel Marx. 2008. Size Bounds and Query Plans for Relational Joins. In FOCS. IEEE Computer Society, 739–748.
[13]
Aaron Bembenek, Michael Greenberg, and Stephen Chong. 2020. Formulog: Datalog for SMT-based static analysis. Proc. ACM Program. Lang., 4, OOPSLA (2020), 141:1–141:31.
[14]
William C. Benton and Charles N. Fischer. 2007. Interactive, scalable, declarative program analysis: from prototype to implementation. In PPDP. ACM, 13–24.
[15]
Jeff Bezanson, Alan Edelman, Stefan Karpinski, and Viral B. Shah. 2014. Julia: A Fresh Approach to Numerical Computing. CoRR, abs/1411.1607 (2014).
[16]
S. M. Blackburn, R. Garner, C. Hoffman, A. M. Khan, K. S. McKinley, R. Bentzur, A. Diwan, D. Feinberg, D. Frampton, S. Z. Guyer, M. Hirzel, A. Hosking, M. Jump, H. Lee, J. E. B. Moss, A. Phansalkar, D. Stefanović, T. VanDrunen, D. von Dincklage, and B. Wiedermann. 2006. The DaCapo Benchmarks: Java Benchmarking Development and Analysis. In OOPSLA ’06: Proceedings of the 21st annual ACM SIGPLAN conference on Object-Oriented Programing, Systems, Languages, and Applications. ACM Press, New York, NY, USA. 169–190. https://doi.org/10.1145/1167473.1167488
[17]
S. M. Blackburn, R. Garner, C. Hoffman, A. M. Khan, K. S. McKinley, R. Bentzur, A. Diwan, D. Feinberg, D. Frampton, S. Z. Guyer, M. Hirzel, A. Hosking, M. Jump, H. Lee, J. E. B. Moss, A. Phansalkar, D. Stefanović, T. VanDrunen, D. von Dincklage, and B. Wiedermann. 2006. The DaCapo Benchmarks: Java Benchmarking Development and Analysis (Extended Version). http://www.dacapobench.org
[18]
Ajay Brahmakshatriya and Saman P. Amarasinghe. 2021. BuildIt: A Type-Based Multi-stage Programming Framework for Code Generation in C++. In CGO. IEEE, 39–51.
[19]
Ajay Brahmakshatriya and Saman P. Amarasinghe. 2022. GraphIt to CUDA Compiler in 2021 LOC: A Case for High-Performance DSL Implementation via Staging with BuilDSL. In CGO. IEEE, 53–65.
[20]
Oliver Bračevac, Guannan Wei, Songlin Jia, Supun Abeysinghe, Yuxuan Jiang, Yuyan Bao, and Tiark Rompf. 2023. Graph IRs for Impure Higher-Order Languages: Making Aggressive Optimizations Affordable with Precise Effect Dependencies. Proc. ACM Program. Lang., 7, OOPSLA2 (2023), 236:1–236:31.
[21]
Martin Bravenboer and Yannis Smaragdakis. 2009. Strictly declarative specification of sophisticated points-to analyses. In OOPSLA. ACM, 243–262.
[22]
Ashok K. Chandra and David Harel. 1985. Horn Clauses Queries and Generalizations. J. Log. Program., 2, 1 (1985), 1–15.
[23]
Leonardo Mendonça de Moura and Nikolaj S. Bjørner. 2007. Efficient E-Matching for SMT Solvers. In CADE (Lecture Notes in Computer Science, Vol. 4603). Springer, 183–198.
[24]
Grégory M. Essertel, Ruby Y. Tahboub, James M. Decker, Kevin J. Brown, Kunle Olukotun, and Tiark Rompf. 2018. Flare: Optimizing Apache Spark with Native Compilation for Scale-Up Architectures and Medium-Size Data. In OSDI. USENIX Association, 799–815.
[25]
Grégory M. Essertel, Ruby Y. Tahboub, and Tiark Rompf. 2021. On-stack replacement for program generators and source-to-source compilers. In GPCE. ACM, 156–169.
[26]
Zhiwei Fan, Jianqiao Zhu, Zuyu Zhang, Aws Albarghouthi, Paraschos Koutris, and Jignesh M. Patel. 2019. Scaling-up in-Memory Datalog Processing: Observations and Techniques. Proc. VLDB Endow., 12, 6 (2019), Feb., 695–708. issn:2150-8097 https://doi.org/10.14778/3311880.3311886
[27]
Antonio Flores-Montoya and Eric M. Schulte. 2020. Datalog Disassembly. In USENIX Security Symposium. USENIX Association, 1075–1092.
[28]
Craig Freedman, Erik Ismert, and Per-Åke Larson. 2014. Compilation in the Microsoft SQL Server Hekaton Engine. IEEE Data Eng. Bull., 37, 1 (2014), 22–30.
[29]
Michael J. Freitag, Maximilian Bandle, Tobias Schmidt, Alfons Kemper, and Thomas Neumann. 2020. Adopting Worst-Case Optimal Joins in Relational Database Systems. Proc. VLDB Endow., 13, 11 (2020), 1891–1904.
[30]
Yoshihiko Futamura. 1971. Partial evaluation of computation process-an approach to a compiler-compiler. Systems, Computers, Controls, 25 (1971), 45–50.
[31]
Neville Grech, Lexi Brent, Bernhard Scholz, and Yannis Smaragdakis. 2019. Gigahorse: thorough, declarative decompilation of smart contracts. In ICSE. IEEE / ACM, 1176–1186.
[32]
Elnar Hajiyev, Mathieu Verbaere, and Oege de Moor. 2006. codeQuest: Scalable Source Code Queries with Datalog. In ECOOP (Lecture Notes in Computer Science, Vol. 4067). Springer, 2–27.
[33]
Julien Henry. 2022. User defined aggregate. https://github.com/souffle-lang/souffle/pull/2282/files
[34]
Krystof Hoder, Nikolaj S. Bjørner, and Leonardo Mendonça de Moura. 2011. μ Z- An Efficient Engine for Fixed Points with Constraints. In CAV (Lecture Notes in Computer Science, Vol. 6806). Springer, 457–462.
[35]
Neil D. Jones, Carsten K. Gomard, and Peter Sestoft. 1993. Partial evaluation and automatic program generation. Prentice Hall.
[36]
Herbert Jordan, Pavle Subotic, David Zhao, and Bernhard Scholz. 2019. Brie: A Specialized Trie for Concurrent Datalog. In PMAM@PPoPP. ACM, 31–40.
[37]
Herbert Jordan, Pavle Subotic, David Zhao, and Bernhard Scholz. 2019. A specialized B-tree for concurrent datalog evaluation. In PPoPP. ACM, 327–339.
[38]
Herbert Jordan, Pavle Subotic, David Zhao, and Bernhard Scholz. 2022. Specializing parallel data structures for Datalog. Concurr. Comput. Pract. Exp., 34, 2 (2022).
[39]
Eugene E. Kohlbecker, Daniel P. Friedman, Matthias Felleisen, and Bruce F. Duba. 1986. Hygienic Macro Expansion. In LISP and Functional Programming. ACM, 151–161.
[40]
Konstantinos Krikellas, Stratis Viglas, and Marcelo Cintra. 2010. Generating code for holistic query evaluation. In ICDE. IEEE Computer Society, 613–624.
[41]
Monica S. Lam, John Whaley, V. Benjamin Livshits, Michael C. Martin, Dzintars Avots, Michael Carbin, and Christopher Unkel. 2005. Context-sensitive program analysis as database queries. In PODS. ACM, 1–12.
[42]
Chris Lattner and Vikram Adve. 2004. LLVM: A Compilation Framework for Lifelong Program Analysis and Transformation. San Jose, CA, USA. 75–88.
[43]
Chris Lattner, Mehdi Amini, Uday Bondhugula, Albert Cohen, Andy Davis, Jacques Pienaar, River Riddle, Tatiana Shpeisman, Nicolas Vasilache, and Oleksandr Zinenko. 2021. MLIR: Scaling Compiler Infrastructure for Domain Specific Computation. In 2021 IEEE/ACM International Symposium on Code Generation and Optimization (CGO). 2–14. https://doi.org/10.1109/CGO51591.2021.9370308
[44]
Ondrej Lhoták and Kwok-Chiang Andrew Chung. 2011. Points-to analysis with efficient strong updates. In POPL. ACM, 3–16.
[45]
Boon Thau Loo, Tyson Condie, Minos N. Garofalakis, David E. Gay, Joseph M. Hellerstein, Petros Maniatis, Raghu Ramakrishnan, Timothy Roscoe, and Ion Stoica. 2006. Declarative networking: language, execution and optimization. In SIGMOD Conference. ACM, 97–108.
[46]
Magnus Madsen, Jonathan Starup, and Ondrej Lhoták. 2022. Flix: A Meta Programming Language for Datalog. In Datalog (CEUR Workshop Proceedings, Vol. 3203). CEUR-WS.org, 202–206.
[47]
Magnus Madsen, Ming-Ho Yee, and Ondrej Lhoták. 2016. From Datalog to flix: a declarative language for fixed points on lattices. In PLDI. ACM, 194–208.
[48]
Frank McSherry, Michael Isard, and Derek Gordon Murray. 2015. Scalability! But at what COST? In HotOS. USENIX Association.
[49]
Frank McSherry, Derek Gordon Murray, Rebecca Isaacs, and Michael Isard. 2013. Differential Dataflow. In CIDR. www.cidrdb.org.
[50]
Dan Moldovan, James M. Decker, Fei Wang, Andrew A. Johnson, Brian K. Lee, Zachary Nado, D. Sculley, Tiark Rompf, and Alexander B. Wiltschko. 2019. AutoGraph: Imperative-style Coding with Graph-based Performance. In MLSys. mlsys.org.
[51]
Thomas Neumann. 2011. Efficiently Compiling Efficient Query Plans for Modern Hardware. Proc. VLDB Endow., 4, 9 (2011), 539–550.
[52]
Hung Q. Ngo, Ely Porat, Christopher Ré, and Atri Rudra. 2018. Worst-case Optimal Join Algorithms. J. ACM, 65, 3 (2018), 16:1–16:40.
[53]
Hung Q. Ngo, Christopher Ré, and Atri Rudra. 2013. Skew strikes back: new developments in the theory of join algorithms. SIGMOD Rec., 42, 4 (2013), 5–16.
[54]
André Pacak and Sebastian Erdweg. 2022. Functional Programming with Datalog. In ECOOP (LIPIcs, Vol. 222). Schloss Dagstuhl - Leibniz-Zentrum für Informatik, 7:1–7:28.
[55]
Jignesh M. Patel, Harshad Deshmukh, Jianqiao Zhu, Navneet Potti, Zuyu Zhang, Marc Spehlmann, Hakan Memisoglu, and Saket Saurabh. 2018. Quickstep: A Data Platform Based on the Scaling-Up Approach. Proc. VLDB Endow., 11, 6 (2018), 663–676.
[56]
Rayon. 2022. Rayon: A data parallelism library for Rust. https://github.com/rayon-rs/rayon
[57]
Thomas W. Reps. 1994. Solving Demand Versions of Interprocedural Analysis Problems. In CC (Lecture Notes in Computer Science, Vol. 786). Springer, 389–403.
[58]
Thomas W. Reps, Susan Horwitz, and Shmuel Sagiv. 1995. Precise Interprocedural Dataflow Analysis via Graph Reachability. In POPL. ACM Press, 49–61.
[59]
Tiark Rompf and Nada Amin. 2015. Functional pearl: a SQL to C compiler in 500 lines of code. In ICFP. ACM, 2–9.
[60]
Tiark Rompf and Nada Amin. 2019. A SQL to C compiler in 500 lines of code. J. Funct. Program., 29 (2019), e9.
[61]
Tiark Rompf, Nada Amin, Adriaan Moors, Philipp Haller, and Martin Odersky. 2012. Scala-Virtualized: linguistic reuse for deep embeddings. High. Order Symb. Comput., 25, 1 (2012), 165–207.
[62]
Tiark Rompf and Martin Odersky. 2010. Lightweight modular staging: a pragmatic approach to runtime code generation and compiled DSLs. In GPCE. ACM, 127–136.
[63]
Tiark Rompf, Arvind K. Sujeeth, Nada Amin, Kevin J. Brown, Vojin Jovanovic, HyoukJoong Lee, Manohar Jonnalagedda, Kunle Olukotun, and Martin Odersky. 2013. Optimizing data structures in high-level programs: new directions for extensible compilers based on staging. In POPL. ACM, 497–510.
[64]
Leonid Ryzhyk and Mihai Budiu. 2019. Differential Datalog. In Datalog (CEUR Workshop Proceedings, Vol. 2368). CEUR-WS.org, 56–67.
[65]
Shmuel Sagiv, Thomas W. Reps, and Susan Horwitz. 1996. Precise Interprocedural Dataflow Analysis with Applications to Constant Propagation. Theor. Comput. Sci., 167, 1&2 (1996), 131–170.
[66]
Arash Sahebolamri, Langston Barrett, Scott Moore, and Kristopher Micinski. 2023. Bring Your Own Data Structures to Datalog. Proc. ACM Program. Lang., 7, OOPSLA2 (2023), 264:1–264:26.
[67]
Arash Sahebolamri, Thomas Gilray, and Kristopher K. Micinski. 2022. Seamless deductive inference via macros. In CC. ACM, 77–88.
[68]
Bernhard Scholz, Herbert Jordan, Pavle Subotic, and Till Westmann. 2016. On fast large-scale program analysis in Datalog. In CC. ACM, 196–206.
[69]
Bernhard Scholz, Kostyantyn Vorobyov, Padmanabhan Krishnan, and Till Westmann. 2015. A Datalog Source-to-Source Translator for Static Program Analysis: An Experience Report. In ASWEC. IEEE Computer Society, 28–37.
[70]
Jiwon Seo, Stephen Guo, and Monica S. Lam. 2015. SociaLite: An Efficient Graph Query Language Based on Datalog. IEEE Trans. Knowl. Data Eng., 27, 7 (2015), 1824–1837.
[71]
Amir Shaikhha, Yannis Klonatos, Lionel Parreaux, Lewis Brown, Mohammad Dashti, and Christoph Koch. 2016. How to Architect a Query Compiler. In SIGMOD Conference. ACM, 1907–1922.
[72]
Alexander Shkapsky, Mohan Yang, Matteo Interlandi, Hsuan Chiu, Tyson Condie, and Carlo Zaniolo. 2016. Big Data Analytics with Datalog Queries on Spark. In SIGMOD Conference. ACM, 1135–1149.
[73]
Yannis Smaragdakis and George Balatsouras. 2015. Pointer Analysis. Found. Trends Program. Lang., 2, 1 (2015), 1–69.
[74]
Yannis Smaragdakis and Martin Bravenboer. 2010. Using Datalog for Fast and Easy Program Analysis. In Datalog (Lecture Notes in Computer Science, Vol. 6702). Springer, 245–251.
[75]
Pavle Subotic, Herbert Jordan, Lijun Chang, Alan D. Fekete, and Bernhard Scholz. 2018. Automatic Index Selection for Large-Scale Datalog Computation. Proc. VLDB Endow., 12, 2 (2018), 141–153.
[76]
Tamás Szabó, Gábor Bergmann, Sebastian Erdweg, and Markus Voelter. 2018. Incrementalizing lattice-based program analyses in Datalog. Proc. ACM Program. Lang., 2, OOPSLA (2018), 139:1–139:29.
[77]
Tamás Szabó, Sebastian Erdweg, and Markus Voelter. 2016. IncA: a DSL for the definition of incremental program analyses. In ASE. ACM, 320–331.
[78]
Tamás Szabó, Markus Voelter, and Sebastian Erdweg. 2017. IncAL: A DSL for Incremental Program Analysis with Lattices. In Proceedings of the International Workshop on Incremental Computing (IC).
[79]
Walid Taha and Tim Sheard. 1997. Multi-Stage Programming with Explicit Annotations. In PEPM. ACM, 203–217.
[80]
Ruby Y. Tahboub, Grégory M. Essertel, and Tiark Rompf. 2018. How to Architect a Query Compiler, Revisited. In SIGMOD Conference. ACM, 307–322.
[81]
Luc Tielen. 2023. Eclair-lang. https://github.com/luc-tielen/eclair-lang
[82]
Jeffrey D. Ullman. 1988. Principles of Database and Knowledge-Base Systems, Volume I (Principles of computer science series, Vol. 14). Computer Science Press.
[83]
Jeffrey D. Ullman. 1989. Principles of Database and Knowledge-Base Systems, Volume II. Computer Science Press.
[84]
Todd L. Veldhuizen. 2014. Triejoin: A Simple, Worst-Case Optimal Join Algorithm. In ICDT. OpenProceedings.org, 96–106.
[85]
Jodat Vu. 2011. The art of multiprocessor programming by Maurice Herlihy and Nir Shavit. ACM SIGSOFT Softw. Eng. Notes, 36, 5 (2011), 52–53.
[86]
Yisu Remy Wang, Max Willsey, and Dan Suciu. 2023. Free Join: Unifying Worst-Case Optimal and Traditional Joins. Proc. ACM Manag. Data, 1, 2 (2023), 150:1–150:23.
[87]
Guannan Wei, Oliver Bracevac, Shangyin Tan, and Tiark Rompf. 2020. Compiling symbolic execution with staging and algebraic effects. Proc. ACM Program. Lang., 4, OOPSLA (2020), 164:1–164:33.
[88]
Guannan Wei, Yuxuan Chen, and Tiark Rompf. 2019. Staged abstract interpreters: fast and modular whole-program analysis via meta-programming. Proc. ACM Program. Lang., 3, OOPSLA (2019), 126:1–126:32.
[89]
Guannan Wei, Songlin Jia, Ruiqi Gao, Haotian Deng, Shangyin Tan, Oliver Bracevac, and Tiark Rompf. 2023. Compiling Parallel Symbolic Execution with Continuations. In ICSE. IEEE, 1316–1328.
[90]
Joel Wejdenstål. 2022. DashMap. https://github.com/xacrimon/dashmap
[91]
John Whaley, Dzintars Avots, Michael Carbin, and Monica S. Lam. 2005. Using Datalog with Binary Decision Diagrams for Program Analysis. In APLAS (Lecture Notes in Computer Science, Vol. 3780). Springer, 97–118.
[92]
John Whaley and Monica S. Lam. 2004. Cloning-based context-sensitive pointer alias analysis using binary decision diagrams. In PLDI. ACM, 131–144.
[93]
Max Willsey, Chandrakana Nandi, Yisu Remy Wang, Oliver Flatt, Zachary Tatlock, and Pavel Panchekha. 2021. egg: Fast and extensible equality saturation. Proc. ACM Program. Lang., 5, POPL (2021), 1–29.
[94]
Eric Zhang. 2020. ekzhang/crepe: Datalog compiler embedded in Rust as a procedural macro. https://github.com/ekzhang/crepe
[95]
Yihong Zhang, Yisu Remy Wang, Oliver Flatt, David Cao, Philip Zucker, Eli Rosenthal, Zachary Tatlock, and Max Willsey. 2023. Better Together: Unifying Datalog and Equality Saturation. CoRR, abs/2304.04332 (2023).
[96]
Yihong Zhang, Yisu Remy Wang, Max Willsey, and Zachary Tatlock. 2022. Relational e-matching. Proc. ACM Program. Lang., 6, POPL (2022), 1–22.
[97]
David Zhao, Pavle Subotic, Mukund Raghothaman, and Bernhard Scholz. 2021. Towards Elastic Incrementalization for Datalog. In PPDP. ACM, 20:1–20:16.
[98]
David Zhao, Pavle Subotic, and Bernhard Scholz. 2020. Debugging Large-scale Datalog: A Scalable Provenance Evaluation Strategy. ACM Trans. Program. Lang. Syst., 42, 2 (2020), 7:1–7:35.
[99]
Philip Zucker. 2022. Logging an Egg: Datalog on E-Graphs. EGRAPHS 2022. 1–6.

Cited By

View all

Recommendations

Comments

Information & Contributors

Information

Published In

cover image Proceedings of the ACM on Programming Languages
Proceedings of the ACM on Programming Languages  Volume 8, Issue POPL
January 2024
2820 pages
EISSN:2475-1421
DOI:10.1145/3554315
Issue’s Table of Contents
This work is licensed under a Creative Commons Attribution 4.0 International License.

Publisher

Association for Computing Machinery

New York, NY, United States

Publication History

Published: 05 January 2024
Published in PACMPL Volume 8, Issue POPL

Permissions

Request permissions for this article.

Check for updates

Author Tags

  1. Datalog
  2. Generative Programming
  3. Logic Programming
  4. Program Analysis

Qualifiers

  • Research-article

Funding Sources

Contributors

Other Metrics

Bibliometrics & Citations

Bibliometrics

Article Metrics

  • Downloads (Last 12 months)802
  • Downloads (Last 6 weeks)86
Reflects downloads up to 27 Dec 2024

Other Metrics

Citations

Cited By

View all

View Options

View options

PDF

View or Download as a PDF file.

PDF

eReader

View online with eReader.

eReader

Login options

Full Access

Media

Figures

Other

Tables

Share

Share

Share this Publication link

Share on social media