Hostname: page-component-cd9895bd7-gvvz8 Total loading time: 0 Render date: 2024-12-17T22:23:18.910Z Has data issue: false hasContentIssue false

How to Build Your Own ASP-based System?!

Published online by Cambridge University Press:  13 December 2021

ROLAND KAMINSKI
Affiliation:
University of Potsdam, Potsdam, Germany (e-mails: [email protected], [email protected], [email protected], [email protected])
JAVIER ROMERO
Affiliation:
University of Potsdam, Potsdam, Germany (e-mails: [email protected], [email protected], [email protected], [email protected])
TORSTEN SCHAUB
Affiliation:
University of Potsdam, Potsdam, Germany (e-mails: [email protected], [email protected], [email protected], [email protected])
PHILIPP WANKO
Affiliation:
University of Potsdam, Potsdam, Germany (e-mails: [email protected], [email protected], [email protected], [email protected])
Rights & Permissions [Opens in a new window]

Abstract

Core share and HTML view are not available for this content. However, as you have access to this content, a full PDF is available via the ‘Save PDF’ action button.

Answer Set Programming, or ASP for short, has become a popular and sophisticated approach to declarative problem solving. Its popularity is due to its attractive modeling-grounding-solving workflow that provides an easy approach to problem solving, even for laypersons outside computer science. However, in contrast to ASP’s ease of use, the high degree of sophistication of the underlying technology makes it even hard for ASP experts to put ideas into practice whenever this involves modifying ASP’s machinery. For addressing this issue, this tutorial aims at enabling users to build their own ASP-based systems. More precisely, we show how the ASP system clingo can be used for extending ASP and for implementing customized special-purpose systems. To this end, we propose two alternatives. We begin with a traditional AI technique and show how metaprogramming can be used for extending ASP. This is a rather light approach that relies on clingo’s reification feature to use ASP itself for expressing new functionalities. The second part of this tutorial uses traditional programming (in Python) for manipulating clingo via its application programming interface. This approach allows for changing and controlling the entire model-ground-solve workflow of ASP. Central to this is clingo’s new Application class that allows us to draw on clingo’s infrastructure by customizing processes similar to the one in clingo. For instance, we may apply manipulations to programs’ abstract syntax trees, control various forms of multi-shot solving, and set up theory propagators for foreign inferences. A cross-sectional structure, spanning meta as well as application programming, is clingo’s intermediate format, aspif, that specifies the interface among the underlying grounder and solver. We illustrate the aforementioned concepts and techniques throughout this tutorial by means of examples and several nontrivial case studies. In particular, we show how clingo can be extended by difference constraints and how guess-and-check programming can be implemented with both meta and application programming.

Type
Survey Article
Creative Commons
Creative Common License - CCCreative Common License - BY
This is an Open Access article, distributed under the terms of the Creative Commons Attribution licence (http://creativecommons.org/licenses/by/4.0/), which permits unrestricted re-use, distribution, and reproduction, provided the original article is properly cited.
Copyright
© The Author(s), 2021. Published by Cambridge University Press

Footnotes

*

This work was partially funded by DFG grants SCHA 550/11 and 15. We are grateful to the anonymous reviewers and in particular to Mirosław Truszczyński for his relentless efforts to improve the presentation of our paper – thank you so much!

References

Abels, D., Jordi, J., Ostrowski, M., Schaub, T., Toletti, A. and Wanko, P. 2021. Train scheduling with hybrid ASP. Theory and Practice of Logic Programming 21, 3, 317347.CrossRefGoogle Scholar
Alviano, M., Calimeri, F., Dodaro, C., Fuscà, D., Leone, N., Perri, S., Ricca, F., Veltri, P. and Zangari, J. 2017. The ASP system DLV2. In Proceedings of the Fourteenth International Conference on Logic Programming and Nonmonotonic Reasoning (LPNMR’17), M. Balduccini and T. Janhunen, Eds. Springer-Verlag, 215–221.Google Scholar
Alviano, M., Dodaro, C., Leone, N. and Ricca, F. 2015. Advances in WASP. In Proceedings of the Thirteenth International Conference on Logic Programming and Nonmonotonic Reasoning (LPNMR’15). Springer-Verlag, 40–54.Google Scholar
Balduccini, M., Lierler, Y. and Woltran, S., Eds. 2019. Proceedings of the Fifteenth International Conference on Logic Programming and Nonmonotonic Reasoning (LPNMR’19). Springer-Verlag.CrossRefGoogle Scholar
Banbara, M., Kaufmann, B., Ostrowski, M. and Schaub, T. 2017. Clingcon: The next generation. Theory and Practice of Logic Programming 17, 4, 408461.CrossRefGoogle Scholar
Baral, C. 2003. Knowledge Representation, Reasoning and Declarative Problem Solving. Cambridge University Press.CrossRefGoogle Scholar
Baral, C. and Gelfond, M. 2000. Reasoning agents in dynamic domains. In Logic-Based Artificial Intelligence, J. Minker, Ed. Kluwer Academic Publishers, Dordrecht, 257–279.Google Scholar
Barrett, C., Sebastiani, R., Seshia, S. and Tinelli, C. 2009. Satisfiability modulo theories. In Handbook of Satisfiability. Frontiers in Artificial Intelligence and Applications, vol. 185. IOS Press, Chapter 26, 825–885.Google Scholar
Bartholomew, M. and Lee, J. 2014. System aspmt2smt: Computing ASPMT theories by SMT solvers. In Proceedings of the Fourteenth European Conference on Logics in Artificial Intelligence (JELIA’14). Springer-Verlag, 529–542.Google Scholar
Biere, A., Heule, M., van Maaren, H. and Walsh, T., Eds. 2009. Handbook of Satisfiability . Frontiers in Artificial Intelligence and Applications, vol. 185. IOS Press.Google Scholar
Bomanson, J., Gebser, M. and Janhunen, T. 2014. Improving the normalization of weight rules in answer set programs. In Proceedings of the Fourteenth European Conference on Logics in Artificial Intelligence (JELIA’14). Springer-Verlag, 166–180.Google Scholar
Bomanson, J., Gebser, M. and Janhunen, T. 2016. Rewriting optimization statements in answer-set programs. In Technical Communications of the Thirty-second International Conference on Logic Programming (ICLP’16). OpenAccess Series in Informatics (OASIcs), vol. 52. Schloss Dagstuhl–Leibniz-Zentrum fuer Informatik, 5:1–5:15.Google Scholar
Brewka, G., Delgrande, J., Romero, J. and Schaub, T. 2015. Implementing preferences with asprin. In Proceedings of the Thirteenth International Conference on Logic Programming and Nonmonotonic Reasoning (LPNMR’15). Springer-Verlag, 158–172.Google Scholar
Brewka, G., Eiter, T. and McIlraith, S., Eds. 2012. Proceedings of the Thirteenth International Conference on Principles of Knowledge Representation and Reasoning (KR’12). AAAI Press.Google Scholar
Cabalar, P., Fandinno, J., Garea, J., Romero, J. and Schaub, T. 2020. eclingo: A solver for epistemic logic programs. Theory and Practice of Logic Programming 20, 5, 834–847. URL: https://github.com/potassco/eclingo.CrossRefGoogle Scholar
Cabalar, P., Fandinno, J., Schaub, T. and Wanko, P. 2020a. An ASP semantics for constraints involving conditional aggregates. In Proceedings of the Twenty-fourth European Conference on Artificial Intelligence (ECAI’20), G. De Giacomo, A. Catalá, B. Dilkina, M. Milano, S. Barro, A. Bugarn and J. Lang, Eds. Frontiers in Artificial Intelligence and Applications, vol. 325. IOS Press, 664–671.Google Scholar
Cabalar, P., Fandinno, J., Schaub, T. and Wanko, P. 2020b. A uniform treatment of aggregates and constraints in hybrid ASP. In Proceedings of the Seventeenth International Conference on Principles of Knowledge Representation and Reasoning (KR’18), D. Calvanese, E. Erdem and M. Thielscher, Eds. AAAI Press, 193–202.Google Scholar
Cabalar, P., Kaminski, R., Morkisch, P. and Schaub, T. 2019. telingo = ASP + time. In Proceedings of the Fifteenth International Conference on Logic Programming and Nonmonotonic Reasoning (LPNMR’19). Springer-Verlag, 256–269.Google Scholar
Cabalar, P., Kaminski, R., Ostrowski, M. and Schaub, T. 2016. An ASP semantics for default reasoning with constraints. In Proceedings of the Twenty-fifth International Joint Conference on Artificial Intelligence (IJCAI’16), R. Kambhampati, Ed. IJCAI/AAAI Press, 1015–1021.Google Scholar
Calimeri, F., Faber, W., Gebser, M., Ianni, G., Kaminski, R., Krennwallner, T., Leone, N., Maratea, M., Ricca, F. and Schaub, T. 2019. ASP-Core-2 input language format. Theory and Practice of Logic Programming 20, 2, 294309.Google Scholar
Calimeri, F., Fuscà, D., Perri, S. and Zangari, J. 2017. I-DLV: The new intelligent grounder of DLV. Intelligenza Artificiale 11, 1, 520.CrossRefGoogle Scholar
Calimeri, F., Ianni, G. and Truszczyński, M., Eds. 2015. Proceedings of the Thirteenth International Conference on Logic Programming and Nonmonotonic Reasoning (LPNMR’15). Springer-Verlag.CrossRefGoogle Scholar
Carro, M. and King, A., Eds. 2016. Technical Communications of the Thirty-second International Conference on Logic Programming (ICLP’16). OpenAccess Series in Informatics (OASIcs), vol. 52. Schloss Dagstuhl–Leibniz-Zentrum fuer Informatik.Google Scholar
CFFI 2021. Cffi documentation. URL: https://cffi.readthedocs.io.Google Scholar
Cotton, S. and Maler, O. 2006. Fast and flexible difference constraint propagation for DPLL(T). In Proceedings of the Ninth International Conference on Theory and Applications of Satisfiability Testing (SAT’06), A. Biere and C. Gomes, Eds. Springer-Verlag, 170–183.Google Scholar
Cuteri, B., Dodaro, C., Ricca, F. and Schüller, P. 2020. Overcoming the grounding bottleneck due to constraints in ASP solving: Constraints become propagators. In Proceedings of the Twenty-Ninth International Joint Conference on Artificial Intelligence (IJCAI’20), C. Bessiere, Ed. ijcai.org, 1688–1694.Google Scholar
Dantsin, E., Eiter, T., Gottlob, G. and Voronkov, A. 2001. Complexity and expressive power of logic programming. ACM Computing Surveys 33, 3, 374425.CrossRefGoogle Scholar
Delgrande, J., Schaub, T. and Tompits, H. 2003. A framework for compiling preferences in logic programs. Theory and Practice of Logic Programming 3, 2, 129187.CrossRefGoogle Scholar
Dimopoulos, Y., Gebser, M., Lühne, P., Romero, J. and Schaub, T. 2018. plasp 3: Towards effective ASP planning. Theory and Practice of Logic Programming 19, 3, 477504.Google Scholar
Dodaro, C., Gasteiger, P., Leone, N., Musitsch, B., Ricca, F. and Schekotihin, K. 2016. Combining answer set programming and domain heuristics for solving hard industrial problems. Theory and Practice of Logic Programming 16, 5–6, 653669.CrossRefGoogle Scholar
Dodaro, C. and Ricca, F. 2020. The external interface for extending WASP. Theory and Practice of Logic Programming 20, 2, 225248.CrossRefGoogle Scholar
Eén, N. and Sörensson, N. 2004. An extensible SAT-solver. In Proceedings of the Sixth International Conference on Theory and Applications of Satisfiability Testing (SAT’03), E. Giunchiglia and A. Tacchella, Eds. Springer-Verlag, 502–518.Google Scholar
Eiter, T., Erdem, E., Erdogan, H. and Fink, M. 2013. Finding similar/diverse solutions in answer set programming. Theory and Practice of Logic Programming 13, 3, 303359.CrossRefGoogle Scholar
Eiter, T., Faber, W., Leone, N. and Pfeifer, G. 2003. Computing preferred answer sets by meta-interpretation in answer set programming. Theory and Practice of Logic Programming 3, 4–5, 463498.CrossRefGoogle Scholar
Eiter, T., Germano, S., Ianni, G., Kaminski, T., Redl, C., Schüller, P. and Weinzierl, A. 2018. The DLVHEX system. Künstliche Intelligenz 32, 2–3, 187189.CrossRefGoogle Scholar
Eiter, T. and Gottlob, G. 1995. On the computational cost of disjunctive logic programming: Propositional case. Annals of Mathematics and Artificial Intelligence 15, 3–4, 289323.CrossRefGoogle Scholar
Eiter, T. and Polleres, A. 2006. Towards automated integration of guess and check programs in answer set programming: A meta-interpreter and applications. Theory and Practice of Logic Programming 6, 1–2, 2360.CrossRefGoogle Scholar
Febbraro, O., Leone, N., Grasso, G. and Ricca, F. 2012. JASP: A framework for integrating answer set programming with Java. In Proceedings of the Thirteenth International Conference on Principles of Knowledge Representation and Reasoning (KR’12). AAAI Press, 541–551.Google Scholar
Fermé, E. and Leite, J., Eds. 2014. Proceedings of the Fourteenth European Conference on Logics in Artificial Intelligence (JELIA’14). Springer-Verlag.CrossRefGoogle Scholar
Frioux, C., Schaub, T., Schellhorn, S., Siegel, A. and Wanko, P. 2019. Hybrid metabolic network completion. Theory and Practice of Logic Programming 19, 1, 83108.CrossRefGoogle Scholar
Fuscà, D., Germano, S., Zangari, J., Anastasio, M., Calimeri, F. and Perri, S. 2016. A framework for easing the development of applications embedding answer set programming. In Proceedings of the Eighteenth International Symposium on Principles and Practice of Declarative Programming (PPDP’16), J. Cheney and G. Vidal, Eds. ACM Press, 38–49.Google Scholar
Gebser, M., Harrison, A., Kaminski, R., Lifschitz, V. and Schaub, T. 2015. Abstract Gringo. Theory and Practice of Logic Programming 15, 4–5, 449463.CrossRefGoogle Scholar
Gebser, M., Kaminski, R., Kaufmann, B., Lindauer, M., Ostrowski, M., Romero, J., Schaub, T. and Thiele, S. 2015. Potassco User Guide, 2 ed. University of Potsdam.Google Scholar
Gebser, M., Kaminski, R., Kaufmann, B., Lühne, P., Obermeier, P., Ostrowski, M., Romero, J., Schaub, T., Schellhorn, S. and Wanko, P. 2018. The Potsdam answer set solving collection 5.0. Künstliche Intelligenz 32, 2–3, 181–182.Google Scholar
Gebser, M., Kaminski, R., Kaufmann, B., Ostrowski, M., Schaub, T. and Schneider, M. 2011. Potassco: The Potsdam answer set solving collection. AI Communications 24, 2, 107124.CrossRefGoogle Scholar
Gebser, M., Kaminski, R., Kaufmann, B., Ostrowski, M., Schaub, T. and Thiele, S. 2008. Engineering an incremental ASP solver. In Proceedings of the Twenty-fourth International Conference on Logic Programming (ICLP’08), M. Garcia de la Banda and E. Pontelli, Eds. Springer-Verlag, 190–205.Google Scholar
Gebser, M., Kaminski, R., Kaufmann, B., Ostrowski, M., Schaub, T. and Wanko, P. 2016. Theory solving made easy with clingo 5. In Technical Communications of the Thirty-second International Conference on Logic Programming (ICLP’16). OpenAccess Series in Informatics (OASIcs), vol. 52. Schloss Dagstuhl–Leibniz-Zentrum fuer Informatik, 2:1–2:15.Google Scholar
Gebser, M., Kaminski, R., Kaufmann, B. and Schaub, T. 2012. Answer Set Solving in Practice . Synthesis Lectures on Artificial Intelligence and Machine Learning. Morgan and Claypool Publishers.Google Scholar
Gebser, M., Kaminski, R., Kaufmann, B. and Schaub, T. 2019. Multi-shot ASP solving with clingo. Theory and Practice of Logic Programming 19, 1, 27–82.Google Scholar
Gebser, M., Kaminski, R. and Schaub, T. 2011. Complex optimization in answer set programming. Theory and Practice of Logic Programming 11, 4–5, 821839.CrossRefGoogle Scholar
Gebser, M., Kaufmann, B. and Schaub, T. 2012. Conflict-driven answer set solving: From theory to practice. Artificial Intelligence 187–188, 52–89.Google Scholar
Gebser, M., Pührer, J., Schaub, T. and Tompits, H. 2008. A meta-programming technique for debugging answer-set programs. In Proceedings of the Twenty-third National Conference on Artificial Intelligence (AAAI’08), D. Fox and C. Gomes, Eds. AAAI Press, 448–453.Google Scholar
Gebser, M. and Schaub, T. 2016. Modeling and language extensions. AI Magazine 37, 3, 3344.CrossRefGoogle Scholar
Gelfond, M. and Kahl, Y. 2014. Knowledge Representation, Reasoning, and the Design of Intelligent Agents: The Answer-Set Programming Approach. Cambridge University Press.CrossRefGoogle Scholar
Gelfond, M. and Lifschitz, V. 1990. Logic programs with classical negation. In Proceedings of the Seventh International Conference on Logic Programming (ICLP’90), D. Warren and P. Szeredi, Eds. MIT Press, 579–597.Google Scholar
Gelfond, M. and Son, T. 1997. Reasoning with prioritized defaults. In Third International Workshop on Logic Programming and Knowledge Representation, J. Dix, L. Pereira and T. Przymusinski, Eds. Springer-Verlag, 164–223.Google Scholar
Gelfond, M. and Zhang, Y. 2019. Vicious circle principle, aggregates, and formation of sets in ASP based languages. Artificial Intelligence 275, 2877.CrossRefGoogle Scholar
Heyting, A. 1930. Die formalen Regeln der intuitionistischen Logik. In Sitzungsberichte der Preussischen Akademie der Wissenschaften. Deutsche Akademie der Wissenschaften zu Berlin, 42–56.Google Scholar
Janhunen, T., Kaminski, R., Ostrowski, M., Schaub, T., Schellhorn, S. and Wanko, P. 2017. Clingo goes linear constraints over reals and integers. Theory and Practice of Logic Programming 17, 5–6, 872888.CrossRefGoogle Scholar
Janhunen, T., Liu, G. and Niemelä, I. 2011. Tight integration of non-ground answer set programming and satisfiability modulo theories. In Proceedings of the First Workshop on Grounding and Transformation for Theories with Variables (GTTV’11), P. Cabalar, D. Mitchell, D. Pearce and E. Ternovska, Eds. 1–13.Google Scholar
Janhunen, T. and Niemelä, I. 2011. Compact translations of non-disjunctive answer set programs to propositional clauses. In Logic Programming, Knowledge Representation, and Nonmonotonic Reasoning: Essays Dedicated to Michael Gelfond on the Occasion of his 65th Birthday, Balduccini, M. and Son, T., Eds. Springer-Verlag, 111130.CrossRefGoogle Scholar
Kaminski, R., Schaub, T. and Wanko, P. 2017. A tutorial on hybrid answer set solving with clingo. In Proceedings of the Thirteenth International Summer School of the Reasoning Web, G. Ianni, D. Lembo, L. Bertossi, W. Faber, B. Glimm, G. Gottlob and S. Staab, Eds. Springer-Verlag, 167–203.Google Scholar
Kaufmann, B., Leone, N., Perri, S. and Schaub, T. 2016. Grounding and solving in answer set programming. AI Magazine 37, 3, 2532.CrossRefGoogle Scholar
Leone, N., Pfeifer, G., Faber, W., Eiter, T., Gottlob, G., Perri, S. and Scarcello, F. 2006. The DLV system for knowledge representation and reasoning. ACM Transactions on Computational Logic 7, 3, 499562.CrossRefGoogle Scholar
Lierler, Y. and Susman, B. 2016. SMT-based constraint answer set solver EZSMT. In Technical Communications of the Thirty-second International Conference on Logic Programming (ICLP’16). OpenAccess Series in Informatics (OASIcs), vol. 52. Schloss Dagstuhl–Leibniz-Zentrum fuer Informatik, 1:1–1:15.Google Scholar
Lifschitz, V. 2019. Answer Set Programming. Springer-Verlag.CrossRefGoogle Scholar
Lifschitz, V., Pearce, D. and Valverde, A. 2001. Strongly equivalent logic programs. ACM Transactions on Computational Logic 2, 4, 526541.CrossRefGoogle Scholar
Liu, G., Janhunen, T. and Niemelä, I. 2012. Answer set programming via mixed integer programming. In Proceedings of the Thirteenth International Conference on Principles of Knowledge Representation and Reasoning (KR’12). AAAI Press, 32–42.Google Scholar
Marques-Silva, J., Lynce, I. and Malik, S. 2009. Conflict-driven clause learning SAT solvers. In Handbook of Satisfiability. Frontiers in Artificial Intelligence and Applications, vol. 185. IOS Press, Chapter 4, 131–153.Google Scholar
McCarthy, J. 1998. Elaboration tolerance.Google Scholar
Mellarkod, V., Gelfond, M. and Zhang, Y. 2008. Integrating answer set programming and constraint logic programming. Annals of Mathematics and Artificial Intelligence 53, 1–4, 251287.CrossRefGoogle Scholar
Niemelä, I. and Simons, P. 1997. Smodels: An implementation of the stable model and well-founded semantics for normal logic programs. In Proceedings of the Fourth International Conference on Logic Programming and Nonmonotonic Reasoning (LPNMR’97), J. Dix, U. Furbach, and A. Nerode, Eds. Springer-Verlag, 420–429.Google Scholar
Nieuwenhuis, R., Oliveras, A. and Tinelli, C. 2006. Solving SAT and SAT modulo theories: From an abstract Davis-Putnam-Logemann-Loveland procedure to DPLL(T). Journal of the ACM 53, 6, 937977.CrossRefGoogle Scholar
Nogueira, M., Balduccini, M., Gelfond, M., Watson, R. and Barry, M. 2001. An A-prolog decision support system for the space shuttle. In Proceedings of the Third International Symposium on Practical Aspects of Declarative Languages (PADL’01), I. Ramakrishnan, Ed. Springer-Verlag, 169–183.Google Scholar
Oikarinen, E. and Janhunen, T. 2006. Modular equivalence for normal logic programs. In Proceedings of the Seventeenth European Conference on Artificial Intelligence (ECAI’06), G. Brewka, S. Coradeschi, A. Perini and P. Traverso, Eds. IOS Press, 412–416.Google Scholar
Pearce, D. 1997. A new logical characterisation of stable models and answer sets. In Proceedings of the Sixth International Workshop on Non-Monotonic Extensions of Logic Programming (NMELP’96), J. Dix, L. Pereira and T. Przymusinski, Eds. Springer-Verlag, 57–70.Google Scholar
Potassco, Team. 2021a. Answer set solving in practice, course material. URL: https://teaching.potassco.org.Google Scholar
Potassco, Team. 2021b. clingo. URL: https://github.com/potassco/clingo.Google Scholar
Potassco, Team. 2021c. clingo’s application programming interface. URL: https://potassco.org/clingo/python-api/5.5.Google Scholar
Potassco, Team. 2021d. Difference constraints propagator for clingo s. URL: https://github.com/potassco/clingo/tree/master/examples/clingo/dl.Google Scholar
Potassco, Team. 2021e. Guess-and-check programming in Python. URL: https://github.com/potassco/clingo/tree/master/examples/reify/gac.Google Scholar
Potassco, Team. 2021f. lpconvert. URL: https://github.com/potassco/libpotassco.Google Scholar
Potassco, Team. 2021h. Solving the towers of hanoi problem with clingo. URL: https://github.com/potassco/clingo/tree/master/examples/clingo/opt.Google Scholar
Redl, C. 2016. The dlvhex system for knowledge representation: recent advances. Theory and Practice of Logic Programming 16, 5–6, 866883.CrossRefGoogle Scholar
Romero, J., Schaub, T. and Wanko, P. 2016. Computing diverse optimal stable models. In Technical Communications of the Thirty-second International Conference on Logic Programming (ICLP’16). OpenAccess Series in Informatics (OASIcs), vol. 52. Schloss Dagstuhl–Leibniz-Zentrum fuer Informatik, 3:1–3:14.Google Scholar
Simons, P., Niemelä, I. and Soininen, T. 2002. Extending and implementing the stable model semantics. Artificial Intelligence 138, 1–2, 181234.CrossRefGoogle Scholar
Son, T., Baral, C., Nam, T. and McIlraith, S. 2006. Domain-dependent knowledge in answer set planning. ACM Transactions on Computational Logic 7, 4, 613–657.Google Scholar
Syrjänen, T. 2001. Lparse 1.0 user’s manual.Google Scholar
Wikipedia contributors. 2021. Metaprogramming – Wikipedia, the free encyclopedia. URL: https://en.wikipedia.org/w/index.php?title=Metaprogramming oldid=1001427050.sGoogle Scholar
Supplementary material: PDF

Kaminski et al. supplementary material

Kaminski et al. supplementary material

Download Kaminski et al. supplementary material(PDF)
PDF 381.1 KB