我问了一系列问题,以便我可以在Isabelle中定义以下简单模型,但我仍然坚持得到我想要的东西。我试着通过一个例子非常简单地描述问题:
假设我有两个类 Person 和 Car , Person 拥有汽车以及驱动器< / em>汽车。所以我需要以下类型/集:
人
汽车
拥有(*拥有将Person的元素与Car *相关联)
驱动器(*驱动器也将人员的元素与汽车相关联*)
问题:
我想在Isabelle的上述例子中提出一种提供以下灵活性的方法:
让我定义一些约束;例如:如果一个人拥有一辆汽车,他/她肯定会开车。我可以使用here的答案来解决这个问题。
允许我定义一个新的集合/类型,即 C ,其元素是 Car 和拥有元素的不相交联合。 是我坚持的第一个: Car 和拥有是不同的类型,那么我如何结合它们呢?
能够在数字(2)中多次继续该过程;例如,定义一个新的类型/集合,即 D ,它是 C 和驱动器的不相交联合。
在数字(2)和(3)中,我想保留新定义的集合/类型的元素的属性/特征;例如,如果我要为Person定义属性 age (请参阅here),我希望 C 的元素在某种意义上保留此属性我可以访问此属性以获取类型为Person的 C 中的元素。因此,如果o1是 C 中的一个元素,其类型是拥有,我想访问源(即Person)和目标(Car)与o1相关。
我将不胜感激任何意见和建议。
答案 0 :(得分:1)
在Isabelle / HOL中有一个写成'a + 'b
的sum-type,它允许您将两种不同类型的元素组合成一个新元素。 sum类型的两个构造函数是
Inl :: 'a => 'a + 'b
注入左侧和
Inr :: 'b => 'a + 'b
注入 。使用sum-type,您可以将数字nat list
列表与普通数字nat
组合在一起,以获得(nat list) + nat
。由于列表提供了函数length :: 'a list => nat
,因此您仍然可以对不知道它们是列表的不相交和的元素使用此函数。为了获得这些信息(即,您看到的元素是列表还是普通数字),我们通常使用模式匹配。
如果当前元素是一个列表并且只返回它所代表的数字,则以下函数将计算列表的长度,否则。
fun maybe_length :: "(nat list) + nat => nat"
where
"maybe_length (Inl xs) = length xs" |
"maybe_length (Inr n) = n"