查找类型的类的实例化

时间:2019-07-16 19:24:55

标签: isabelle

在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窗口中:

  1. 通过键入grep -Ern ~/.local/src/Isabelle2019 -e 'instantiation real :: conditionally_complete_linorder',然后按住Ctrl键单击类名,然后使用Ctrl-f检查term "x::'a::conditionally_complete_linorder"是否在该文件中直接实例化,我可以找到类本身的定义位置。

  2. 然后我可以通过键入real并按住Ctrl键单击real,然后按住Ctrl-f键来term "x::real",检查是否实例化了定义类型real的位置。在该文件中。

(如果在任意一个位置中,它将位于导入层次结构中的下一个位置,但我发现只需简单地完成这两个步骤。)但是,如果两个地方都不打开,则无论出于何种原因,它在其他地方显式实例化或隐式实例化。因此,conditionally_complete_linorder更强大。

如果显式没有任何变化,那么我检查隐式。查看grep图,我可以看到class_deps可以跟随conditionally_complete_linordercomplete_linorder。然后,我可以通过查看linear_continuum是否被实例化为它们中的任何一个来继续搜索(不管我碰巧知道real都不能被实例化为)。我还可以检查它是否同时实例化为realconditioanlly_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可以显示奇怪的实例化位置,所以我不确定在实践中是否会出现这种情况。

谢谢

1 个答案:

答案 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

备注

  • 如果您有任何问题,我很乐意提供修改,但是希望在以后的答复中有合理的延迟。
  • 该命令查找显式和隐式实例化,即,它也查找通过使用命令instanceinstantiation以外的方式(例如,通过以下方式实现)的实例化。 ML函数内部。
  • 不幸的是,该命令未提供执行实例化的文件的位置-这将很难实现,特别是考虑到还可以通过编程方式执行实例化。不过,我认为,给出所有实例化的列表后,在导入的理论上使用内置的搜索功能来缩小执行实例化的确切位置几乎总是容易的。