在this document之后(尤其是幻灯片23),我正在尝试在Isabelle中进行基本的自然推论证明。
我知道我可以做类似的事情
theorem ‹(A ⟶ B) ⟶ A ⟶ B›
proof -
{
assume ‹A ⟶ B›
{
assume ‹A›
with ‹A ⟶ B› have ‹B› ..
}
hence ‹A ⟶ B› ..
}
thus ‹(A ⟶ B) ⟶ A ⟶ B› ..
qed
而且
theorem ‹(A ⟶ B) ⟶ A ⟶ B›
proof
assume ‹A ⟶ B› and ‹A›
then obtain ‹B› ..
qed
达到相同的目标。
所以当我尝试写证明时
theorem ‹(A ⟶ A ⟶ B) ⟶ A ⟶ B›
proof -
{
assume ‹A ⟶ A ⟶ B›
{
assume ‹A›
with ‹A ⟶ A ⟶ B› have ‹A ⟶ B› ..
hence ‹B› using ‹A› ..
}
hence ‹A ⟶ B› ..
}
thus ‹(A ⟶ A ⟶ B) ⟶ A ⟶ B› ..
qed
喜欢
theorem ‹(A ⟶ A ⟶ B) ⟶ A ⟶ B›
proof
assume ‹A ⟶ A ⟶ B› and ‹A›
hence ‹A ⟶ B› ..
then obtain ‹B› using ‹A› ..
qed
伊莎贝尔为什么抱怨
Failed to finish proof:
goal (1 subgoal):
1. A ⟶ A ⟶ B ⟹ A ⟶ B
我知道这些都是伊莎贝尔可以一步证明的非常简单的东西:这里的目标是提供一个简明的证明,供人类阅读(就自然演绎而言),而无需咨询伊莎贝尔。
答案 0 :(得分:0)
此修改对您的证明有效:
theorem ‹(A ⟶ A ⟶ B) ⟶ A ⟶ B›
proof(intro impI)
assume ‹A ⟶ A ⟶ B› and ‹A›
hence ‹A ⟶ B› ..
then show ‹B› using ‹A› ..
qed
问题是双重的:
impI
。问题是您只应用一次,这使您有了假设A -> A -> B
和剩余目标A -> B
。结果,您还没有假设A
,因为您需要再次使用impI
才能获得假设。相反,通过使用proof(intros impI)
告诉Isabelle不要使用其标准的引入和消除规则集作为证明的第一步,而是尽可能多地应用impI
引入规则(即两次)。另外,proof(rule impI, rule impI)
在这里也可以起到相同的作用。then obtain
尚未完成证明:您没有show
进行任何操作!通过使用明确的show
,您可以向Isabelle表示您要“完善”一个开放的目标,并实际上得出在区块开始时要证明的目标。请注意,如果您的唯一目的是推导obtain
,那么您在此处使用A -> B
从事实A
和B
出发并不错误。问题是您要努力从事实出发,在完善开放目标的同时推导新事实。例如,这也可以工作:
theorem ‹(A ⟶ A ⟶ B) ⟶ A ⟶ B›
proof(intro impI)
assume ‹A ⟶ A ⟶ B› and ‹A›
hence ‹A ⟶ B› ..
then obtain ‹B› using ‹A› ..
then show ‹B› .
qed
在第一行获得事实B
,第二行简单地使用此事实来完善开放目标B
。