Isabelle 查找类型的类的实例化

Isabelle 查找类型的类的实例化,isabelle,Isabelle,在Isabelle/HOL中,如何找到为给定类实例化的给定类型的位置?例如,在这篇文章中,real被实例化为一个有条件地完成\u linorder。为了证明这个问题的合理性:我可能想知道这一点,为类似的实例提供灵感,为向某人展示它,为Isabelle/HOL练习阅读,为好奇,等等。我目前的过程是: 首先,检查它实际上是:typeinstantiation real::conditionaly\u complete\u linorder begin end,并查看是否收到错误消息“实例化中没有参数

在Isabelle/HOL中,如何找到为给定类实例化的给定类型的位置?例如,在这篇文章中,
real
被实例化为一个
有条件地完成\u linorder
。为了证明这个问题的合理性:我可能想知道这一点,为类似的实例提供灵感,为向某人展示它,为Isabelle/HOL练习阅读,为好奇,等等。我目前的过程是:

首先,检查它实际上是:type
instantiation 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