在Isabelle / HOL中,如何找到给定类实例化给定类型的位置?例如,出于本文的目的,其中real
被实例化为conditionally_complete_linorder
。为了说明这个问题,我可能想知道这一点,以启发灵感来进行类似的实例化,将其展示给某人,伊莎贝尔(Isabelle)/ HOL练习阅读,好奇心等等。我目前的流程:
首先,检查它是否确实是:键入instantiation real :: conditionally_complete_linorder begin end
,然后查看是否收到错误消息“实例化中没有参数且没有待定的实例证明义务”。
接下来,最好是在 where 之前,我需要知道操作方式,即它是直接的还是通过类C_1
[,{{1} },C_2
等。然后,我需要找到这些实例在哪里,无论是显式的C_3
还是隐式的instantiation real :: conditionally_complete_linorder
实例(对于c的两种情况都相同)。我不知道如何找到方法,因此我必须先检查一个显式实例化,然后是所有可能的隐式实例化。
为明确起见,我可以做一个C_i
(并希望空格不会很奇怪,或者做一个更健壮的搜索:))。对AFP位置重复上述步骤。或者,要保留在jEdit窗口中:
通过键入grep -Ern ~/.local/src/Isabelle2019 -e 'instantiation real :: conditionally_complete_linorder'
,然后按住Ctrl键单击类名,然后使用Ctrl-f检查term "x::'a::conditionally_complete_linorder"
是否在该文件中直接实例化,我可以找到类本身的定义位置。
然后我可以通过键入real
并按住Ctrl键单击real
,然后按住Ctrl-f键来term "x::real"
,检查是否实例化了定义类型real
的位置。在该文件中。
(如果在任意一个位置中,它将位于导入层次结构中的下一个位置,但我发现只需简单地完成这两个步骤。)但是,如果两个地方都不打开,则无论出于何种原因,它在其他地方显式实例化或隐式实例化。因此,conditionally_complete_linorder
更强大。
如果显式没有任何变化,那么我检查隐式。查看grep
图,我可以看到class_deps
可以跟随conditionally_complete_linorder
或complete_linorder
。然后,我可以通过查看linear_continuum
是否被实例化为它们中的任何一个来继续搜索(不管我碰巧知道real
都不能被实例化为)。我还可以检查它是否同时实例化为real
和conditioanlly_complete_lattice
,这就是我可以看到的linorder
是*的简单组合(没有其他假设)。递归地对所有这些类重复,直到找到实例化为止。在这种情况下,我可以看到conditionally_complete_linorder
意味着linear_continuum_topology
,所以用linear_continuum
用一块石头杀死两只鸟,然后找到grep -Ern ~/.local/src/Isabelle2019 -e "instantiation.*real" | grep continuum
。
此过程非常繁琐。较少但仍然很乏味的**是将/path/to/.local/src/Isabelle2019/src/HOL/Real.thy:897:instantiation real :: linear_continuum
上的class_deps
图和Ctrl-f变为“ {instantiation real””,并查找以下实例化:原始类,其超类或暗示它的类。然后,在文件中定义每个这些类以搜索“实例化实数”。递归执行直到完成。在这种情况下,我会在Real.thy
中找到所需的内容。
有没有更简单的方法?希望我只是错过了一些明显的事情。
*我无法Ctrl单击Real.thy
直接跳到Conditionally_Complete_Lattices.thy
,我猜是因为它与预构建有关,所以我必须做{{1 }}再来一遍。
**而且也不那么健壮,因为它减去grep-ing可以显示奇怪的实例化位置,所以我不确定在实践中是否会出现这种情况。
谢谢
答案 0 :(得分:0)
您可以在下面的代码清单中导入理论,然后使用命令find_instantiations
。我将在代码中留下进一步的解释,但是如果您需要更多详细信息或怀疑某些事情不太正确,请随时在注释中提出其他问题。
section ‹Auxiliary commands›
theory aux_cmd
imports Complex_Main
keywords "find_instantiations" :: thy_decl
begin
subsection ‹Commands›
ML ‹
fun find_instantiations ctxt c =
let
val {classes, ...} = ctxt |> Proof_Context.tsig_of |> Type.rep_tsig;
val algebra = classes |> #2
val arities = algebra |> Sorts.arities_of;
in
Symtab.lookup arities c
|> the
|> map #1
|> Sorts.minimize_sort algebra
end
fun find_instantiations_cmd tc st =
let
val ctxt = Toplevel.context_of st;
val _ = tc
|> Syntax.parse_typ ctxt
|> dest_Type
|> fst
|> find_instantiations ctxt
|> map Pretty.str
|> Pretty.writeln_chunks
in () end
val q = Outer_Syntax.command
\<^command_keyword>‹find_instantiations›
"find all instantiations of a given type constructor"
(Parse.type_const >> (fn tc => Toplevel.keep (find_instantiations_cmd tc)));
›
subsection ‹Examples›
find_instantiations filter
find_instantiations nat
find_instantiations real
end
备注
instance
或instantiation
以外的方式(例如,通过以下方式实现)的实例化。 ML函数内部。