Aqui está meu código Coq.
Eu esperava Check x ∪ y.
shows , x ∪ y
mas ∪ {x, y}
.
Por que? Ou existe outra ideia para definir a notação?
Minha versão do Coq é 8.16.1.
Section Test.
Variable set:Type.
Variable In : set -> set -> Prop.
Notation "x ∈ y" := (In y x) (at level 50).
Structure class φ := {
class_base :> set;
class_row : forall x, x ∈ class_base <-> φ x;
}.
Axiom build_union : forall F, class (fun x => exists Y, x ∈ Y /\ Y ∈ F).
Notation "∪ F" := (build_union F) (at level 50).
Axiom build_non_ordered_pair_set : forall x y, class (fun w => w = x \/ w = y).
Notation "{ x , y }" := (build_non_ordered_pair_set x y) (at level 45).
Notation "x ∪ y" := (∪ {x, y}) (at level 50).
Variable F x y:set.
Check ∪ F.
(* ∪ F *)
(* : class (fun x : set => exists Y : set, x ∈ Y /\ Y ∈ F) *)
Check {x, y}.
(* {x, y} *)
(* : class (fun w : set => w = x \/ w = y) *)
Check x ∪ y.
(* ∪ {x, y} <- Why is not x ∪ y ? *)
(* : class (fun x0 : set => exists Y : set, x0 ∈ Y /\ Y ∈ {x, y}) *)
End Test.
Eu sei que o código abaixo funciona bem.
Axiom build_two_union : forall x y, class (fun z => exists Y, z ∈ Y /\ Y ∈ {x, y}).
Notation "x ∪ y" := (build_two_union x y) (at level 2).
Check x ∪ y.
Parece que o elaborador insere uma coerção e então a impressora não reconhece a expressão associada à notação. Quando você escreve
x u y
, o analisador substitui a notação porbuild_union (build_non_ordered_pair_set x y)
, que é mal digitada, poisbuild_non_ordered_pair_set x y
possui tipoclass _
enquantobuild_union
espera aset
. Então o elaborador insereclass_base
o que você declarou como coerção, transformando o termo embuild_union (class_base _ (build_non_ordered_pair_set x y))
. Agora, a impressora reconhece as notações parau F
e{x, y}
, masclass_base
impede que ela reconheçax u y
.Se estiver certo, definir sua notação assim deve funcionar:
Notation "x ∪ y" := (build_union (class_base _ (build_non_ordered_pair_set x y)))
.