以下是简单语言的定义:
theory SimpleLang
imports Main
begin
type_synonym vname = "string"
datatype exp = BConst bool | IConst int | Let vname exp exp | Var vname | And exp exp
datatype type = BType | IType
type_synonym tenv = "vname ⇒ type option"
inductive typing :: "tenv ⇒ exp ⇒ type ⇒ bool"
("(1_/ ⊢/ (_ :/ _))" [50,0,50] 50) where
BConstTyping: "Γ ⊢ BConst c : BType" |
IConstTyping: "Γ ⊢ IConst c : IType" |
LetTyping: "⟦Γ ⊢ init : t1; Γ(var ↦ t1) ⊢ body : t⟧ ⟹ Γ ⊢ Let var init body : t" |
VarTyping: "Γ var = Some t ⟹ Γ ⊢ Var var : t" |
AndTyping: "⟦Γ ⊢ a : BType; Γ ⊢ b : BType⟧ ⟹ Γ ⊢ And a b : BType"
lemma AndTypingRev:
"Γ ⊢ And a b : BType ⟹ Γ ⊢ a : BType ∧ Γ ⊢ b : BType"
end
我为表达式定义了一个输入函数。而且我试图证明如果And-expression有一个Bool Type,那么它的两个参数也都有Bool Type。它是对理论中AndTyping规则的回归。
你能建议如何证明这个引理吗?没有Isar可以证明吗?
答案 0 :(得分:1)
inductive
证明了一种名为typing.cases
的消除规则。这允许你做'规则倒置'。 Isar的方式是这样做:
lemma AndTypingRev:
assumes "Γ ⊢ And a b : BType"
shows "Γ ⊢ a : BType ∧ Γ ⊢ b : BType"
using assms by (cases rule: typing.cases) auto
由于这是涉及typing
的案例区别的默认规则,因此您也可以只编写by cases auto
。在任何情况下,如果您使用cases
,则应将typing
与using
,from
等的假设联系起来。
您也可以不使用例如链接进行链接。 erule
:
lemma AndTypingRev:
"Γ ⊢ And a b : BType ⟹ Γ ⊢ a : BType ∧ Γ ⊢ b : BType"
by (erule typing.cases) auto
还有另一种方法:您可以使用inductive_cases
命令自动为规则反转生成合适的引理(实质上,它是typing.cases
规则的专用版本):
inductive_cases AndTypingRev: "Γ ⊢ And a b : BType"
你可以使它更加通用:
inductive_cases AndTypingRev: "Γ ⊢ And a b : t"
这为您提供了可以与AndTypingRev
,erule
或elim
一起使用的排除规则cases
:
?Γ ⊢ And ?a ?b : ?t ⟹
(?t = BType ⟹ ?Γ ⊢ ?a : BType ⟹ ?Γ ⊢ ?b : BType ⟹ ?P) ⟹
?P