セットがあるとします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ますか?