Code Monkey home page Code Monkey logo

ltac2's Introduction

Coq

GitLab CI GitHub macOS CI GitHub Windows CI Zulip Discourse DOI

Coq is a formal proof management system. It provides a formal language to write mathematical definitions, executable algorithms and theorems together with an environment for semi-interactive development of machine-checked proofs.

Installation

latest packaged version(s)

Docker Hub package latest dockerized version

Please see https://coq.inria.fr/download. Information on how to build and install from sources can be found in INSTALL.md.

Documentation

The sources of the documentation can be found in directory doc. See doc/README.md to learn more about the documentation, in particular how to build it. The documentation of the last released version is available on the Coq web site at coq.inria.fr/documentation. See also Cocorico (the Coq wiki), and the Coq FAQ, for additional user-contributed documentation.

The documentation of the master branch is continuously deployed. See:

Changes

The Recent changes chapter of the reference manual explains the differences and the incompatibilities of each new version of Coq. If you upgrade Coq, please read it carefully as it contains important advice on how to approach some problems you may encounter.

Questions and discussion

We have a number of channels to reach the user community and the development team:

  • Our Zulip chat, for casual and high traffic discussions.
  • Our Discourse forum, for more structured and easily browsable discussions and Q&A.
  • Our historical mailing list, the Coq-Club.

See also coq.inria.fr/community, which lists several other active platforms.

Bug reports

Please report any bug / feature request in our issue tracker.

To be effective, bug reports should mention the OCaml version used to compile and run Coq, the Coq version (coqtop -v), the configuration used, and include a complete source example leading to the bug.

Contributing to Coq

Guidelines for contributing to Coq in various ways are listed in the contributor's guide.

Information about release plans is at https://github.com/coq/coq/wiki/Release-Plan

Supporting Coq

Help the Coq community grow and prosper by becoming a sponsor! The Coq Consortium can establish sponsorship contracts or receive donations. If you want to take an active role in shaping Coq's future, you can also become a Consortium member. If you are interested, please get in touch!

ltac2's People

Contributors

armael avatar ejgallego avatar gallais avatar gares avatar herbelin avatar jasongross avatar langston-barrett avatar maximedenes avatar ppedrot avatar proux01 avatar skyskimmer avatar vbgl avatar wilcoxjay avatar zimmi48 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ltac2's Issues

Expected and actual types are flipped

In this code:

Ltac2 foo :=
      match true with
      | true => ()
      | false => fun () => ()
      end.

I get an error at fun () => () which says This expression has type unit but an expression was expected of type unit -> unit

Int.compare should not be uniformly 0

Require Import Ltac2.Init Ltac2.Message Ltac2.Control Ltac2.Int.
Goal True.
  Ltac2 check_eq x y :=
    match Int.equal x y with
    | true => ()
    | false => let msg := Message.concat
                            (Message.of_string "Not equal: ")
                            (Message.concat
                               (Message.of_int x)
                               (Message.concat
                                  (Message.of_string " != ")
                                  (Message.of_int y))) in
               Message.print msg;
                 Control.zero (Tactic_failure (Some msg))
    end.
  check_eq (Int.compare 0 0) 0.
  check_eq (Int.compare 1 1) 0.
  check_eq (Int.compare 1 2) -1. (* fails with 0 != -1 *)
  check_eq (Int.compare 2 1) 1. (* fails with 0 != 1 *)

Antiquotation syntax breaks when backtracking across `Require`

Require Ltac2.Ltac2.
Import Ltac2.Init.

Goal True.
Proof.
let x := constr:(I) in
let y := constr:((fun z => z) $x) in
Control.refine (fun _ => y).
Qed.

BackTo 1.
Require Ltac2.Ltac2.
Import Ltac2.Init.

Goal True.
Proof.
let x := constr:(I) in
let y := constr:((fun z => z) $x) in (* Error: Syntax Error: Lexer: Undefined token *)
Control.refine (fun _ => y).
Qed.

Ltac2 scope cannot be disabled after it is (transitively) required

Require Ltac2.Ltac2 should not mean that I need to wrap all of my Ltac1 proofs in ltac1:(). That should only happen if I do Import Ltac2.Init. This bug means that using Ltac2 in a small part of my project is a very invasive change, because any file depending on such theorems needs to wrap all Ltac1 with ltac1:(...). This can be seen with this example:

Require Ltac2.Ltac2.
Goal True -> True.
  intro x. (* Error: Unbound value intro *)

Beta (or alpha) release ?

What about tagging a beta release (call it alpha if you prefer) on Ltac2 v8.8 branch? This way we could include it in the 8.8.1 Windows packages and encourage our users to start playing with it (and redirect their feature requests about Ltac to Ltac2).

lazy_match! should not gobble up error of branch

In Ltac1, if a branch of a lazymatch fails, the precise error from that branch is reported, which is very useful for debugging Ltac scripts:

Goal exists (p: nat * nat), fst p = snd p.
  lazymatch goal with
  | [ |- exists (x: nat), _ ] => exists 0
  | [ |- exists (x: nat * nat), _ ] => exists 0 (* <- intended failure *)
  end.

yields

Error:
Ltac call to "exists (ne_bindings_list)" failed.
The term "0" has type "nat" while it is expected to have type "(nat * nat)%type".

In Ltac2, however, this does not seem to work: If I do

Goal exists (p: nat * nat), fst p = snd p.
  lazy_match! goal with
  | [ |- exists (x: nat), _ ] => exists 0
  | [ |- exists (x: nat * nat), _ ] => exists 0 (* <- intended failure *)
  end.

I just get a generic

Error: Uncaught Ltac2 exception: Match_failure

lazy_match! does not commit to the first matching branch

In Ltac1, this code

Goal 2 = 3.
  lazymatch goal with
  | [ |- 2 = 3 ] => fail
  | [ |- 2 = _ ] => idtac "should not be printed"
  end.

prints

Error: Tactic failure.

as expected.

The equivalent in Ltac2

Goal 2 = 3.
  lazy_match! goal with
  | [ |- 2 = 3 ] => fail
  | [ |- 2 = _ ] => Message.print (Message.of_string "should not be printed")
  end.

prints

should not be printed

which seems wrong to me.

Maybe related to #77

Anomaly File "engine/proofview.ml", line 1086, characters 11-17: Assertion failed. on only shelved goals remaining

I haven't minimized this much, but here's a self-contained file reproducing the error:

Require Import Ltac2.Ltac2.
Module Option.
  Ltac2 equal (eqb : 'a -> 'b -> bool) (x : 'a option) (y : 'b option)
    := match x with
       | None
         => match y with
            | None => true
            | Some _ => false
            end
       | Some x
         => match y with
            | None => false
            | Some y => eqb x y
            end
       end.
End Option.
Module List.
  Ltac2 rec fold_right f a ls :=
    match ls with
    | [] => a
    | l :: ls => f l (fold_right f a ls)
    end.
  Ltac2 rec fold_left (f : 'a -> 'b -> 'a) (xs : 'b list) (a : 'a) :=
    match xs with
    | [] => a
    | x :: xs => fold_left f xs (f a x)
    end.
  Ltac2 rec map f ls :=
    match ls with
    | [] => []
    | l :: ls => f l :: map f ls
    end.
  Ltac2 rec iter f ls :=
    match ls with
    | [] => ()
    | l :: ls => f l; iter f ls
    end.
  Ltac2 rec find f xs :=
    match xs with
    | [] => None
    | x :: xs => match f x with
                 | true => Some x
                 | false => find f xs
                 end
    end.
  Ltac2 rec find_rev f xs :=
    match xs with
    | [] => None
    | x :: xs => match find_rev f xs with
                 | Some v => Some v
                 | None => match f x with
                           | true => Some x
                           | false => None
                           end
                 end
    end.
  Ltac2 rec rev_append l l' :=
    match l with
    | [] => l'
    | x :: xs => rev_append xs (x :: l')
    end.
  Ltac2 rev ls := rev_append ls [].
  Ltac2 rec all f ls :=
    match ls with
    | [] => true
    | x :: xs => match f x with
                 | true => all f xs
                 | false => false
                 end
    end.
  Ltac2 rec app ls1 ls2 :=
    match ls1 with
    | [] => ls2
    | x :: xs => x :: app xs ls2
    end.
  Ltac2 rec any f ls :=
    match ls with
    | [] => false
    | x :: xs => match f x with
                 | true => true
                 | false => any f xs
                 end
    end.
End List.
Module Message.
  Ltac2 join sep ms :=
    match ms with
    | [] => Message.of_string ""
    | m :: ms
      => List.fold_left (fun a b => Message.concat a (Message.concat sep b))
                        ms
                        m
    end.
  Ltac2 print sep ms :=
    match sep with
    | Some sep
      => Message.print (Message.join sep ms)
    | None => Message.print (Message.join (Message.of_string "") ms)
    end.
End Message.
Module Ident.
  Ltac2 rec find_error id xs :=
    match xs with
    | [] => None
    | x :: xs
      => let ((id', val)) := x in
         match Ident.equal id id' with
         | true => Some val
         | false => find_error id xs
         end
    end.
  Ltac2 find id xs :=
    match find_error id xs with
    | None => Control.zero Not_found
    | Some val => val
    end.
End Ident.
Module Control.
  Ltac2 Type match_options := { multi : bool ; lazy : bool ; reverse : bool }.
  Ltac2 update_reverse (opts : match_options) (new_val : bool) :=
    { multi := opts.(multi) ; lazy := opts.(lazy) ; reverse := new_val }.
  Ltac2 update_multi (opts : match_options) (new_val : bool) :=
    { multi := new_val ; lazy := opts.(lazy) ; reverse := opts.(reverse) }.
  Ltac2 update_lazy (opts : match_options) (new_val : bool) :=
    { multi := opts.(multi) ; lazy := new_val ; reverse := opts.(reverse) }.
  Ltac2 rec multimatch_list_aux (f : 'a -> 'b) (ls : 'a list) (e : exn) :=
    match ls with
    | [] => Control.zero e
    | x :: xs => Control.plus
                   (fun () => f x)
                   (fun e' =>
                      match e' with
                      | Match_failure => multimatch_list_aux f xs e
                      | _ => multimatch_list_aux f xs e'
                      end)
    end.
  Ltac2 multimatch_list (f : 'a -> 'b) (ls : 'a list) :=
    multimatch_list_aux f ls Match_failure.
  Ltac2 match_list_gen (opts : match_options) (f : 'a -> 'b) (ls : 'a list) :=
    let maybe_once := match opts.(multi) with
                      | false => Control.once
                      | true => fun f => f ()
                      end in
    let ls := match opts.(reverse) with
              | true => List.rev ls
              | false => ls
              end in
    maybe_once (fun () => multimatch_list f ls).
  Ltac2 match_list f ls :=
    Control.once (fun () => multimatch_list f ls).
  Ltac2 match0_gen opts constr_val branches :=
    match opts.(lazy) with
    | true
      => Control.match_list_gen
           opts
           (fun v
            => let ((pat, tac)) := v in
               let matches := Pattern.matches pat constr_val in
               fun () => tac matches)
           branches
           ()
    | false
      => Control.match_list_gen
           opts
           (fun v
            => let ((pat, tac)) := v in
               let matches := Pattern.matches pat constr_val in
               tac matches)
           branches
    end.
  Ltac2 match_goal_gen
        (opts : match_options)
        (branches : ((((ident * constr option * constr) list) * constr -> 'a) list))
    :=
      let ctx := match opts.(reverse) with
                 | true => Control.hyps ()
                 | false => List.rev (Control.hyps ())
                 end in
      let gl := Control.goal () in
      let opts := update_reverse opts false in
      Control.match_list_gen
        opts
        (fun f => f (ctx, gl))
        branches.
  Ltac2 match0 constr_val branches :=
    match0_gen { multi := false ; lazy := false ; reverse := false } constr_val branches.
  Ltac2 lazymatch0 constr_val branches :=
    match0_gen { multi := false ; lazy := true ; reverse := false } constr_val branches.
  Ltac2 multimatch0 constr_val branches :=
    match0_gen { multi := true ; lazy := false ; reverse := false } constr_val branches.

  Ltac2 app_nonlinear_bindings existing_bindings new_bindings :=
    match List.all
            (fun b
             => let ((id, body)) := b in
                match Ident.find_error id existing_bindings with
                | None => true
                | Some body' => Constr.equal body body'
                end)
            new_bindings with
    | true => List.app existing_bindings new_bindings
    | false => Control.zero Match_failure
    end.
  Ltac2 rec enforce_distinct_hyps (ls : (ident option * ident) list) :=
    match ls with
    | [] => ()
    | x :: xs
      => let ((id, idh)) := x in
         match List.any
                 (fun ((id', idh'))
                  => match Ident.equal idh idh' with
                     | true => true
                     | false
                       => match id with
                          | None => false
                          | Some id
                            => match id' with
                               | None => false
                               | Some id' => Ident.equal id id'
                               end
                          end
                     end)
                 xs
         with
         | true => Control.zero Match_failure
         | false => enforce_distinct_hyps xs
         end
    end.

  Ltac2 Type PatternType := [ NormalPattern | ContextPattern (ident option) ].

  Ltac2 pattern_gen_matches (pat : PatternType * pattern) (v : constr) :=
    let ((pat_ty, pat)) := pat in
    match pat_ty with
    | NormalPattern
      => (None, Pattern.matches pat v)
    | ContextPattern id
      => let ((ctx, bindings)) := Pattern.matches_subterm pat v in
         (Some (id, ctx), bindings)
    end.

  Ltac2 match_goal0_gen_aux
        (opts : match_options)
        (branches : (((ident option * (PatternType * pattern) option * (PatternType * pattern)) list) *
                     (PatternType * pattern) *
                     ((((ident option * Pattern.context) option) list (* body ctx *)) *
                      (((ident option * Pattern.context) option) list (* type ctx *)) *
                      ((ident option * Pattern.context) option (* goal ctx *)) *
                      ((ident option * ident) list (* hyp name bindings *)) *
                      ((ident * constr) list (* bindings *))
                      -> 'a))
                      list)
    :=
      let opts_no_rev := update_reverse opts false in
      let opts_no_rev_multi := update_multi opts_no_rev true in
      match_goal_gen
        opts
        (List.map
           (fun ((hyp_pats, gl_pat, tac)) ((hyps, gl))
            => let ((gl_ctx, gl_bindings)) := pattern_gen_matches gl_pat gl in
               let hyp_matches :=
                   List.map
                     (fun ((id, body_pat, ty_pat))
                      => Control.match_list_gen
                           opts_no_rev_multi
                           (fun ((idh, body, ty))
                            => let ((body_ctx, body_bindings)) :=
                                   match body_pat with
                                   | None => (None, [])
                                   | Some body_pat
                                     => match body with
                                        | None => Control.zero Match_failure
                                        | Some body
                                          => pattern_gen_matches body_pat body
                                        end
                                   end in
                               let ((ty_ctx, ty_bindings)) :=
                                   pattern_gen_matches ty_pat ty in
                               ((id, idh), body_ctx, ty_ctx,
                                app_nonlinear_bindings body_bindings ty_bindings))
                           hyps)
                     hyp_pats in
               let ((id_idh, body_ctxs, ty_ctxs, bindings)) :=
                   List.fold_right
                     (fun ((id_idh', body_ctx', ty_ctx', bindings'))
                          ((id_idh, body_ctxs, ty_ctxs, bindings))
                      => ((id_idh' :: id_idh),
                          (body_ctx' :: body_ctxs),
                          (ty_ctx' :: ty_ctxs),
                          app_nonlinear_bindings bindings' bindings))
                     ([], [], [], [])
                     hyp_matches in
               enforce_distinct_hyps id_idh;
                 let bindings := app_nonlinear_bindings bindings gl_bindings in
                 tac (body_ctxs, ty_ctxs, gl_ctx, id_idh, bindings))
           branches).

  Ltac2 match_goal0_gen opts branches :=
    let opts_no_lazy := update_lazy opts false in
    match opts.(lazy) with
    | false
      => match_goal0_gen_aux opts_no_lazy branches
    | true
      => match_goal0_gen_aux
           opts_no_lazy
           (List.map
              (fun ((hyps, gl, tac))
               => (hyps, gl, (fun args () => tac args)))
              branches)
           ()
    end.
  Ltac2 match_goal0 branches :=
    match_goal0_gen { multi := false ; lazy := false ; reverse := false } branches.
  Ltac2 lazymatch_goal0 branches :=
    match_goal0_gen { multi := false ; lazy := true ; reverse := false } branches.
  Ltac2 match_hyps1_gen lazy ty_pattern tac :=
    match_goal0_gen
      { multi := false ; lazy := lazy ; reverse := false }
      [([(None, None, (NormalPattern, ty_pattern))],
        (NormalPattern, pattern:(_)),
        (fun ((body_ctx, ty_ctx, gl_ctx, hyp_names, bindings))
         => match hyp_names with
            | [] => Control.throw Not_found
            | h :: _
              => let ((_, hyp)) := h in
                 tac hyp bindings
            end))].
  Ltac2 match_hyps1 ty_pattern tac :=
    match_hyps1_gen false ty_pattern tac.
  Ltac2 lazymatch_hyps1 ty_pattern tac :=
    match_hyps1_gen true ty_pattern tac.
End Control.

Class Ltac1Result {T} (v : T) := {}.
Ltac finishLtac1 v := assert (Ltac1Result v) by constructor.
Ltac2 get_ltac1_result () :=
  Control.lazymatch_hyps1
    (pattern:(Ltac1Result ?v))
    (fun id matches
     => let val := Ident.find @v matches in
        Std.clear [id];
          val).
Class Ltac1Results {T} (v : list T) := {}.
Ltac finishLtac1s v := assert (Ltac1Result v) by constructor.
Ltac2 rec list_of_constr_list (ls : constr) :=
  Control.lazymatch0
    ls
    [((pattern:((?x :: ?xs)%list)),
      (fun matches
       => let x := Ident.find @x matches in
          let xs := Ident.find @xs matches in
          x :: list_of_constr_list xs))
     ;
     ((pattern:(_)),
      (fun _ => ls :: []))].
Ltac2 get_ltac1_results () :=
  Control.lazymatch_hyps1
    (pattern:(Ltac1Results ?v))
    (fun id matches
     => let val := Ident.find @v matches in
        Std.clear [id];
          list_of_constr_list val).
Class Ltac2Result {T} (v : T) := {}.
Ltac2 finishLtac2 v :=
  Notations.refine '((fun res : Ltac2Result $v => _) ltac2:(Notations.constructor)).
Ltac get_ltac2_result _ :=
  let dummy := match goal with _ => idtac "get_ltac2_result" end in
  lazymatch goal with
  | [ res : Ltac2Result ?v |- _ ]
    => let dummy := match goal with
                    | _ => clear res
                    end in
       v
  end.

(** Override this to get a faster [reify_type] *)
Ltac base_reify_type ty :=
  lazymatch constr:(I : True) with ?v => v end.
Ltac2 mutable base_reify_type ty :=
  Message.print None [Message.of_string "base_reify_type: "; Message.of_constr ty];
  finishLtac2 ty;
  Message.print None [Message.of_string "base_reify_type: calling Ltac1"];
  ltac1:(let ty := get_ltac2_result () in
         idtac "base_reify_type: ltac1:" ty;
           let v := base_reify_type ty in
           finishLtac1 v);
    get_ltac1_result ().
(*strip_type_cast '(_ : reify type $ty).*)
Ltac2 reify_base_type ty := base_reify_type ty.

Goal True.
  base_reify_type 'nat.

Argument to Tactic_failure should be printed

Require Import Ltac2.Init Ltac2.Control Ltac2.Message.
Goal True.
  Control.zero (Tactic_failure (Some (Message.of_string "foo"))). (* Error: Uncaught Ltac2 exception: Tactic_failure *)

Backtraces should print Ltac2 closures

  Require Import Ltac2.Init.
  Set Ltac2 Backtrace.
  Ltac2 foo () := let bar () := Control.zero (Tactic_failure None) in bar ().
  Goal True.
    foo ().

gives

Error:
Uncaught Ltac2 exception: Tactic_failure
Backtrace:
Prim <ltac2:zero>
Call Control.zero
Call <anonymous>
Call foo

I think it should give

Error:
Uncaught Ltac2 exception: Tactic_failure
Backtrace:
Prim <ltac2:zero>
Call Control.zero
Call bar (bound in foo to fun () => Control.zero (Tactic_failure None))
Call foo

Error messages are confusing when types are not correctly parenthesized

"This expression has type unit -> unit list but an expression was expected of type unit -> unit list"

Require Import Ltac2.Ltac2.
Require Import Ltac2.Control.
Require Import Ltac2.Notations.

Goal True /\ 0 = 0.
  split; Control.dispatch (fun () => [Control.plus (fun _ => exact I) (fun _ => exact eq_refl)]).
  (* Error:
This expression has type unit -> unit list but an expression was expected of type
unit -> unit list
*)

More parentheses needed in type printer

I am trying to figure out what's going wrong with some code of mine, and getting this headache-inducing error message:

Error:
This expression has type (ident * Pattern.context) option list * (ident * constr) list but an expression was
expected of type
(ident * Pattern.context) option list * 'b list

Please add backtrace printer or debugger

I'd like to get a stack trace with something like Uncaught Ltac2 exception: Match_failure, or, at least, I'd like to be able to run the tactic in a way (or with options) that gives me such a trace

Question: how to properly call some OCaml code from Ltac2?

Hi @ppedrot,

In the validsdp library developed by @proux01 and I, we have:

  • an OCaml tactic (soswitness) that calls external solvers and retrieves a witness,
  • and a Ltac frontend that calls soswitness and behaves as a reflexive tactic.

We'd like to fully migrate to Ltac2.
As it didn't seem possible to call soswitness as is from Ltac2, we currently have a Ltac1 wrapper like this:

Ltac2 soswitness_wrapper input params :=
  Control.plus (fun () =>
    set_state_ltac2 input;
    set_state_ltac2 params;
    ltac1:(pop_state_ltac1 ltac:(fun params =>
      pop_state_ltac1 ltac:(fun input => let w := fresh "w" in
      soswitness of input as w with params;
      revert w)));
    pop_state_ltac2 ())
  (fun e => Control.throw e).

but it is somewhat unsatisfactory as the set_state…/pop_state… bookkeeping (basically a variant of generalize/intros) adds some unwanted, duplicate let-ins in the final proof term…

Hence the question: would you have pointers or advice regarding the OCaml interfacing w.r.t. Ltac2?

OPAM support

Hi @ppedrot,
With @proux01, we plan to prepare an opam package of our validsdp library in a couple of days (when I'll have finished the migration to Ltac2) to support Coq 8.7, 8.8, 8.9.

Currently the only versions available in released+extra-dev are:

$ opam show coq-ltac2
name         coq-ltac2
all-versions 0.1-8.7  8.7.dev  dev

Would you be OK to make a new release of Ltac2 for Coq 8.7/8.8/8.9?
Otherwise (if you think it's not relevant for the moment given the development roadmap), would you agree to create opam packages in extra-dev to map branches v8.7, v8.8, v8.9 to these versions of coq?

  • {(>= "8.7" & < "8.8~")}
  • {(>= "8.8" & < "8.9~")}
  • {(>= "8.9" & < "8.10~")}

If it helps, I can open a corresponding PR in opam-coq-archive / extra-dev

(Edit: sorry, I mis-clicked and my message was sent too early)

Ltac2 fails to build if COQBIN is "" and debianutils is not installed (which is not available)

It trys to run /coq_makefile, which is invalid. I think command -v might be more portable. (Note that the default travis build environment for c does not include which on trusty.)

Edit: Still trying to figure out why https://travis-ci.org/mit-plv/reification-by-parametricity/builds/373706226 fails to build Ltac2. Somehow it's trying to run /coq_makefile, but I no longer think it's because which is not installed.

[Coq 8.9+] Please fix deprecation warnings.

Please fix 8.9 deprecation warnings:

CAMLOPT -c -for-pack Ltac2_plugin src/tac2entries.ml
File "src/tac2entries.ml", line 753, characters 6-26:
Warning 3: deprecated: SelectAll
Use Goal_select.SelectAll
File "src/tac2entries.ml", line 756, characters 4-26:
Warning 3: deprecated: SelectNth
Use Goal_select.SelectNth
File "src/tac2entries.ml", line 757, characters 4-27:
Warning 3: deprecated: SelectList
Use Goal_select.SelectList
File "src/tac2entries.ml", line 758, characters 4-26:
Warning 3: deprecated: SelectId
Use Goal_select.SelectId
File "src/tac2entries.ml", line 759, characters 4-24:
Warning 3: deprecated: SelectAll
Use Goal_select.SelectAll
File "src/tac2entries.ml", line 760, characters 4-35:
Warning 3: deprecated: SelectAlreadyFocused
Use Goal_select.SelectAlreadyFocused

[warnings] Please fix OCaml warnings

Dear devs,

in Coq we are considering requiring plugins in the CI to use the same set of compiler flags for warnings than the main Coq tree (c.f. coq/coq#9605 ), in particular, this means that the plugins should now compile warning-free, except for deprecation notices.

Note that some of the raised warnings are really fatal, [like missing match cases].

Please, try to fix OCaml warnings present in your codebase, thanks!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.