如何证明某个函数在其域上是完全的?

时间:2014-06-19 17:20:00

标签: isabelle

我有以下理论:

theory Color 
imports Main 

begin 

datatype color = RED | GREEN 

function invert :: "color => color" 
where 
  "invert RED   = GREEN" 
| "invert GREEN = RED  " 
apply (pat_completeness) 
apply auto 
done 
termination by lexicographic_order 

lemma invert_univ: "invert_dom = (λx. True)" 

我想证明invert在整个域中是完全的,因此invert_dom定义数据类型color上的通用集。怎么能继续这个证明?或者,我应该通过其他方式表达这个吗?

1 个答案:

答案 0 :(得分:4)

首先,你真的不需要在这里使用function。此功能的终止证明是微不足道的,可以自动找到,所以你可以写

fun invert :: "color ⇒ color" 
where 
  "invert RED   = GREEN" 
| "invert GREEN = RED"

或者,因为它在数据类型color上是原始递归的:

primrec invert :: "color ⇒ color" 
where 
  "invert RED   = GREEN" 
| "invert GREEN = RED"

甚至只是

definition invert :: "color ⇒ color" where
  "invert c = (case c of RED ⇒ GREEN | GREEN ⇒ RED)"

在最后一种情况下,您必须使用引理invert手动展开invert_def的定义。

现在回答您的实际问题:从技术上讲,在HOL中,每个函数都是完整的。这必然是这种情况,因为表达式根本没有任何价值的逻辑往往会变得非常混乱。您可以通过在某些输入上返回undefined来“模拟”非直觉性,这是您不知道的任意值。 undefined :: int是一个整数值 - 它可以是0,或者它可以是42或任何其他整数。对于使用函数包定义的函数,这仅在您未指定案例时(例如,通过不给出一个案例的等式)或者函数不在某些输入上终止(然后事情变得混乱;如果您想要做任何事情)关于函数的推理然后,你必须证明它终止于你首先给出的输入

如果已经给出了终止证明 - 在这种情况下,由于函数通常会终止 - 你的invert_dom谓词基本没用。你不需要它。

否则,您可以使用invert_dom规则证明invert.domintros对给定输入成立。由于在实践中很少需要它们,因此您必须使用function (domintros)代替function手动切换其生成。然后你就可以证明这样的引理:

lemma "invert_dom = (λ_. True)"
proof
  fix x show "invert_dom x = True"
    by (cases x) (auto intro: invert.domintros)
qed

但是,同样,*_dom谓词在实践中很少使用。