在Isabelle中证明Takeuchi功能的终止

时间:2018-07-31 13:21:04

标签: isabelle termination

这是我尝试证明Takeuchi function确实terminate的地方:

function moore :: "(int ⇒ int ⇒ int) ⇒ (int ⇒ int ⇒ int)" where
"moore x y z = ((if (x ≤ y) then 0  else 1) (max(x,y,z) - min(x,y,z)) (x - min(x,y,z)))"


fun tk :: "int ⇒ int ⇒ int ⇒ int" where
"tk x y z = ( if x ≤ y then y else tk (tk (x-1) y z) (tk (y-1) z x) (tk (z-1) x y) )"

这里有几个问题。首先,我应该在函数moore中返回一个三元组。现在,系统正在报错:

  

类型统一失败:类型“ int”和“ _⇒_”的冲突

     

应用程序中的类型错误:操作数类型不兼容

     

运算符:op≤x ::(int⇒int⇒int)⇒bool操作数:y :: int

然后,终止证明当然不会成功,因为我没有在上面应用终止功能(此方法应类似于here)。

我该如何解决?

1 个答案:

答案 0 :(得分:2)

首先,您的moore函数当前不返回三元组,而是返回两个int并返回int的函数。对于三元组,您必须编写int × int × int。另外,元组的结构是(x, y, z),而不是像您一样的x y z

此外,没有理由使用fun(更不用说function)来定义moore函数了,因为它不是递归的。 definition工作正常。另一方面,对于tk,您将需要使用function,因为没有明显的词典终止方法。

另外,返回三元组的函数在Isabelle中通常很难处理。定义三个单独的功能更有意义。将所有这些放在一起,然后可以像下面这样定义函数:

definition m1 where "m1 = (λ(x,y,z). if x ≤ y then 0 else 1)"
definition m2 where "m2 = (λ(x,y,z). nat (Max {x, y, z} - Min {x, y, z}))"
definition m3 where "m3 = (λ(x,y,z). nat (x - Min {x, y, z}))"

function tk :: "int ⇒ int ⇒ int ⇒ int" where
  "tk x y z = ( if x ≤ y then y else tk (tk (x-1) y z) (tk (y-1) z x) (tk (z-1) x y))"
  by auto

然后您可以使用部分归纳规则tk轻松证明tk.pinduct函数的部分正确性定理:

lemma tk_altdef:
  assumes "tk_dom (x, y, z)"
  shows   "tk x y z = (if x ≤ y then y else if y ≤ z then z else x)"
  using assms by (induction rule: tk.pinduct) (simp_all add: tk.psimps)

tk_dom (x, y, z)的假设表明tk以值(x, y, z)终止。

现在,如果我正确阅读了您链接的论文,则终止证明模板如下所示:

termination proof (relation "m1 <*mlex*> m2 <*mlex*> m3 <*mlex*> {}", goal_cases)
  case 1
  show "wf (m1 <*mlex*> m2 <*mlex*> m3 <*mlex*> {})"
    by (auto intro: wf_mlex)
next
  case (2 x y z)
  thus ?case sorry
next
  case (3 x y z)
  thus ?case sorry
next
  case (4 x y z)
  thus ?case sorry
next
  case (5 x y z)
  thus ?case sorry
qed

在这里的最后四种情况下,您将不得不做一些实际工作,以证明该措施有所减少。 <*mlex*>运算符将几种量度组合为一个字典式量度。显示该度量包含某些内容的相关规则是mlex_lessmlex_le