disj_union
商型 ( ) にリフトしたいセットに部分的に定義された演算子 (以下) がありますnatq
。道徳的には、これは問題ないと思います。なぜなら、演算子が定義されている代表を等価クラスで見つけることが常に可能だからです[*]。disj_union
ただし、は部分的にしか定義されていないため、リフトされた定義が等価性を保持するという証明を完成させることはできません。以下の私の理論ファイルでは、演算子を定義するために見つけた 1 つの方法を提案していますが、多くのand関数disj_union
を備えているので気に入らず、操作が難しいと思います (右?)。abs
Rep
イザベルで商を使ってこの種のものを定義する良い方法は何ですか?
theory My_Theory imports
"~~/src/HOL/Library/Quotient_Set"
begin
(* A ∪-operator that is defined only on disjoint operands. *)
definition "X ∩ Y = {} ⟹ disj_union X Y ≡ X ∪ Y"
(* Two sets are equivalent if they have the same cardinality. *)
definition "card_eq X Y ≡ finite X ∧ finite Y ∧ card X = card Y"
(* Quotient sets of naturals by this equivalence. *)
quotient_type natq = "nat set" / partial: card_eq
proof (intro part_equivpI)
show "∃x. card_eq x x" by (metis card_eq_def finite.emptyI)
show "symp card_eq" by (metis card_eq_def symp_def)
show "transp card_eq" by (metis card_eq_def transp_def)
qed
(* I want to lift my disj_union operator to the natq type.
But I cannot complete the proof, because disj_union is
only partially defined. *)
lift_definition natq_add :: "natq ⇒ natq ⇒ natq"
is "disj_union"
oops
(* Here is another attempt to define natq_add. I think it
is correct, but it looks hard to prove things about,
because it uses abstraction and representation functions
explicitly. *)
definition natq_add :: "natq ⇒ natq ⇒ natq"
where "natq_add X Y ≡
let (X',Y') = SOME (X',Y').
X' ∈ Rep_natq X ∧ Y' ∈ Rep_natq Y ∧ X' ∩ Y' = {}
in abs_natq (disj_union X' Y')"
end
[*] これは、バインドされた変数が衝突しないという条件でのみキャプチャ回避置換が定義される方法に少し似ています。アルファ等価クラスの別の代表者に名前を変更することで常に満たすことができる条件。