{'fraction_non_alphanumeric': 0.03316326530612245, 'fraction_numerical': 0.003061224489795918, 'mean_word_length': 4.8017751479289945, 'pattern_counts': {'":': 0, '<': 0, '<?xml version=': 0, '>': 0, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
Development of a proof assistant for Dedukti

Dedukti [11] is a formal proof checker based on a logical framework called the λΠ-calculus modulo, which is an extension of the simply-typed lambdacalculus with dependent types (e.g. lists of size n) and an equivalence relation on types generated by user-defined rewrite rules (like in Agda or Haskell). Proofs obtained by some proof assistants (e.g. HOL, Coq, Matita) can be checked in Dedukti by encoding function definitions and axioms by rewrite rules [8, 6, 5]. But, currently, no proof assistant fully uses all the capabilities of Dedukti, which allows a priori arbitrary user-defined rewrite rules. This is for instance necessary if one wants to ease the use of dependent types and be able to define types for representing simplicial sets of arbitrary dimensions, ∞-categories or models of Voevodsky’s homotopy type theory. The goal of this internship is to develop a front-end, that is, a proof assistant, for Dedukti that takes advantage of defining arbitrary rewrite rules for defining functions and types. Developing a proof assistant includes to develop a language and interpretation tool for building proofs interactively. A key feature to scale up, especially with dependent and polymorphic types, is to allow the user to write down terms with missing information (e.g. the type of the elements of a list) and provide an inference engine for deducing it. To start with, the student could adapt the refinement engine of Matita [3]. Such a refinement engine is based on a unification algorithm. To start with, the student could implement a simple first-order unification algorithm. A refinement engine also provides the basis on which to implement basic tactics. For instance, applying the logical introduction rule for implication consists in refining the current proof by the incomplete term λx :?.?. The student will implement a basic set of such tactics. Then, several directions can be considered: