我想证明以下引理
lemma assumes "f (w+n) - f w / n ≤ g (w+n)"
shows "∀n. (f (w+n) - f w) / n ≤ g (w+n)"
我认为这会非常简单,但事实证明这比我想象的更棘手。根据我的想法,假设中的不等式对所有w和n都有效,因此我试图证明的结果也应该是有效的。
我搜索了文档并运行了大锤但是我还没有成功。
这可以解决,还是我试图证明完全不同的陈述?如果是这样,请有人解释原因。
答案 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
的一个应用,可以使用blast
或auto
自动完成。请注意,⋀是元逻辑中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}
。这四种类型描述了变量所具有的代数属性。您需要了解这些种类对您的功能使用的限制。你可能需要额外的种类来获得你想要的东西。