我想了解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
寄存器中的语句相同这一事实应该提醒我它已被证明?
答案 0 :(得分:2)
嗯,输出面板中的子目标对应于上下文的子目标。在这种情况下,上下文是从proof -
开始的完整引理之一。在这种情况下,只有一个子目标,这是要证明的引理。
当您使用have
说明您的中间属性时,系统不会对目标进行任何验证,一旦证明了这一点,它就会让您访问此属性(通过名称this
和qp
),因为您已使用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个子目标P
和Q ∧ P
,并且“输出”面板应该确认这一点。