Isabelle supporta definizioni sovraccariche definendo un nome costante e quindi fornendo in seguito la costante con nuove definizioni per tipi diversi. Questo può essere fatto con il comando consts
per definire il nome della costante, e quindi il comando defs (overloaded)
per fornire una definizione parziale.
Ad esempio:
consts is_default :: "'a ⇒ bool"
defs (overloaded) is_default_nat:
"is_default a ≡ ((a::nat) = 0)"
defs (overloaded) is_default_option:
"is_default a ≡ (a = None)"
Quanto sopra funzionare anche senza il parametro (overloaded)
, ma causerà Isabelle ad emettere un avviso.
Al comando defs
viene anche assegnato un nome, che è il nome del teorema generato da Isabelle che contiene la definizione. Questo nome può quindi essere utilizzato in prove successive:
lemma "¬ is_default (Some 3)"
by (clarsimp simp: is_default_option)
Ulteriori informazioni sono disponibili nella sezione "Costanti e definizioni" nel Isablle/Isar reference manual. Inoltre, vi è un documento "Conservative Overloading in Higher-Order Logic" di Obua che discute alcuni dettagli di implementazione e trucchi per avere una tale struttura senza sacrificare la solidità.
E 'importante essere consapevoli che queste costanti sovraccaricati sono totalmente separati: Non è possibile provare qualsiasi proprietà non banale di "is_default (un: : 'a) ". Quindi, se le varie implementazioni di is_default dovrebbero condividere alcune proprietà formali, le classi di tipi potrebbero essere un meccanismo più adatto. –