在Isabelle中证明函数定义的正确性

时间:2014-01-27 14:20:01

标签: function isabelle

我想使用function关键字定义来证明函数定义的正确性。以下是关于自然数的通常归纳定义的加法函数的定义:

theory FunctionDefinition
imports Main

begin

datatype natural = Zero | Succ natural

function add :: "natural => natural => natural"
where 
  "add Zero     m = m"
| "add (Succ n) m = Succ (add n m)"

Isabelle / JEdit向我展示了以下子目标:

goal (4 subgoals):
 1. ⋀P x. (⋀m. x = (Zero, m) ⟹ P) ⟹ (⋀n m. x = (Succ n, m) ⟹ P) ⟹ P
 2. ⋀m ma. (Zero, m) = (Zero, ma) ⟹ m = ma
 3. ⋀m n ma. (Zero, m) = (Succ n, ma) ⟹ m = Succ (add_sumC (n, ma))
 4. ⋀n m na ma. (Succ n, m) = (Succ na, ma) ⟹ Succ (add_sumC (n, m)) = Succ (add_sumC (na, ma)) 
Auto solve_direct: ⋀m ma. (Zero, m) = (Zero, ma) ⟹ m = ma can be solved directly with
  Product_Type.Pair_inject: (?a, ?b) = (?a', ?b') ⟹ (?a = ?a' ⟹ ?b = ?b' ⟹ ?R) ⟹ ?R
使用

apply (auto simp add: Product_Type.Pair_inject)

我得到了

goal (1 subgoal):
 1. ⋀P a b. (⋀m. a = Zero ∧ b = m ⟹ P) ⟹ (⋀n m. a = Succ n ∧ b = m ⟹ P) ⟹ P

目前尚不清楚如何进行。总之,这是解决这个问题的正确方法吗?

我知道如果我使用fun定义,Isabelle会自动执行此操作 - 我想了解如何手动执行

2 个答案:

答案 0 :(得分:3)

tutorial on the function package在第3节中提及fun f where ...缩写

function (sequential) f where ...
by pat_completeness auto
termination by lexicographic_order

此处pat_completeness是来自function包的证明方法,它自动验证数据类型构造函数模式的完整性。这是你必须证明的第一个子目标。建议在pat_completeness之前应用auto,因为auto会更改目标的语法结构,pat_completeness可能在自动后无效。

如果您想在没有pat_completeness的情况下证明模式完整性,您应该尝试对所有函数参数进行大小写分析,例如,在您的示例中为case_tac a

答案 1 :(得分:3)

Manuel在评论中已经提到过,但我认为更详细的例子可能会有所帮助。您可以手动执行以下操作:

首先你照常指定你的功能

function add :: "natural => natural => natural"
where 
  "add Zero     m = m" |
  "add (Succ n) m = Succ (add n m)"

然后你证明给定的模式涵盖所有情况

  by (pat_completeness) auto

之后你会负责终止。例如,每个datatype都附带一个size函数,您可能会注意到add的第一个参数在每次递归调用时都会严格减小。默认情况下,function会将函数的所有参数捆绑到终止证明的元组中,即在终止中将两个参数nm代替证明您使用(n, m)。因此,如果您想告诉系统它应该使用 first 参数的大小,您可以按如下方式执行此操作:

termination add
  apply (relation "measure (size o fst)")

这将产生剩余的目标:

goal (2 subgoals):
 1. wf (measure (size o fst))
 2. !!n m. ((n, m), Succ n, m) : measure (size o fst)

也就是说,你必须表明给定的关系是有根据的(这对于measure来说是微不足道的,因为它们是通过将参数映射到自然数然后使用来构造的。 对于每次递归调用,参数实际上都在给定的关系中。这两个目标都可以通过simp轻松发送。

  apply simp
  apply simp
done