blob: 8ac696e9125388e0d709350948a38844f96b18bb (
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
41
42
43
44
45
46
|
(* Check that dependencies in the indices of the type of the terms to
match are taken into account and correctly generalized *)
Require Import Relations.Relation_Definitions.
Require Import Basics.
Record Base := mkBase
{(* Primitives *)
World : Set
(* Names are real, links are theoretical *)
; Name : World -> Set
; wweak : World -> World -> Prop
; exportw : forall a b : World, (wweak a b) -> (Name b) -> option (Name a)
}.
Section Derived.
Variable base : Base.
Definition bWorld := World base.
Definition bName := Name base.
Definition bexportw := exportw base.
Definition bwweak := wweak base.
Implicit Arguments bexportw [a b].
Inductive RstarSetProof {I : Type} (T : I -> I -> Type) : I -> I -> Type :=
starReflS : forall a, RstarSetProof T a a
| starTransS : forall i j k, T i j -> (RstarSetProof T j k) -> RstarSetProof T i k.
Implicit Arguments starTransS [I T i j k].
Definition RstarInv {A : Set} (rel : relation A) : A -> A -> Type := (flip (RstarSetProof (flip rel))).
Definition bwweakFlip (b a : bWorld) : Prop := (bwweak a b).
Definition Rweak : forall a b : bWorld, Type := RstarInv bwweak.
Fixpoint exportRweak {a b} (aRWb : Rweak a b) (y : bName b) : option (bName a) :=
match aRWb,y with
| starReflS _ a, y' => Some y'
| starTransS jWk jRWi, y' =>
match (bexportw jWk y) with
| Some x => exportRweak jRWi x
| None => None
end
end.
|