You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
semantics-2023/theories/lib/debruijn.v

48 lines
1.8 KiB

From iris.prelude Require Import prelude options.
From Autosubst Require Export Autosubst.
(* [idss n sigma] alters the substitution [sigma] by
"prepending" binders [0..n), so that [#i] is substituted for binder [i].
After that, the binders from [sigma] follow.
*)
Definition idss `{Ids X} (n : nat) (sigma : var X) (x : var) :=
if decide (x < n) then ids x else sigma (x - n).
Lemma idss_0 `{Ids X} (sigma : var X) :
idss 0 sigma = sigma.
Proof.
f_ext. intros x; unfold idss. simpl.
replace (x - 0) with x by lia. done.
Qed.
Lemma up_idss `{Ids X} `{Rename X} (sigma : var X) n :
(* this precondition holds for the instances we are interested in,
but is not a general law assumed by autosubst *)
( x : var, rename (+1) (ids x) = ids (S x))
up (idss n sigma) = idss (S n) (sigma >>> rename (+1) ).
Proof.
intros Hren_law.
f_ext. intros x. destruct x as [ | x]; unfold idss; simpl; first done.
unfold up. simpl.
destruct (decide (x < n)).
- rewrite decide_True; last lia. apply Hren_law.
- rewrite decide_False; last lia. done.
Qed.
(* We will also need something like [idss] to shift variable renamings [var → var].
Instead of doing a separate definition like
[ Definition idsc (n : nat) (sigma : var → var) (x : var) := if decide (x < n) then x else sigma (x - n). ]
we declare suitable instances to use [idss] for variable renamings.
*)
#[global] Instance Ids_var : Ids var. exact id. Defined.
#[global] Instance Rename_var : Rename var. exact id. Defined.
(* a lemma for the nat instance *)
Lemma upren_idss sigma n :
upren (idss n sigma) = idss (S n) (sigma >>> S).
Proof.
f_ext. intros x. destruct x as [ | x]; unfold idss; simpl; first done.
destruct (decide (x < n)).
- rewrite decide_True; [done | lia ].
- rewrite decide_False; lia.
Qed.