1
(* Nijmegen expects redefinition of sorts *)
2
Definition CProp := Prop.
3
Record test : CProp := {n : nat ; m : bool ; _ : n <> 0 }.
4
Require Import Program.
7
Record vector {A : Type} {n : nat} := { vec_list : list A ; vec_len : length vec_list = n }.
8
Implicit Arguments vector [].
10
Coercion vec_list : vector >-> list.
12
Hint Rewrite @vec_len : datatypes.
14
Ltac crush := repeat (program_simplify ; autorewrite with list datatypes ; auto with *).
16
Obligation Tactic := crush.
18
Program Definition vnil {A} : vector A 0 := {| vec_list := [] |}.
20
Program Definition vcons {A n} (a : A) (v : vector A n) : vector A (S n) :=
21
{| vec_list := cons a (vec_list v) |}.
23
Hint Rewrite map_length rev_length : datatypes.
25
Program Definition vmap {A B n} (f : A -> B) (v : vector A n) : vector B n :=
26
{| vec_list := map f v |}.
28
Program Definition vreverse {A n} (v : vector A n) : vector A n :=
29
{| vec_list := rev v |}.
31
Fixpoint va_list {A B} (v : list (A -> B)) (w : list A) : list B :=
34
| cons f fs, cons x xs => cons (f x) (va_list fs xs)
38
Program Definition va {A B n} (v : vector (A -> B) n) (w : vector A n) : vector B n :=
39
{| vec_list := va_list v w |}.
42
destruct v as [v Hv]; destruct w as [w Hw] ; simpl.
43
subst n. revert w Hw. induction v ; destruct w ; crush.
47
(* Correct type inference of record notation. Initial example by Spiwack. *)
53
Definition bli : Machin :=
54
{| Bazar := Some ({| Bazar := None |}:Machin) |}.
56
Definition bli' : option (option Machin) :=
57
Some (Some {| Bazar := None |} ).
59
Definition bli'' : Machin :=
60
{| Bazar := Some {| Bazar := None |} |}.
62
Definition bli''' := {| Bazar := Some {| Bazar := None |} |}.
64
(** Correctly use scoping information *)
66
Require Import ZArith.
68
Record Foo := { bar : Z }.
69
Definition foo := {| bar := 0 |}.
71
(** Notations inside records *)
73
Require Import Relation_Definitions.
75
Record DecidableOrder : Type :=
77
; le : relation A where "x <= y" := (le x y)
78
; le_refl : reflexive _ le
79
; le_antisym : antisymmetric _ le
80
; le_trans : transitive _ le
81
; le_total : forall x y, {x <= y}+{y <= x}