我是Isabelle / HOL的新手(虽然不是HOL),所以我决定开始学习优秀的"prog-prove" tutorial中的例子。
我已经陷入无语境语法问题(第43页的练习3.5)。在这个问题中,您将获得两个无上下文语法:
S → ε | aSb | SS
T → ε | TaTb
并要求您证明他们描述的是同一种语言。证明T中的元素位于S描述的语言中很容易,但我正在与另一个方向斗争。特别是,我想表明T描述的语言是在连接下关闭的。
这是一个非正式的证明:假设u
和v
在语言中。然后我们要证明uv
在于语言。继续归纳v
的长度。如果length v = 0
则v
为空字符串uv = u
,我们就完成了。否则,请查看T的生产规则。显然v
不是空字符串,因此对于语言中的某些waxb
,其格式必须为w, x
。由于w
比v
短,(强)归纳表明uw
必须在语言中。现在使用第二个生产规则。
这个证据似乎很复杂,所以我怀疑它不是prog-prove的作者想到的那个。所以我有两个问题:
该演习的作者希望您使用什么(非正式或正式)?
(更多技术问题)我如何在Isabelle / HOL中表达我的非正式证据?
到目前为止,我的尝试/诽谤从以下开始:
lemma T_mult: "cfT u ==> cfT v ==> cfT (u @ v)"
apply (induction "length v")
apply (auto)
apply (induction v rule: cfT.induct)
并且第二次归纳申请失败,但我认为这是因为我要求Isabelle做错事......
答案 0 :(得分:2)
我不能说出作者的期望,但无论如何让我发表评论;)
首先,您对T
和S
的定义是什么?我将假设以下内容:
datatype alphabet = a | b
inductive S
where
empty [simp]: "S []" |
betw: "S x ⟹ S (a # x @ [b])" |
conc: "S x ⟹ S y ⟹ S (x @ y)"
inductive T
where
empty [simp]: "T []" |
conc_betw: "T x ⟹ T y ⟹ T (x @ a # y @ [b])"
你是对的T x ==> T y ==> T (x @ y)
是至关重要的引理。至于证明这个引理,我们通过经验(和启发式)我们的归纳定义它们各自的归纳规则最有可能通过归纳来证明关于它们的事实。我觉得其他感应方案,比如你对length v
的自然数的归纳,会使事情不必要地复杂化。
非正式地证明
lemma
assumes "T x" and "T y"
shows "T (x @ y)"
我首先对T x
的结构进行案例分析(根据语法的情况;相应的事实是T.cases
),然后在T y
上进行归纳(使用规则T.induct
),但可能还有其他方法可以做到。一般结构将是
using assms
proof (cases rule: T.cases)
case empty
...
next
case (conc_betw u v)
with `T y` show ?thesis
apply (induct rule: T.induct)
...
qed
更新:实际上,对x
结构的案例分析证明是多余的。非正式地,我认为如下。假设T x
和T y
成立。现在根据y
的形成规则对T
的结构应用归纳法。
y = []
。然后我们就完成了T (x @ y) = T (x @ []) = T x
,这是假设之一。
y = u @ a # v @ [b]
。通过归纳假设(IH),我们得到T u
,T v
,T (x @ u)
和T (x @ v)
。现在实例化T
的第二个形成规则
T (x @ u) ==> T v ==> T ((x @ u) @ a # v @ [b])
简化为T (x @ u) ==> T v ==> T (x @ u @ a # v @ [b])
(通过@
的关联性),从而允许我们减少我们的主要目标,恰好是T (x @ u @ a # v @ [b])
两个子目标T (x @ u)
和T v
,由IH持有。