如何从归纳声明中得出结论来证明假设?

时间:2017-07-07 11:14:20

标签: isabelle

以下是简单语言的定义:

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可以证明吗?

1 个答案:

答案 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,则应将typingusingfrom等的假设联系起来。

您也可以不使用例如链接进行链接。 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"

这为您提供了可以与AndTypingReveruleelim一起使用的排除规则cases

?Γ ⊢ And ?a ?b : ?t ⟹
    (?t = BType ⟹ ?Γ ⊢ ?a : BType ⟹ ?Γ ⊢ ?b : BType ⟹ ?P) ⟹
  ?P