Library Substitutions






Definition of Substitutions



Require Import Calculus.
Require Import Arith.
Require Import MatchCompNat.
Require Import List.

Module SetProgram(My_Program: Program).

Import My_Program.


Require Subclassing.
Module My_Subclassing := Subclassing.SetProgram(My_Program).

Import My_Subclassing.











Function: substitutes q for this in path p

Definition thisSubst_in_path (p: Path) (q: Path): Path :=
  match p with
    | (Path_this) => q
    | _ => p
  end
.

Function: substitutes q for this in type T

Definition thisSubst_in_type (T: type) (q: Path): type :=
  match T with
    | (type_virtual p L) => (type_virtual (thisSubst_in_path p q) L)
    | (type_class C) => (type_class C)
  end
.

Function: substitutes q for this in term t

Fixpoint thisSubst_in_term (t: Term) (q: Path) {struct t}: Term :=
  match t with
    | (Term_this) => (path_to_term q)
    | (Term_param x) => (Term_param x)
    | (Term_var n) => (Term_var n)
    | (Term_select p f) => (Term_select (thisSubst_in_path p q) f)
    | (Term_new C fts) => (Term_new C (thisSubst_in_fieldTermList fts q))
    | (Term_call p m xts) => (Term_call (thisSubst_in_path p q) m (thisSubst_in_paramTermList xts q))
    | (Term_loc T u u') => (Term_loc (thisSubst_in_type T q) (thisSubst_in_term u q) (thisSubst_in_term u' q))
  end

Function: substitutes q for this in bindings fts

with thisSubst_in_fieldTermList (fts: FieldTermList) (q: Path) {struct fts}: FieldTermList :=
  match fts with
    | FieldTerm_nil => FieldTerm_nil
    | (FieldTerm_cons f t fts') => (FieldTerm_cons f (thisSubst_in_term t q) (thisSubst_in_fieldTermList fts' q))
  end

Function: substitutes q for this in bindings xts

with thisSubst_in_paramTermList (xts: ParamTermList) (q: Path) {struct xts}: ParamTermList :=
  match xts with
    | ParamTerm_nil => ParamTerm_nil
    | (ParamTerm_cons x t xts') => (ParamTerm_cons x (thisSubst_in_term t q) (thisSubst_in_paramTermList xts' q))
  end
.









Function: substitutes v for the variable n in path p

Definition varSubst_in_path (p: Path) (n: VarSym) (v: Value): Path :=
  match p with
    | (Path_this) => (Path_this)
    | (Path_param x) => (Path_param x)
    | (Path_var i) =>
      (match_comp_nat3 i n Path
        (Path_var i)
        (Path_value v)
        (Path_var (pred i))
      )
    | (Path_value v) => (Path_value v)
  end
.

Function: substitutes v for the variable n in type T

Definition varSubst_in_type (T: type) (n: VarSym) (v: Value): type :=
  match T with
    | (type_virtual p L) => (type_virtual (varSubst_in_path p n v) L)
    | (type_class C) => (type_class C)
  end
.

Function: substitutes v for the variable n in term t

Fixpoint varSubst_in_term (t: Term) (n: VarSym) (v: Value) {struct t}: Term :=
  match t with
    | (Term_this) => (Term_this)
    | (Term_param x) => (Term_param x)
    | (Term_var i) =>
      (match_comp_nat3 i n Term
        (Term_var i)
        (value_to_term v)
        (Term_var (pred i))
      )
    | (Term_select p f) => (Term_select (varSubst_in_path p n v) f)
    | (Term_new C fts) => (Term_new C (varSubst_in_fieldTermList fts n v))
    | (Term_call p m xts) => (Term_call (varSubst_in_path p n v) m (varSubst_in_paramTermList xts n v))
    | (Term_loc T u u') => (Term_loc (varSubst_in_type T n v) (varSubst_in_term u n v) (varSubst_in_term u' (S n) v))
  end

Function: substitutes v for the variable n in bindings xts

with varSubst_in_paramTermList (xts: ParamTermList) (n: VarSym) (v: Value) {struct xts}: ParamTermList :=
  match xts with
    | (ParamTerm_nil) => (ParamTerm_nil)
    | (ParamTerm_cons x t xts') => (ParamTerm_cons x (varSubst_in_term t n v) (varSubst_in_paramTermList xts' n v))
  end

Function: substitutes v for the variable n in bindings fts

with varSubst_in_fieldTermList (fts: FieldTermList) (n: VarSym) (v: Value) {struct fts}: FieldTermList :=
  match fts with
    | (FieldTerm_nil) => (FieldTerm_nil)
    | (FieldTerm_cons f t fts') => (FieldTerm_cons f (varSubst_in_term t n v) (varSubst_in_fieldTermList fts' n v))
  end
.











Function: substitutes v for the parameter x in path p

Definition paramSubst_in_path (p: Path) (x: ParamSym) (v: Value): Path :=
  match p with
    | (Path_param y) => if (ParamSym_eq x y) then (Path_value v) else p
    | _ => p
  end
.

Function: substitutes v for the parameter x in type T

Definition paramSubst_in_type (T: type) (x: ParamSym) (v: Value): type :=
  match T with
    | (type_virtual p L) => (type_virtual (paramSubst_in_path p x v) L)
    | (type_class C) => (type_class C)
  end
.

Function: substitutes v for the parameter x in term t

Fixpoint paramSubst_in_term (t: Term) (x: ParamSym) (v: Value) {struct t}: Term :=
  match t with
    | (Term_this) => (Term_this)
    | (Term_param y) => if (ParamSym_eq x y) then (value_to_term v) else (Term_param y)
    | (Term_var n) => (Term_var n)
    | (Term_select p f) => (Term_select (paramSubst_in_path p x v) f)
    | (Term_new C fts) => (Term_new C (paramSubst_in_fieldTermList fts x v))
    | (Term_call p m xts) => (Term_call (paramSubst_in_path p x v) m (paramSubst_in_paramTermList xts x v))
    | (Term_loc T u u') => (Term_loc (paramSubst_in_type T x v) (paramSubst_in_term u x v) (paramSubst_in_term u' x v))
  end

Function: substitutes v for the parameter x in bindings fts

with paramSubst_in_fieldTermList (fts: FieldTermList) (x: ParamSym) (v: Value) {struct fts}: FieldTermList :=
  match fts with
    | FieldTerm_nil => FieldTerm_nil
    | (FieldTerm_cons f t fts') => (FieldTerm_cons f (paramSubst_in_term t x v) (paramSubst_in_fieldTermList fts' x v))
  end

Function: substitutes v for the parameter x in bindings xts

with paramSubst_in_paramTermList (xts: ParamTermList) (x: ParamSym) (v: Value) {struct xts}: ParamTermList :=
  match xts with
    | ParamTerm_nil => ParamTerm_nil
    | (ParamTerm_cons y t xts') => (ParamTerm_cons y (paramSubst_in_term t x v) (paramSubst_in_paramTermList xts' x v))
  end
.

Function: converts a list of values to a list of terms

Fixpoint paramValueList_to_ParamTermList (xvs: list (ParamSym * Value)) {struct xvs}: ParamTermList :=
  match xvs with
    | nil => (ParamTerm_nil)
    | (x,v) :: xvs' => (ParamTerm_cons x (value_to_term v) (paramValueList_to_ParamTermList xvs'))
  end
.

Function: substitutes values vs for the parameter xs in term t when xvs = (xs,vs)

Definition map_paramSubst_in_term (t: Term) (xvs: list (ParamSym * Value)): Term :=
  (fold_left
    (fun t' (xv: (ParamSym * Value)) => let (x,v) := xv in (paramSubst_in_term t' x v))
    xvs
    t
  )
.

Definition map_paramSubst_in_path (p: Path) (xvs: list (ParamSym * Value)): Path :=
  (fold_left
    (fun p' (xv: (ParamSym * Value)) => let (x,v) := xv in (paramSubst_in_path p' x v))
    xvs
    p
  )
.

Definition map_paramSubst_in_type (T: type) (xvs: list (ParamSym * Value)): type :=
  (fold_left
    (fun T' (xv: (ParamSym * Value)) => let (x,v) := xv in (paramSubst_in_type T' x v))
    xvs
    T
  )
.

Definition map_paramSubst_in_fieldTermList (fts: FieldTermList) (xvs: list (ParamSym * Value)): FieldTermList :=
  (fold_left
    (fun fts' (xv: (ParamSym * Value)) => let (x,v) := xv in (paramSubst_in_fieldTermList fts' x v))
    xvs
    fts
  )
.

Definition map_paramSubst_in_paramTermList (xts: ParamTermList) (xvs: list (ParamSym * Value)): ParamTermList :=
  (fold_left
    (fun xts' (xv: (ParamSym * Value)) => let (x,v) := xv in (paramSubst_in_paramTermList xts' x v))
    xvs
    xts
  )
.








Lemma polySubst_in_pathThis:
  forall (xvs: list (ParamSym * Value)),
    (map_paramSubst_in_path Path_this xvs) = Path_this
.


Lemma polySubst_in_pathVar:
  forall (xvs: list (ParamSym * Value)),
    forall (i: VarSym),
      (map_paramSubst_in_path (Path_var i) xvs) = (Path_var i)
.


Lemma polySubst_in_pathValue:
  forall (xvs: list (ParamSym * Value)),
    forall (v: Value),
      (map_paramSubst_in_path (Path_value v) xvs) = (Path_value v)
.


Lemma polySubst_in_pathParam:
  forall (xvs: list (ParamSym * Value)) (x: ParamSym),
    (
      (forall (v: Value), ~(In (x, v) xvs)) /\
      (map_paramSubst_in_path (Path_param x) xvs) = (Path_param x)
    ) \/
    exists v: Value,
      (In (x, v) xvs) /\
      (map_paramSubst_in_path (Path_param x) xvs) = (Path_value v)
.


Lemma polySubst_in_pathParam_corollary:
  forall (xvs: list (ParamSym * Value)),
    forall (x: ParamSym),
      (map_paramSubst_in_path (Path_param x) xvs) = (Path_param x) \/
      exists v: Value,
        (map_paramSubst_in_path (Path_param x) xvs) = (Path_value v)
.


Lemma polySubst_in_fieldTermNil:
  forall (xvs : list (ParamSym * Value)),
    (map_paramSubst_in_fieldTermList FieldTerm_nil xvs) = FieldTerm_nil
.


Lemma polySubst_in_fieldTermCons:
  forall (xvs : list (ParamSym * Value)),
    forall (f: FieldSym) (t: Term) (fts: FieldTermList),
      (map_paramSubst_in_fieldTermList (FieldTerm_cons f t fts) xvs) =
      (FieldTerm_cons f (map_paramSubst_in_term t xvs) (map_paramSubst_in_fieldTermList fts xvs))
.

Lemma polySubst_in_paramTermNil:
  forall (xvs : list (ParamSym * Value)),
    (map_paramSubst_in_paramTermList ParamTerm_nil xvs) = ParamTerm_nil
.

Lemma polySubst_in_paramTermCons:
  forall (xvs : list (ParamSym * Value)),
    forall (x: ParamSym) (t: Term) (xts: ParamTermList),
      (map_paramSubst_in_paramTermList (ParamTerm_cons x t xts) xvs) =
      (ParamTerm_cons x (map_paramSubst_in_term t xvs) (map_paramSubst_in_paramTermList xts xvs))
.


Lemma polySubst_in_termThis:
  forall (xvs: list (ParamSym * Value)),
    (map_paramSubst_in_term Term_this xvs) = Term_this
.


Lemma polySubst_in_termVar:
  forall (i: VarSym) (xvs: list (ParamSym * Value)),
    (map_paramSubst_in_term (Term_var i) xvs) = (Term_var i)
.

Lemma polySubst_in_termSelect:
  forall (xvs: list (ParamSym * Value)),
    forall (p: Path) (f: FieldSym),
      (map_paramSubst_in_term (Term_select p f) xvs) =
      (Term_select (map_paramSubst_in_path p xvs) f)
.


Lemma polySubst_in_termNew:
  forall (xvs: (list (ParamSym * Value))),
    forall (C: ClassSym) (fts: FieldTermList),
      (map_paramSubst_in_term (Term_new C fts) xvs) =
      (Term_new C (map_paramSubst_in_fieldTermList fts xvs))
.

Lemma polySubst_in_termCall:
  forall (xvs: (list (ParamSym * Value))),
    forall (p: Path) (m: MethodSym) (xts: ParamTermList),
      (map_paramSubst_in_term (Term_call p m xts) xvs) =
      (Term_call (map_paramSubst_in_path p xvs) m (map_paramSubst_in_paramTermList xts xvs))
.

Lemma polySubst_in_termLet:
  forall (xvs: (list (ParamSym * Value))),
    forall (T: type) (t u: Term),
      (map_paramSubst_in_term (Term_loc T t u) xvs) =
      (Term_loc (map_paramSubst_in_type T xvs) (map_paramSubst_in_term t xvs) (map_paramSubst_in_term u xvs))
.


Lemma polySubst_in_typeVirtual:
  forall (xvs: list (ParamSym * Value)),
    forall (p: Path) (L: TypeSym),
      (map_paramSubst_in_type (type_virtual p L) xvs) =
      (type_virtual (map_paramSubst_in_path p xvs) L)
.


Lemma polySubst_in_typeClass:
  forall (xvs: list (ParamSym * Value)),
    forall (C: ClassSym),
      (map_paramSubst_in_type (type_class C) xvs) =
      (type_class C)
.



Definition polySubst_in_termValue_prop1 (v: Value): Prop :=
  forall (xvs: (list (ParamSym * Value))),
    (map_paramSubst_in_term (value_to_term v) xvs) = (value_to_term v)
.

Definition polySubst_in_termValue_prop2 (fvs: FieldValueList): Prop :=
  forall (xvs: (list (ParamSym * Value))),
    (map_paramSubst_in_fieldTermList (fieldValueList_to_fieldTermList fvs) xvs) =
    (fieldValueList_to_fieldTermList fvs)
.


Values are invariant by repeated substitutions for parameters

Lemma polySubst_in_termValue:
  forall (v: Value) (xvs: (list (ParamSym * Value))),
    (map_paramSubst_in_term (value_to_term v) xvs) = (value_to_term v)
.

Lemma polySubst_in_termParam:
  forall (xvs: list (ParamSym * Value)) (x: ParamSym),
    (
      (forall (v: Value), ~(In (x, v) xvs)) /\
      (map_paramSubst_in_term (Term_param x) xvs) = (Term_param x)
    ) \/
    exists v: Value,
      (In (x, v) xvs) /\
      (map_paramSubst_in_term (Term_param x) xvs) = (value_to_term v)
.


Lemma polySubst_in_termParam_corollary:
  forall (xvs: list (ParamSym * Value)),
    forall (x: ParamSym),
      (map_paramSubst_in_term (Term_param x) xvs) = (Term_param x) \/
      exists v: Value,
        (map_paramSubst_in_term (Term_param x) xvs) = (value_to_term v)
.



End SetProgram.



Index
This page has been generated by coqdoc