File: bug_21053.v

package info (click to toggle)
coq 9.1.0%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 35,964 kB
  • sloc: ml: 239,908; sh: 4,355; python: 2,985; ansic: 2,644; makefile: 874; lisp: 171; javascript: 63; xml: 24; sed: 2
file content (41 lines) | stat: -rw-r--r-- 1,008 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Notation "'rew' [ f ] e 'in' x" := (eq_rect _ f x _ e) (at level 10, x at level 10).

Definition cast_rev e : nat -> nat :=
  rew [fun (T : Set) => T -> nat] eq_sym e in fun x => x.

Fail Fixpoint f (e : nat = nat) (n : nat) {struct n} :=
  match n with
  | 0 => 0
  | S n => S (f e (cast_rev e n))
end.
(* Problematic fixpoint : [cast_rev_e n] should not be a subterm of [n] *)

#[bypass_check(guard)]
Fixpoint f (e : nat = nat) (n : nat) {struct n} :=
  match n with
  | 0 => 0
  | S n => S (f e (cast_rev e n))
end.

Section Issue.
Context (e : nat = nat). (* Supposed non-trivial *)
Context (e0 : rew [fun (T : Set) => T] e in 0 = 1).
(* How the non triviality may appear *)

Corollary e0' : cast_rev e 0 = 1.
Proof.
  rewrite <- e0. clear e0.
  unfold cast_rev.
  generalize 0.
  destruct e.
  reflexivity.
Defined.

Theorem Boom : False.
  enough (f e 1 = S (f e 1)) by now induction (f e 1); auto.
  change (f e 1) with (S (f e (cast_rev e 0))) at 1.
  f_equal. f_equal.
  apply e0'.
Qed.

End Issue.