TypingFlags icon indicating copy to clipboard operation
TypingFlags copied to clipboard

Positivity cheking for type constructor applied to itself

Open clarus opened this issue 5 years ago • 2 comments

Hi,

I have some troubles to deactivate the positivity checking. When I do:

From TypingFlags Require Import Loader.

Unset Guard Checking.

Inductive foo : Type :=
| bar : (foo -> unit) -> foo.

the definition of foo is indeed accepted without the following message:

Error: Non strictly positive occurrence of "foo" in "(foo -> unit) -> foo".

However, with:

Inductive foo : Type -> Type :=
| bar : foo (foo unit).

I still get:

Error: Non strictly positive occurrence of "foo" in "foo (foo unit)".

even with Unset Guard Checking.. Is this kind of positivity check covered by the flag? Tested with Coq 8.9.1. Thanks.

clarus avatar Dec 02 '19 11:12 clarus

Hi @clarus, sorry for the delay. In this branch I can define your inductive: https://github.com/SimonBoulier/coq/tree/uncheck_positivity_bug

Unset Positivity Checking.

Inductive foo : Type -> Type :=
| bar : foo (foo unit).

But I don't know what we can do with it...

Do you think it is worth merging in Coq?

SimonBoulier avatar Mar 10 '20 14:03 SimonBoulier

Hi,

Top, thanks, excellent news!

For our work on the crypto-currency Tezos, to formalize the OCaml code https://gitlab.com/tezos/tezos/-/blob/master/src/proto_alpha/lib_protocol/script_typed_ir.ml in Coq we would need to support such types. Indeed, this GADT describing the syntax of the smart-contracts contains such types with self-referencing. For now what we do is what we erase the type annotations, but then we need to add unsafe casts in the matchs.

So for us this would be quite useful!

clarus avatar Mar 10 '20 15:03 clarus