认识到证实了一个子目标

时间:2015-07-20 12:12:36

标签: isabelle

我想了解Isar虚拟机的状态机。

Page 48 of Markus Wenzel's doctoral thesis提供了一个很好的概述,但没有在“输出”面板中详细说明其消息。它可能是该系统的后续附录。

我有一个简单的Isar证明:

theory Propositional
imports Main
begin

lemma nj2: assumes p: P and q: Q shows "P ∧ (Q ∧ P)"
proof - 
  from q p have qp: "Q ∧ P" by (rule conjI)
  from p qp show "P ∧ (Q ∧ P)" by (rule conjI)
qed
输出面板显示第二个by (rule conjI)

show (P::bool) /\ (Q::bool) /\ P 
Successful attempt to solve goal by exported rule:
  (P::bool) /\ (Q::bool) /\ P 
proof (state): depth 0

this:
  (P::bool) /\ (Q::bool) /\ P

goal:
No subgoals!
variables:
  P, Q :: bool

所以它明确地认识到了目标的解决方案。但是,在第一个by (rule conjI)它说

have qp: (Q::bool) /\ (P::bool) 
proof (state): depth 0

this:
  (Q::bool) /\ (P::bool)

goal (1 subgoal):
 1. P /\ Q /\ P
variables:
  P, Q :: bool

我看不到子目标已被证实的迹象。或者,have语句与this寄存器中的语句相同这一事实应该提醒我它已被证明?

1 个答案:

答案 0 :(得分:2)

嗯,输出面板中的子目标对应于上下文的子目标。在这种情况下,上下文是从proof -开始的完整引理之一。在这种情况下,只有一个子目标,这是要证明的引理。

当您使用have说明您的中间属性时,系统不会对目标进行任何验证,一旦证明了这一点,它就会让您访问此属性(通过名称thisqp),因为您已使用by (rule conjI)证明了这一点,并且没有错误这意味着它已被证明。

另一方面,当您使用show声明属性时,系统会验证此属性是否与您所做的最终假设(使用assume)实际上对应于其中一个属性子目标,否则失败。

当它到达qed命令时,它最终验证上下文的所有子目标都已被证实。

写这个证明的另一种方法是这样的(我没有检查它是否有效,但它应该......):

theory Propositional
imports Main
begin

lemma nj2: assumes p: P and q: Q shows "P ∧ (Q ∧ P)"
proof (rule conjI)
  from p show P by assumption
next
  from q p show "Q ∧ P" by (rule conjI)
qed

在这种情况下,proof (rule conjI)会创建2个子目标PQ ∧ P,并且“输出”面板应该确认这一点。