在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
的原始转储,但我希望有更好的方法。
是否有一种在证明目标中显示中间词类型的好方法?
答案 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中的一个错误?