我想为类型上下文定义一个类似于以下内容的符号:
{ x1 : T1, x2 : T2, x3 : T3 }
但是,我无法找到一种递归定义这种表示法的方法。我的猜测如下:
Notation "{ x1 : T1 , .. , xn : Tn }" := (cons (x1, T1) .. (cons (xn, Tn)) ..).
我收到以下错误:“找不到递归模式的起始位置。”
这样的递归表示法是否可能,如果可以,怎么办?
答案 0 :(得分:3)
Coq似乎没有将x1 : T1
和xn : Tn
识别为表达式,而是将符号解析为{ x1 : (T1 , .. , xn) : Tn }
。建议在以下两个步骤中定义符号。
Section T. (* To see the effect of the notation after closing this section. *)
(* recursive list notation *)
Notation "{ x1 , .. , xn }" :=
(cons x1 .. (cons xn nil) ..).
(* pair notation *)
Notation "x : T" := ((x, T))
(at level 100).
Definition z := { 3 : 4, 5 : 6, 7 : 8 }.
Print z.
(* z = {3 : 4, 5 : 6, 7 : 8} *)
End T.
Print z.
(* z = ((3, 4) :: (5, 6) :: (7, 8) :: nil)%list *)