[spectec] Handle shadowing in IL semantics (#2181)
diff --git a/spectec/doc/semantics/il/2-env.spectec b/spectec/doc/semantics/il/2-env.spectec
index f198b3b..0fff887 100644
--- a/spectec/doc/semantics/il/2-env.spectec
+++ b/spectec/doc/semantics/il/2-env.spectec
@@ -35,3 +35,24 @@
 def $paramenv(FUN x `: p* `-> t) = {FUN (x, p* `-> t `= eps)}
 def $paramenv(GRAM x `: p* `-> t) = {GRAM (x, p* `-> t `= eps)}
 def $paramenv(param*) = $composeenvs($paramenv(param)*)  -- otherwise
+
+
+;; Lookup
+
+
+def $lookup_typ(S, id) : typdef? hint(show %.TYP#(%))
+def $lookup_fun(S, id) : fundef? hint(show %.FUN#(%))
+def $lookup_rel(S, id) : reldef? hint(show %.REL#(%))
+def $lookup_gram(S, id) : gramdef? hint(show %.GRAM#(%))
+def $lookup_exp(S, id) : typ? hint(show %.EXP#(%))
+
+def $lookup_(syntax Y, (id, Y)*, id) : Y?
+def $lookup_(syntax Y, eps, x') = eps
+def $lookup_(syntax Y, (x, y)* (x', y'), x') = y'
+def $lookup_(syntax Y, (x, y)* (x'', y'), x') = $lookup_(Y, (x, y)*, x') -- if x'' =/= x'
+
+def $lookup_typ(S, x) = $lookup_(typdef, S.TYP, x)
+def $lookup_fun(S, x) = $lookup_(fundef, S.FUN, x)
+def $lookup_rel(S, x) = $lookup_(reldef, S.REL, x)
+def $lookup_gram(S, x) = $lookup_(gramdef, S.GRAM, x)
+def $lookup_exp(E, x) = $lookup_(typ, E.EXP, x)
diff --git a/spectec/doc/semantics/il/5-reduction.spectec b/spectec/doc/semantics/il/5-reduction.spectec
index ebe9a64..272c8e9 100644
--- a/spectec/doc/semantics/il/5-reduction.spectec
+++ b/spectec/doc/semantics/il/5-reduction.spectec
@@ -35,7 +35,7 @@
 
 rule Step_typ/VAR-apply:
   S |- VAR x a* ~> MATCH x a* WITH inst*
-  -- if (x, p* `-> OK `= inst*) <- S.TYP
+  -- if $lookup_typ(S, x) = (p* `-> OK `= inst*)
 
 rule Step_typ/MATCH-alias:
   S |- MATCH x eps WITH (INST `{} eps `=> ALIAS t) inst* ~> t
@@ -455,7 +455,7 @@
 
 rule Step_exp/CALL-apply:
   S |- CALL x a* ~> MATCH a* WITH clause*
-  -- if (x, p* `-> t `= clause*) <- S.FUN
+  -- if $lookup_fun(S, x) = (p* `-> t `= clause*)
 
 
 rule Step_exp/CVT-NUM-good:
@@ -1419,7 +1419,7 @@
 
 rule Step_prems/REL:
   S |- REL x a* `: e ~>_{} (pr'* (IF (CMP EQ $subst_exp(s ++ s', e') e)))
-  -- if (x, p* `-> t `= rul*) <- S.REL
+  -- if $lookup_rel(S, x) = (p* `-> t `= rul*)
   -- if (RULE `{q*} (e' `- pr*)) <- $subst_rule($args_for_params(a*, p*), rul)*
   -- Ok_subst: $storeenv(S) |- s : q*
   -- if (pr'*, s') = $refresh_prems(pr*)
diff --git a/spectec/doc/semantics/il/6-typing.spectec b/spectec/doc/semantics/il/6-typing.spectec
index 7cde9d6..44b4af9 100644
--- a/spectec/doc/semantics/il/6-typing.spectec
+++ b/spectec/doc/semantics/il/6-typing.spectec
@@ -108,7 +108,7 @@
 
 rule Ok_typ/VAR:
   E |- VAR x a* : OK
-  -- if (x, p* `-> OK `= inst*) <- E.TYP
+  -- if $lookup_typ(E, x) = (p* `-> OK `= inst*)
   -- Ok_args: E |- a* : p* => s
 
 rule Ok_typ/TUP-empty:
@@ -126,7 +126,7 @@
 
 rule Ok_typ/MATCH:
   E |- MATCH x a* WITH inst* : OK
-  -- if (x, p* `-> OK `= inst'*) <- E.TYP
+  -- if $lookup_typ(E, x) = (p* `-> OK `= inst'*)
   -- Ok_args: E |- a* : p* => s
   -- (Ok_inst: E |- inst : p* -> OK)*
 
@@ -243,7 +243,7 @@
 
 rule Ok_exp/VAR:
   E |- VAR x : t
-  -- if (x, t) <- E.EXP
+  -- if $lookup_exp(E, x) = t
 
 
 rule Ok_exp/UN-BOOL:
@@ -361,7 +361,7 @@
 
 rule Ok_exp/CALL:
   E |- CALL x a* : $subst_typ(s, t)
-  -- if (x, (p* `-> t `= cl*)) <- E.FUN
+  -- if $lookup_fun(E, x) = (p* `-> t `= cl*)
   -- Ok_args: E |- a* : p* => s
 
 
@@ -445,7 +445,7 @@
 
 rule Ok_sym/VAR:
   E |- VAR x a* : $subst_typ(s, t)
-  -- if (x, (p* `-> t `= prod*)) <- E.GRAM
+  -- if $lookup_gram(E, x) = (p* `-> t `= prod*)
   -- Ok_args: E |- a* : p* => s
 
 rule Ok_sym/NUM:
@@ -511,7 +511,7 @@
 
 rule Ok_prem/REL:
   E |- REL x a* `: e : OK -| {}
-  -- if (x, (p* `-> t `= rul*)) <- E.REL
+  -- if $lookup_rel(E, x) = (p* `-> t `= rul*)
   -- Ok_args: E |- a* : p* => s
   -- Ok_exp: E |- e : $subst_typ(s, t)
 
@@ -586,7 +586,7 @@
 
 rule Ok_arg/FUN:
   E |- FUN y : FUN x `: p* `-> t => {FUN (x, y)}
-  -- if (y, (p'* `-> t' `= clause*)) <- E.FUN
+  -- if $lookup_fun(E, y) = (p'* `-> t' `= clause*)
   -- Sub_params: E |- p* <: p'* => s
   -- Sub_typ: E |- $subst_typ(s, t') <: t
 
@@ -596,7 +596,7 @@
 
 rule Ok_arg/GRAM-higher:
   E |- GRAM (VAR y) : GRAM x `: p* `-> t => {GRAM (x, VAR y)}
-  -- if (y, (p'* `-> t' `= prod*)) <- E.GRAM
+  -- if $lookup_gram(E, y) = (p'* `-> t' `= prod*)
   -- Sub_params: E |- p* <: p'* => s
   -- Sub_typ: E |- $subst_typ(s, t') <: t