Coq中自反传递闭包的表示法

Coq中自反传递闭包的表示法,coq,Coq,考虑关系的自反传递闭包: Inductive star {A : Type} (r : A -> A -> Prop) : A -> A -> Prop := | star_refl x : star r x x | star_step x y z : r x y -> star r y z -> star r x z. 我如何用Coq表示,这样我就可以写x->*y,也许可以添加一个下标来表示关系->\uu r。这在伊莎贝尔身上当然是可能的。有没有一种干净的

考虑关系的自反传递闭包:

Inductive star {A : Type} (r : A -> A -> Prop) : A -> A -> Prop :=
| star_refl x : star r x x
| star_step x y z : r x y -> star r y z -> star r x z.

我如何用Coq表示,这样我就可以写
x->*y
,也许可以添加一个下标来表示关系
->\uu r
。这在伊莎贝尔身上当然是可能的。有没有一种干净的方法可以在Coq中使用

您确实可以使用Coq的符号系统:

Notation "x '[' R ']*' y" := (star R x y) (at level 20).

Goal
  forall A (x y z : A) R,
    x [R]* y ->
    y [R]* z ->
    x [R]* z.
您可以尝试使用其他符号,这是一个明确提到R的示例。 您只能将此通用表示法与特殊表示法结合使用以进行简化

Section Terms.

  Context (term : Type).
  Context (red : term -> term -> Prop).
  Notation "x → y" := (red x y) (at level 0).

  Notation "x →* y" := (x [red]* y) (at level 19).

  Goal forall x y, x → y -> x →* y.
  Abort.

End Terms.
还请注意,您可以做一些奇特的事情,并使用定义中已有的符号

Reserved Notation "x '[' R ']*' y" (at level 20).

Inductive star {A : Type} (r : A -> A -> Prop) : A -> A -> Prop :=
| star_refl x : x [r]* x
| star_step x y z : r x y -> y [r]* z -> x [r]* z

where "x '[' R ']*' y" := (star R x y).

你可以用符号做很多事情。下面的方法也适用

Notation "x '→<' R '>*' y" := (star R x y) (at level 20).

Goal
  forall A (x y z : A) R,
    x →<R>* y ->
    y →<R>* z ->
    x →<R>* z.
Abort.
符号“x”→*' y::=(星R x y)(在20级)。
目标
对于所有A(x y z:A)R,
x→* y->
Y→* z->
x→* Z
中止

不幸的是,括号是必要的?似乎需要与星形分开,如x[r]*x。它还抱怨最后一行中没有出现A型,不需要分离,我给你的是在Coq 8.11中编译的。没有括号,如
“x”→*' R y“
R
y
之间没有分隔符,因此它无法与应用程序区分开来。我将用另一个符号进行更新,以供您查看。