在Coq中建模面向对象的程序

时间:2015-09-26 10:39:48

标签: oop graph coq

我想证明一些关于命令式面向对象程序的事实。如何在Coq中表示异构对象图?我的主要问题是边是隐式的 - 每个节点都包含一个整数标签建模对象地址和一个模拟对象状态的数据结构。因此隐式边缘由数据结构内的字段形成,这些字段对对象指针进行建模并包含图中另一个节点的地址标签。为确保我的图表有效,向图表添加新节点必须要求证明正在添加的数据结构中的所有字段都是指图中已存在的节点。但是如何在Coq中表达“数据结构中的所有指针字段”?

1 个答案:

答案 0 :(得分:2)

这取决于您如何表示数据结构,以及您希望建模的语言具有哪些功能。这是一种可能性。假设您的语言有两种值:数字和对象引用。我们可以在Coq中写这种类型:

Inductive value : Type :=
| VNum (n : nat)
| VRef (ref : nat).

引用(或指针)只是一个自然数,可用于唯一标识堆上的对象。我们可以使用函数来表示对象和堆,如下所示:

Definition object : Type := string -> option value.
Definition heap : Type := nat -> option object.

用英语释义,对象是从字符串(我们用来模拟对象中的字段)到值的部分函数,​​而堆是从nats(即对象引用)到对象的部分函数。然后我们可以将您的财产表达为:

Definition object_ok (o : object) (h : heap) : Prop :=
  forall (s : string) (ref : nat),
    o s = Some (VRef ref) ->
    exists obj, h ref = Some obj.

同样,用英语:如果定义了对象s的字段o,并且等于引用ref,则存在一些对象obj堆上的地址h

该表示的一个问题是Coq函数使堆可以拥有无​​限多个对象,而对象可以拥有无​​限多个字段。您可以使用替代表示来避免此问题,该表示仅允许在有限多个输入上定义的函数,例如对的列表,或者(甚至更好)一类有限映射,例如this one