我有以下理论:
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
上的通用集。怎么能继续这个证明?或者,我应该通过其他方式表达这个吗?
答案 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
谓词在实践中很少使用。