拓宽部分函数的范围

时间:2016-06-26 14:00:05

标签: isabelle

为不高兴的头衔道歉。

我定义了一个计算固定点的函数,如

function (domintros) "fix" :: "(env ⇒ env) ⇒ env ⇒ env"
where
  "fix f m n = (if f m n = m n then m n else fix f (f m) n)"
by pat_completeness blast

其中type_synonym env = char list ⇀ val只是通常的(显式)部分函数(map)。

我设法在某些条件下证明终止,但现在我想证明以下引理,这似乎是微不足道的:

lemma fix_dom_iter [intro]:
  assumes "fix_dom (f, m, n)"
  shows "fix_dom (f, f m, n)"
oops

但只是看似,因为我无法找到如何证明它。似乎没有fix.p*定理可以做我想要的。

显然是~(f m n = m n)时的情况。

任何指针。如何证明引理?它甚至可以证明吗?

修改

我认为fix.domintros应该是等价而不是含义。这样,我就能证明我想要的东西,事实上它应该是合理的。问题是,如果这对于任何类型的部分功能都是合理的。

1 个答案:

答案 0 :(得分:2)

不幸的是你的引理不成立。考虑输入的以下变体,我将环境更改为从bool到bool的函数。

type_synonym env = "bool ⇒ bool"
function (domintros) "fix" :: "(env ⇒ env) ⇒ env ⇒ env"
where
  "fix f m n = (if f m n = m n then m n else fix f (f m) n)"
by pat_completeness blast

我还定义了相应的可执行部分函数。

partial_function (tailrec) "fix2" :: "(env ⇒ env) ⇒ env ⇒ env"
where
  [code]: "fix2 f m n = (if f m n = m n then m n else fix2 f (f m) n)"

现在,fmn的以下证人表明您的陈述不正确。

definition "f m = (if m True = m False then Not else Not o m)"  
definition "m n = True" 
definition "n = False"

fix_dom (f,m,n)确实成立。

lemma "fix_dom (f,m,n)" unfolding f_def[abs_def] m_def[abs_def] n_def
  by (auto intro: fix.domintros)

但是,fix_dom (f,f m,n)不能保持,因为非终止计算可以观察到。

value (code) "fix2 f (f m) n"