如何在Isabelle证明目标中查看隐藏的类型变量?

时间:2013-03-19 00:33:57

标签: isabelle

在Isabelle中,人们经常可以达到证据目标,其中中间类型的术语对证明的正确性至关重要。例如,考虑以下引理将nat 42转换为'a word然后再转回:

theory Test
imports "~~/src/HOL/Word/Word"
begin

lemma "unat (of_nat 42) = 42"
  ...

现在这个陈述的真实性取决于of_nat 42的类型:如果它是32 word,那么该陈述是真的,如果它是2 word,那么陈述是假的。

不幸的是,我似乎无法让Isabelle向我展示这种中间类型。

我尝试了以下内容:

  • declare [[show_types]]
  • declare [[show_sorts]]
  • local_setup {* Config.put show_all_types true *}

所有这些只显示:

unat (of_nat (42::nat)) = (42::nat)

在紧要关头,人们可以这样做:

apply (tactic {* (fn t => (tracing (PolyML.makestring (prems_of t)); all_tac t))  *})

获得term的原始转储,但我希望有更好的方法。

是否有一种在证明目标中显示中间词类型的好方法?

3 个答案:

答案 0 :(得分:4)

要让Isabelle在此示例中显示unat的类型,您需要声明以下内容:

  declare [[show_types]]
  declare [[show_sorts]]
  declare [[show_consts]]

最后一行打印输出窗口中目标中使用的每个常量的类型。这适用于jEdit和ProofGeneral。

此解决方案存在问题:如果unat以不同类型多次出现,它将打印所有这些实例,但它不会告诉您哪个类型实例是哪个实例。除了jEdit悬停,我不知道有任何解决方案。

答案 1 :(得分:3)

在Isabelle / jEdit中,您可以随时“控制 - 悬停”(即,按住控制按钮并将鼠标悬停在)上,以获得更多信息。

中的of_nat
lemma "unat (of_nat 42) = 42"

这导致

constant "Nat.semiring_1_class.of_nat"
:: nat => 'a word

现在,您可以'a 'a word递归地执行相同操作

:: len
free type variable

告诉您'a是排序len(通过按住控件单击len,您可以直接跳转到此类型类的定义,这也非常方便)。

所以问题的答案是:是的,控制在Isabelle / jEdit中悬停。

答案 2 :(得分:2)

运行命令:

setup {* Config.put_global show_all_types true *}

似乎可以解决问题。

目标unat (of_nat 3) = 3变得丑陋(但完整):

goal (1 subgoal):
 1. (Trueprop::bool => prop)
     ((op =::nat => nat => bool)
       ((unat::'a word => nat)
         ((of_nat::nat => 'a word)
           ((numeral::num => nat)
             ((num.Bit1::num => num) (num.One::num)))))
       ((numeral::num => nat)
         ((num.Bit1::num => num) (num.One::num))))

根据需要。

有趣的是,declare [[show_all_types]]不起作用;来源看起来应该如此。也许这是Isabelle2013中的一个错误?