1 (**************************************************************************)
4 (* ||A|| A project by Andrea Asperti *)
6 (* ||I|| Developers: *)
7 (* ||T|| The HELM team. *)
8 (* ||A|| http://helm.cs.unibo.it *)
10 (* \ / This file is distributed under the terms of the *)
11 (* v GNU General Public License Version 2 *)
13 (**************************************************************************)
15 include "basic_2/notation/relations/unfold_3.ma".
16 include "basic_2/grammar/lenv_append.ma".
17 include "basic_2/relocation/ldrop.ma".
19 (* CONTEXT-SENSITIVE UNFOLD FOR TERMS ***************************************)
21 inductive unfold: lenv → relation2 term lenv ≝
22 | unfold_sort: ∀L,k. unfold L (⋆k) L
23 | unfold_lref: ∀I,L1,L2,K1,K2,V,i. ⇩[0, i] L1 ≡ K1. ⓑ{I}V →
24 unfold K1 V K2 → ⇩[|L2|, i] L2 ≡ K2 →
25 unfold L1 (#i) (L1@@L2)
26 | unfold_bind: ∀a,I,L1,L2,V,T.
27 unfold (L1.ⓑ{I}V) T L2 → unfold L1 (ⓑ{a,I}V.T) L2
28 | unfold_flat: ∀I,L1,L2,V,T.
29 unfold L1 T L2 → unfold L1 (ⓕ{I}V.T) L2
32 interpretation "context-sensitive unfold (term)"
33 'Unfold L1 T L2 = (unfold L1 T L2).