这是一个简单的类型系统:
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
是什么类型的?它是普遍量化的变量吗?如何使其存在量化?
答案 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
所获得的变量,但目前还不清楚你是如何进入问题的最后一行的。