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 (**************************************************************************)
17 Notation for hint declaration
18 ==============================
20 The idea is to write a context, with abstraction first, then
21 recursive calls (let-in) and finally the two equivalent terms.
22 The context can be empty. Note the ; to begin the second part of
23 the context (necessary even if the first part is empty).
25 unification hint PREC \coloneq
27 ; ID \equest T, ..., ID \equest T
30 With unidoce and some ASCII art it looks like the following:
32 unification hint PREC ≔ ID : TY, ..., ID : TY;
34 (*---------------------*) ⊢
37 The order of premises is relevant, since they are processed in order
42 (* it seems unbelivable, but it works! *)
43 notation > "≔ (list0 ( (list1 (ident x) sep , ) opt (: T) ) sep ,) opt (; (list1 (ident U ≟ term 19 V ) sep ,)) ⊢ term 19 Px ≡ term 19 Py"
48 @{ 'hint_decl $Px $Py }
49 rec acc1 @{ let ( ${ident U} : ?) ≝ $V in $acc1} } }
50 @{ 'hint_decl $Px $Py }
54 ${ fold right @{ $acc } rec acc2
55 @{ ∀${ident x}:${ default @{ $T } @{ ? } }.$acc2 } }
59 (* it seems unbelivable, but it works! *)
60 notation > "≔ (list0 ( (list1 (ident x) sep , ) opt (: T) ) sep ,) opt (; (list1 (ident U ≟ term 19 V ) sep ,)) ⊢ term 19 Px ≡≡ term 19 Py"
65 @{ 'hint_decl2 $Px $Py }
66 rec acc1 @{ let ( ${ident U} : ?) ≝ $V in $acc1} } }
67 @{ 'hint_decl2 $Px $Py }
71 ${ fold right @{ $acc } rec acc2
72 @{ ∀${ident x}:${ default @{ $T } @{ ? } }.$acc2 } }
76 include "basics/pts.ma".
78 definition hint_declaration_Type0 ≝ λA:Type[0] .λa,b:A.Prop.
79 definition hint_declaration_Type1 ≝ λA:Type[1].λa,b:A.Prop.
80 definition hint_declaration_Type2 ≝ λa,b:Type[2].Prop.
81 definition hint_declaration_CProp0 ≝ λA:CProp[0].λa,b:A.Prop.
82 definition hint_declaration_CProp1 ≝ λA:CProp[1].λa,b:A.Prop.
83 definition hint_declaration_CProp2 ≝ λa,b:CProp[2].Prop.
85 interpretation "hint_decl_Type2" 'hint_decl2 a b = (hint_declaration_Type2 a b).
86 interpretation "hint_decl_CProp2" 'hint_decl2 a b = (hint_declaration_CProp2 a b).
87 interpretation "hint_decl_Type1" 'hint_decl a b = (hint_declaration_Type1 ? a b).
88 interpretation "hint_decl_CProp1" 'hint_decl a b = (hint_declaration_CProp1 ? a b).
89 interpretation "hint_decl_CProp0" 'hint_decl a b = (hint_declaration_CProp0 ? a b).
90 interpretation "hint_decl_Type0" 'hint_decl a b = (hint_declaration_Type0 ? a b).
92 (* Non uniform coercions support
93 record solution2 (S : Type[2]) (s : S) : Type[3] ≝ {
98 record solution1 (S : Type[1]) (s : S) : Type[2] ≝ {
103 coercion nonunifcoerc1 : ∀S:Type[1].∀s:S.∀l:solution1 S s. target1 S s l ≝ result1
104 on s : ? to target1 ???.
106 coercion nonunifcoerc2 : ∀S:Type[2].∀s:S.∀l:solution2 S s. target2 S s l ≝ result2
107 on s : ? to target2 ???.
110 (* Example of a non uniform coercion declaration
118 unification hint 0 ≔ R : setoid;
120 sol ≟ mk_solution1 Type[0] MR setoid R
121 (* ---------------------------------------- *) ⊢
122 setoid ≡ target1 ? MR sol.