Isabelle 查找类型的类的实例化
在Isabelle/HOL中,如何找到为给定类实例化的给定类型的位置?例如,在这篇文章中,Isabelle 查找类型的类的实例化,isabelle,Isabelle,在Isabelle/HOL中,如何找到为给定类实例化的给定类型的位置?例如,在这篇文章中,real被实例化为一个有条件地完成\u linorder。为了证明这个问题的合理性:我可能想知道这一点,为类似的实例提供灵感,为向某人展示它,为Isabelle/HOL练习阅读,为好奇,等等。我目前的过程是: 首先,检查它实际上是:typeinstantiation real::conditionaly\u complete\u linorder begin end,并查看是否收到错误消息“实例化中没有参数
real
被实例化为一个有条件地完成\u linorder
。为了证明这个问题的合理性:我可能想知道这一点,为类似的实例提供灵感,为向某人展示它,为Isabelle/HOL练习阅读,为好奇,等等。我目前的过程是:
首先,检查它实际上是:typeinstantiation real::conditionaly\u complete\u linorder begin end
,并查看是否收到错误消息“实例化中没有参数,也没有挂起的实例证明义务”
接下来,理想的情况是在我需要知道如何使用之前,即通过类C_1
[,C_2
,C_3
等,它是直接的还是隐式的。然后,我需要找到这些实例化的位置,或者是显式的实例化real::conditionally_complete_linorder
,或者是ci
的隐式实例化(这两种情况下的过程都是相同的)。我不知道如何找到,所以我必须检查显式实例化,然后检查所有可能的隐式实例化
对于显式,我可以做一个grep-Ern~/.local/src/isabell2019-e'instantiation real::conditionally_complete_linorder'
(希望空格不奇怪,或者做一个更健壮的搜索:)。对AFP位置重复上述步骤。或者,要停留在jEdit窗口内:
term“x::'a::conditionally\u complete\u linorder”
然后按Ctrl键单击类名,然后用Ctrl-f检查real
是否直接在该文件中实例化来找到类本身的定义位置术语“x::real”
并按住Ctrl键单击real
,然后按住Ctrl-f键在该文件中有条件地完成排序来检查它是否在定义类型real
的地方实例化grep
更加健壮
如果显式没有显示任何内容,那么我将检查隐式。查看class\u deps
图,我可以看到有条件地完成\u linorder
可以从complete\u linorder
或linear\u continuum
开始。然后,我可以通过查看real
是否被实例化为它们中的任何一个来继续搜索(忽略我碰巧知道real
不能被实例化为它们中的任何一个)。我还可以检查它是否同时被实例化为条件完整\u lattice
和linorder
,这就是我可以看到的条件完整\u linorder
是一个简单的(无附加假设)组合*。对所有这些类递归地重复,直到找到实例化为止。在这种情况下,我可以看到linear\u continuum\u topology
意味着linear\u continuum
,因此用grep-Ern~/.local/src/isabelle 2019-e“实例化。*real”一举两得| grep continuum
并查找/path/to/.local/src/isabell2019/src/HOL/Real.thy:897:实例化Real::linear_continuum
这个过程相当乏味。较少但仍然相当乏味的**将是在real.thy
中获得class_deps
图形并按Ctrl-f键选择“instantiation real”。然后查找:原始类、它的超类或暗示它的类的实例化。然后在每个文件中定义这些类,并搜索“实例化实体”。递归地执行此操作,直到完成。在这种情况下,我会在Real.thy
中找到我需要的东西
有没有更简单的方法?希望我错过了一些明显的东西
*我无法在中按Ctrl键有条件地完成晶格。如果要直接跳到linorder
,我想是因为它是预构建的,所以我必须再次执行术语“x::'a::linorder”
的操作
**而且也不那么健壮,因为负grep-ing可能会出现更奇怪的实例化位置,所以我也不确定在实践中是否会出现这种情况
谢谢您可以在下面的代码列表中导入理论,然后使用命令find\u 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
部分è辅助命令›
辅助指令理论
输入复杂的主
关键词“查找实例化”::thy_decl
开始
第è小节命令›
MLè
有趣的查找实例化ctxt c=
让
val{classes,…}=ctxt |>Proof|u Context.tsig_of |>Type.rep_tsig;
val代数=类|>#2
val arities=代数|>排序;
在里面
Symtab.c
|>
|>地图#1
|>排序代数
结束
有趣的查找\u实例化\u cmd tc st=
让
val ctxt=st的Toplevel.context_;
val=tc
|>Syntax.parse_typ ctxt
|>目的地类型
|>fst
|>查找实例化ctxt
|>map.str
|>漂亮的,写的,大块的
最后
val q=外部_Syntax.command
\è查找_实例›
“查找给定类型构造函数的所有实例化”
(Parse.type_const>>(fn tc=>Toplevel.keep(find_实例化_cmd tc));
›
小节è示例›
查找实例化过滤器
查找实例nat
找到真正的实例化
结束
评论
- 如果你发现有任何问题,我很乐意提供修正案,但我希望进一步的答复会有合理的延迟
- 该命令同时查找explicit和imp