Higher order functions 转移高阶目标

Higher order functions 转移高阶目标,higher-order-functions,isabelle,Higher Order Functions,Isabelle,我正在尝试使用传输包为自定义数据类型建立归纳规则,但是apply transfer对我不起作用。下面是一个简单的例子: theory TransferHO imports Main begin typedef pos = "{x :: nat. x > 0}" by blast setup_lifting type_definition_pos lift_definition one :: pos is 1 by auto lift_definition S :: "pos ⇒ po

我正在尝试使用传输包为自定义数据类型建立归纳规则,但是
apply transfer
对我不起作用。下面是一个简单的例子:

theory TransferHO imports Main begin

typedef pos = "{x :: nat. x > 0}" by blast
setup_lifting  type_definition_pos

lift_definition one :: pos is 1 by auto
lift_definition S :: "pos ⇒ pos" is Suc by auto

lemma
  assumes "P one"
  assumes "⋀ x. P x ⟹ P (S x)"
  shows "P n"
  using assms
  apply transfer
在这一点上,目标仍然是

⋀P x. P one ⟹ (⋀x. P x ⟹ P (S x)) ⟹ P x
而不是

⋀P x. P 1 ⟹ (⋀x. x > 0 ⟹ P x ⟹ P (Suc x)) ⟹ x > 0 ⟹ P x
这是我所期望的。在证明引理之前,我需要做什么来转移引理


另外,一般来说,如何更好地控制
应用传输
,或者至少更好地调试方法?

传输的结果通常不是唯一的,传输方法仅计算一个可能的解决方案,但您可以使用
back
回溯其他解决方案。在您的特定示例中,您在回溯53次(至少使用Isabelle 2013-1-RC3)后找到了您想要的结果。解决方案的顺序由
[transfer\u rule]
声明的顺序决定,因此回溯的数量可能会从一个版本更改到下一个版本


不幸的是,
transfer
在有很多解决方案的情况下,几乎无法控制目标的实现。

作为一种解决办法,这样说引理似乎有效:
lemma“⋀P.n。⟦P一;⋀x、 PX⟹ P(S x)⟧ ⟹ P n“应用传输
不幸的是,已发布的传输版本不允许用户进行太多控制或调试。接口可能需要在某个时候重新设计;e、 g.能够告诉传输包natpos关系是“强制性的”是很有用的,这样
transfer
必须替换所有出现的类型
pos
必须始终替换为
nat
。实际上,这种变通方法在我的实际用例中也有效。实际上,
⋀ n、 结论中的
就足够了。令人惊讶–谢谢!我的意见是,如果我必须在生产证明中使用
back
,那么就有问题了。