将自由变量转换为绑定变量

时间:2015-01-28 23:59:58

标签: isabelle

我想证明以下引理

lemma assumes "f (w+n) - f w / n ≤ g (w+n)" 
shows "∀n. (f (w+n) - f w) / n ≤ g (w+n)"

我认为这会非常简单,但事实证明这比我想象的更棘手。根据我的想法,假设中的不等式对所有w和n都有效,因此我试图证明的结果也应该是有效的。

我搜索了文档并运行了大锤但是我还没有成功。

这可以解决,还是我试图证明完全不同的陈述?如果是这样,请有人解释原因。

2 个答案:

答案 0 :(得分:1)

如前所述,你的命题并不成立。但是,类型类与它没有任何关系;这是一个非常基本的逻辑问题。

首先,应该注意你的假设可能应该是

(f (w+n) - f w) / n ≤ g (w+n)

你把它写下来的方式就意味着

f (w+n) - (f w / n) ≤ g (w+n)

但即使你解决了这个问题,它仍然不成立,其原因在于自由变量意味着什么。伊莎贝尔的惯例是,引理中的自由变量(在上下文中没有任何约束)是隐含的普遍限定的。这通常是数学上的惯例;我们写a + b = b + a,而不是∀a b. a + b = b + a

因此,你的引理对伊莎贝尔意味着这一点:

∀f g w n. (f (w+n) - f w) / n ≤ g (w+n) ⟹ ∀n. (f (w+n) - f w) / n ≤ g (w+n)

非正式地说,这就是说如果命题适用于一个 n,它必须适用于所有 n。这显然是错误的。我的猜测是,当你写下来时,你感到困惑

lemma "(f (w+n) - f w) / n ≤ g (w+n)"

那么这已经意味着它适用于所有n(由于相同的约定)。但是当你只是把它带到另一个引理的假设时,同样的约定导致了相反的含义:"对于任何n,如果假设成立,那么......"

如果你真的想以这样的方式陈述假设 all n,你必须写

lemma assumes "⋀n. (f (w+n) - f w) / n ≤ g (w+n)" 
      shows   "∀n. (f (w+n) - f w) / n ≤ g (w+n)"

然后,证明只是规则allI的一个应用,可以使用blastauto自动完成。请注意,⋀是元逻辑中Isabelle的通用限定符。它的含义类似于在数学中你说"修复一些n。"或者"设n是固定的,但是任意数字"。

答案 1 :(得分:0)

(关于限制的其他答案的HOL公式是错误的。我无法访问该用户帐户。我提交了一个已编辑的答案,但我不知道它是否会显示。我有y x代替x y。我没有解决它,因为我不知道如何。我只是在顶部做了一些额外的评论。)

(不要接受这个作为答案。你应该等一下,看看其中一位专家是否会出现。欧洲人还没有。)

当我插入你的引理时,Nitpick告诉我它找到了一个反例:

Auto Nitpick found a counterexample for
card "'a∷{inverse,minus,plus,ord}" = 2:

那是因为我启用了“Auto Nitpick”。您转到选项页面,然后转到“Isabelle / General”设置。我通常启用“Auto Nitpick”,“Auto Quickcheck”和“Auto Solve Direct”。

我刚才注意到我没有启用“自动方法”。由于某些原因,它一定是吸收了太多的CPU,但通常也可以启用它。

如果您的CPU正在运行,并且您认为它不应该是,那么您将禁用“自动方法”以查看是否存在问题。我不使用“Auto Sledgehammer”。它对CPU非常苛刻,我直接运行它。

Auto Nitpick有时会给我带来很多麻烦。它只是在我不期望的时候弹出。出于某种原因,我永远不会记得再直接运行它。您可以使用nitpick执行此操作。有关选项的更多详细信息,请参阅PDF。

至于你的引理失败的原因,我不知道。也许别人会知道。

我现在看到的是变量的排序。最终,您必须了解类型类和排序。有不同的方法来获取更多信息。我使用declare,有时我收到太多信息:

declare[[show_sorts=true, show_consts=true]]

在输出面板中,我看到它在反例中显示的内容。你的类型是这样的:

'a :: {inverse,minus,plus,ord}

您的变量(例如w)为w :: 'a :: {inverse,minus,plus,ord}。这四种类型描述了变量所具有的代数属性。您需要了解这些种类对您的功能使用的限制。你可能需要额外的种类来获得你想要的东西。

相关问题