固定元组参数的归纳谓词

时间:2013-04-24 07:30:59

标签: isabelle

让我们假设我们有一些谓词

definition someP :: "('a × 'a) ⇒ 'a ⇒ 'a ⇒ bool"

inductive就可以了

inductive my_inductive :: "('a × 'a) ⇒ 'a ⇒ bool"
 for "a_b" where
 basecase: "fst a_b = a ⟹ my_inductive a_b a" |
 stepcase: "someP a_b x y ⟹ my_inductive a_b x ⟹ my_inductive a_b y"

对于第一个参数“a_b”,感应是固定的。 “a_b”是一个元组,导致一些丑陋的语法。不幸的是,伊莎贝尔不允许我写for "(a,b)"

如何为这种归纳谓词创建更好的引入和归纳规则?

1 个答案:

答案 0 :(得分:0)

我们可以使用更漂亮的基础和默认的步骤来定义一组新的引入规则my_inductive_intros

lemma my_inductive_intro_1: "my_inductive (a, b) a"
  by (simp add: my_inductive.basecase)
lemmas my_inductive_intros = my_inductive_intro_1 my_inductive.stepcase

我们可以写出自己漂亮的归纳规则

lemma my_inductive_tuple_induct[consumes 1, case_names "basecase" "stepcase", induct pred: my_inductive]: 
 "my_inductive (a, b) x ⟹ 
 (P a) ⟹ (⋀x y. someP (a, b) x y ⟹ my_inductive (a, b) x ⟹ P x ⟹ P y) ⟹ P x"
 apply(rule my_inductive.induct[of "(a,b)"])
 apply(simp_all)
 done

consumes 1告诉isabelle使用第一个参数。让我们通过一个例子说明这一点:

lemma "my_inductive (a,b) c ⟹ P a b c"
  proof(induction rule: my_inductive_tuple_induct)

没有[consumes 1]这就是证明状态:

  1. my_inductive(?a,?b)(my_inductive(a,b)c⟶Pa b c)
  2. ?一个
  3. ⋀xy。 someP(?a,?b)xy⟹my_inductive(?a,?b)x⟹x⟹y
  4. 使用[consumes 1],我们可以获得所需的证明状态:

    1. P a b a
    2. ⋀xy。 someP(a,b)xy⟹my_inductive(a,b)x⟹Pa bx⟹Pa b y
    3. case_names设置isar证明的案例名称。因此,上述证据可以从case basecase开始。

      induct pred告诉我们正在宣布归纳规则。在某些情况下,仅仅写proof(induction)就足以让伊莎贝尔自己想出使用我们新的花式归纳规则。

      以下示例演示了设置

      lemma
        assumes "my_inductive (a,b) c" shows "P a b c"
        using assms
      proof (induction)
      case basecase thus ?case using my_inductive_intros sorry
      case (stepcase x y) thus ?case using my_inductive_intros sorry
      qed