如何替换存在量化变量?

时间:2017-09-02 14:44:10

标签: isabelle

这是一个简单的类型系统:

datatype type =
  VoidType
| IntegerType
| RealType
| StringType

datatype val =
  VoidVal
| IntegerVal int
| RealVal real
| StringVal string

fun type_of :: "val ⇒ type" where
  "type_of (VoidVal) = VoidType"
| "type_of (IntegerVal _) = IntegerType"
| "type_of (RealVal _) = RealType"
| "type_of (StringVal _) = StringType"

与类型一致性关系:

inductive less_type :: "type ⇒ type ⇒ bool" (infix "<" 65) where
  "IntegerType < RealType"

整数值可以转换为相应的实际值:

inductive cast :: "val ⇒ val ⇒ bool" where
  "cast (IntegerVal x) (RealVal x)"

我试图证明以下引理。如果变量x的类型符合RealType,则存在类型y的值RealType,并且x可以投放到y

lemma is_castable_to_real:
  "type_of x < RealType ⟹ ∃y. type_of y = RealType ∧ cast x y"
  apply (rule exI[of _ "RealVal v"])

我可以使用cases策略来证明通用引理:

lemma is_castable:
  "type_of x < τ ⟹ ∃y. type_of y = τ ∧ cast x y"
  by (cases x; cases τ; auto simp add: less_type.simps cast.simps)

但是我试图理解如何对待引路中的存在量词。因此,我尝试为RealVal v提供具体的示例y

type_of x < RealType ⟹ ∃v. type_of (RealVal v) = RealType ∧ cast x (RealVal v)

问题是我得到了以下命题:

 type_of x < RealType ⟹ type_of (RealVal v) = RealType ∧ cast x (RealVal v)

变量v是什么类型的?它是普遍量化的变量吗?如何使其存在量化?

1 个答案:

答案 0 :(得分:1)

为了证明一个存在主义,你可以给出一个具体的例子。 在您的情况下,这个例子可以从引理的假设中得出。

lemma is_castable_to_real:
assumes subtype_of_real: "type_of x < RealType"
shows "∃y. type_of y = RealType ∧ cast x y"
proof -
  have "type_of x = IntegerType"
    using subtype_of_real less_type.cases by blast

  from this obtain i where x_def: "x = IntegerVal i"
    by (cases x, auto)

  (* prove it for concrete example (RealVal i) *)
  have "type_of (RealVal i) = RealType ∧ cast x (RealVal i)"
    by (auto simp add: x_def cast.intros)

  (* From the concrete example, the existential statement follows: *)
  thus "∃y. type_of y = RealType ∧ cast x y" ..
qed 

如果您在以某种方式获取或定义它之前只使用v,则该值将类似于undefined。它的类型正确,但您对此一无所知。

如果您在没有短划线(proof)的情况下启动-,Isabelle将使用默认策略,您将获得子目标type_of ?y = RealType ∧ cast x ?y。这里?y是一个原理图变量,您可以稍后提供在开始证明之前已经可用的任何值。也许这是v所获得的变量,但目前还不清楚你是如何进入问题的最后一行的。