aboutsummaryrefslogtreecommitdiff
path: root/src/Util/SideConditions/CorePackages.v
blob: 8126c528088db7be2f2d0b2215c6967e81e85ca7 (plain)
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
Import EqNotations.

Record evar_package {T} (v : T) :=
  { val : T;
    evar_package_pf : val = v }.
Arguments val {T v} _.
Arguments evar_package_pf {T v} _.

Record evar_function_package {A B} (f : forall x : A, B x) :=
  { valf : forall x : A, B x;
    evarf_package_pf : forall x, valf x = f x }.
Arguments valf {A B f} _.
Arguments evarf_package_pf {A B f} _ _.

Record evard_package {s d} (v : s) :=
  { vald : d;
    evard_package_pfT : s = d;
    evard_package_pf : vald = rew evard_package_pfT in v }.
Arguments vald {s d v} _.
Arguments evard_package_pfT {s d v} _.
Arguments evard_package_pf {s d v} _.

Local Notation "'rew' 'dependent' H 'in' H'"
  := (match H with
      | eq_refl => H'
      end)
       (at level 10, H' at level 10,
        format "'[' 'rew'  'dependent'  '/    ' H  in  '/' H' ']'").

Record evard_function_package {sA sB dA dB} (f : forall x : sA, sB x) :=
  { valdf : forall x : dA, dB x;
    evardf_package_pfTA : dA = sA;
    evardf_package_pfTB : forall x, sB (rew evardf_package_pfTA in x) = dB x;
    evardf_package_pf : forall x, valdf x = rew dependent evardf_package_pfTB x in (f (rew evardf_package_pfTA in x)) }.
Arguments valdf {sA sB dA dB f} _ _.
Arguments evardf_package_pfTA {sA sB dA dB f} _.
Arguments evardf_package_pfTB {sA sB dA dB f} _.
Arguments evardf_package_pf {sA sB dA dB f} _ _.

Ltac autosolve else_tac := else_tac ().