セットがあるとしますA ⊆ nat
。Isabelle a function でモデル化したいと思いますf : A ⇒ Y
。次のいずれかを使用できます。
- 部分関数、つまり type
nat ⇒ Y option
のいずれか、または - 合計関数、つまり に
nat ⇒ Y
ない入力に対して指定されていない型の 1 つA
。
どちらが「より良い」オプションなのだろうか。いくつかの要因があります。
「部分関数」アプローチは、部分関数の等価性を比較する方が簡単であるため、優れています。つまり、 が
f
別の関数 と等しいかどうかを確認したい場合はg : A ⇒ Y
、 とだけ言いf = g
ます。f
指定されていない合計関数とを比較するg
には、 と言わざるを得ません∀x ∈ A. f x = g x
。「指定されていない合計関数」アプローチの方が優れています。これは、構築/分解
option
型を常に気にする必要がないためです。たとえば、f
が指定されていない合計関数でありx ∈ A
、 である場合は とだけ言えますが、 が部分関数であるf x
場合は と言わなければなりません。別の例として、関数全体よりも部分関数で関数合成を行う方がトリッキーです。f
(the ∘ f) x
この質問に関連する具体的な例として、単純なグラフを形式化する次の試みを検討してください。
type_synonym node = nat
record 'a graph =
V :: "node set"
E :: "(node × node) set"
label :: "node ⇒ 'a"
グラフは、一連のノード、ノード間のエッジ関係、およびlabel
各ノードの で構成されます。にあるノードのラベルだけを気にしV
ます。では、 をlabel
含む部分関数node ⇒ 'a option
にする必要がありますか、それともdom label = V
の外で指定されていない合計関数にする必要がありV
ますか?