Isabelle返回数字而不是Suc(Suc(... 0))

时间:2017-02-18 16:08:38

标签: isabelle

当我使用value找出返回自然数的函数的某个值时,我总是以迭代的Successor函数0的形式得到答案,即Suc(Suc( ... 0 ))这可能很难有时读。 有没有办法直接输出Isabelle返回的数字?

1 个答案:

答案 0 :(得分:2)

这是我想要修复的东西,但显然我忘记了。 Carcigenate的猜测是不正确的;这确实是完全评估的结果。问题在于,以这种笨拙的方式打印自然数字。

您可以执行以下操作:

  1. 最简单的方法是将数字转换为整数,即代替value "foo x y z"(其中foo x y z是您希望得到的类型nat的表达式)写value "int (foo x y z)"

  2. 您可以在导入中添加~~/src/HOL/Library/Code_Target_Numeral。这使得Isabelle的代码生成器使用目标语言的任意精度整数(在value的情况下,使用ML及其基于GMP的整数)而不是低效的后继符号。作为副作用,这也以更好的方式打印自然数字。

  3. 您可以将以下代码添加到理论中,这会更改value命令显示自然数的方式:

  4. 代码:

    lemma Suc_numeral_bit0: "Suc (numeral (Num.Bit0 n)) = numeral (Num.Bit1 n)"
      by (subst Suc_numeral) simp
    
    lemma Suc_numeral_bit1: "Suc (numeral (Num.Bit1 n)) = numeral (Num.Bit0 (n + Num.One))"
      by (subst Suc_numeral) simp
    
    lemmas [code_post] = 
      One_nat_def [symmetric] Suc_numeral_bit0 Suc_numeral_bit1 Num.Suc_1 Num.arith_simps
    

    请注意,value命令仅是诊断命令。它主要用于快速合理性测试和代码生成设置的调试,并且使其工作有时会很棘手。

    默认情况下,value依赖于代码生成器,即Isabelle需要知道如何为表达式生成可执行代码,如果无法执行此操作,value可能会失败。 (它有时也可以回归到其他一些策略,通过评估进行标准化或通过简化进行评估,但那些通常不能提供有用的输出)

    我只是告诉你这一点,以便你知道对value命令的期望,并且不会给人的印象是这是人们一直使用的Isabelle的一个组成部分