Isabelle поддерживает перегруженные определения, определяя константное имя, а затем предоставляя константу новые определения для разных типов. Это можно сделать с помощью команды consts
для определения имени константы, а затем команды defs (overloaded)
для предоставления частичного определения.
Например:
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)"
Вышесказанное также будет работать без параметра (overloaded)
, но заставит Изабеллу выдать предупреждение.
Команда defs
также имеет имя, которое является именем теоремы, порожденной Изабеллой, которая содержит определение. Это имя может быть использовано в следующих доказательствах:
lemma "¬ is_default (Some 3)"
by (clarsimp simp: is_default_option)
Более подробная информация доступна в разделе «Константа и определение» в Isablle/Isar reference manual. Кроме того, Obua описывает бумагу "Conservative Overloading in Higher-Order Logic", в которой обсуждаются некоторые детали реализации и gotchas, имеющие такую структуру без ущерба для надежности.
Важно знать, что эти перегруженные константы полностью отделены: Это не представляется возможным доказать любое нетривиальное свойство о «is_default (а: : 'a) ". Поэтому, если различные реализации is_default должны использовать некоторые формальные свойства, типы классов могут быть более подходящим механизмом. –