在Isabelle中定义不同类型的不相交联合以及更多

时间:2014-11-14 09:22:55

标签: isabelle isar

我问了一系列问题,以便我可以在Isabelle中定义以下简单模型,但我仍然坚持得到我想要的东西。我试着通过一个例子非常简单地描述问题:

实施例

假设我有两个类 Person Car Person 拥有汽车以及驱动器< / em>汽车。所以我需要以下类型/集:

汽车

拥有(*拥有将Person的元素与Car *相关联)

驱动器(*驱动器也将人员的元素与汽车相关联*)

问题:

我想在Isabelle的上述例子中提出一种提供以下灵活性的方法:

  1. 让我定义一些约束;例如:如果一个人拥有一辆汽车,他/她肯定会开车。我可以使用here的答案来解决这个问题。

  2. 允许我定义一个新的集合/类型,即 C ,其元素是 Car 拥有元素的不相交联合。 是我坚持的第一个 Car 拥有是不同的类型,那么我如何结合它们呢?

  3. 能够在数字(2)中多次继续该过程;例如,定义一个新的类型/集合,即 D ,它是 C 驱动器的不相交联合。

  4. 在数字(2)和(3)中,我想保留新定义的集合/类型的元素的属性/特征;例如,如果我要为Person定义属性 age (请参阅here),我希望 C 的元素在某种意义上保留此属性我可以访问此属性以获取类型为Person的 C 中的元素。因此,如果o1是 C 中的一个元素,其类型是拥有,我想访问源(即Person)和目标(Car)与o1相关。

    我将不胜感激任何意见和建议。

1 个答案:

答案 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"