我該如何聲明Isabelle/HOL中不遵守排序約束的引理?如何聲明一個不尊重排序約束的引理(使用OFCLASS)
要解釋爲什麼這是有道理的,請看下面的例子理論:
theory Test
imports Main
begin
class embeddable =
fixes embedding::"'a ⇒ nat"
assumes "inj embedding"
lemma OFCLASS_I:
assumes "inj (embedding::'a⇒_)"
shows "OFCLASS('a::type,embeddable_class)"
apply intro_classes by (fact assms)
instantiation nat :: embeddable begin
definition "embedding = id"
instance
apply (rule OFCLASS_I) unfolding embedding_nat_def by simp
end
end
這種理論定義了一個類型的類「嵌入」用一個類型參數「嵌入」。 (基本上,可嵌入類通過明確枚舉來表徵可數數字,但我選擇這只是一個非常簡單的例子。)
爲了簡化類型類的實例驗證,理論指出了一個輔助引理OFCLASS_I
,它顯示目標的形式OFCLASS(...,embeddable)
。這個引理可以用來解決instance
產生的證明義務。
首先,我爲什麼要這麼做? (在本理論,apply (rule OFCLASS_I)
確實相同內建apply intro_classes
,因此是無用的。)在更復雜的情況下,有兩個原因這樣的引理:
- 該引理可以給替代標準的一個實例類型的類,使後續的證明更簡單。
- 引理可用於自動化(ML級)實例。這裏使用
intro_classes
是有問題的,因爲intro_classes
的子目標數量可能會根據之前執行的實例證明而有所不同。 (A引理如OFCLASS_I
具有穩定的,良好控制的子目標。)
然而,上述理論沒有在伊莎貝爾/ HOL(均未2015或2016-RC1)工作,因爲引理不類型檢查。排序約束「embedding ::(_ :: embeddable => _)」不滿足。然而,這種類型的限制並不是邏輯必然性(它不是由邏輯內核強制執行,而是由更高級別執行)。
那麼,有沒有一種清楚的陳述上述理論的方法? (我在答案中給出了一個稍微難看的解決方案,但我正在尋找更清潔的東西。)