当我使用value
找出返回自然数的函数的某个值时,我总是以迭代的Successor函数0的形式得到答案,即Suc(Suc( ... 0 ))
这可能很难有时读。
有没有办法直接输出Isabelle返回的数字?
答案 0 :(得分:2)
这是我想要修复的东西,但显然我忘记了。 Carcigenate的猜测是不正确的;这确实是完全评估的结果。问题在于,以这种笨拙的方式打印自然数字。
您可以执行以下操作:
最简单的方法是将数字转换为整数,即代替value "foo x y z"
(其中foo x y z
是您希望得到的类型nat
的表达式)写value "int (foo x y z)"
。
您可以在导入中添加~~/src/HOL/Library/Code_Target_Numeral
。这使得Isabelle的代码生成器使用目标语言的任意精度整数(在value
的情况下,使用ML及其基于GMP的整数)而不是低效的后继符号。作为副作用,这也以更好的方式打印自然数字。
您可以将以下代码添加到理论中,这会更改value
命令显示自然数的方式:
代码:
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的一个组成部分