将要操作的数据与操作合理的证明分离

时间:2012-09-11 08:49:15

标签: coq

我有一种列表,其头部和尾部必须具有某种意义并且#34;兼容":

Inductive tag := A | B. (* Just an example *)

Inductive element : tag -> tag -> Set :=
  | AA : element A A
  | AB : element A B
  | BB : element B B. (* Also just an example *)

Inductive estack : tag -> tag -> Set :=
  | ENil  : forall     t,                              estack t t
  | ECons : forall r s t, element r s -> estack s t -> estack r t.

但是,由于以下原因,我不太喜欢这段代码:

  1. 它不是模块化:ad-hoc列表数据构造函数本质上与头部和尾部兼容的证明 - 标签。
  2. 它不支持代码重用:我被迫重新定义通常的列表函数(例如列表连接)并重新证明通常的列表定理(例如列表连接的关联性)。
  3. 我有一个不同的方法,包括三个步骤:

    1. 定义单一类型的标记元素(与标记类型的元素系列相对):

      Inductive taggedElement := Tagged : forall t1 t2, element t1 t2 -> taggedElement.
      
    2. 定义标记元素的任意(即有效或无效)列表类型:

      Definition taggedElementStack := list taggedElement.
      
    3. 将标记元素的有效列表定义为元组,其元素是标记元素的任意列表,证明元素与相邻元素兼容的。

      (* I have no idea how to do this in Coq, hence the question!
       * 
       * I am going to use pseudomathematical notation. I am not well versed in either
       * mathematics or theoretical computer science, so please do not beat me with a
       * stick if I say something that is completely bogus!
       * 
       * I want to construct the type
       * 
       *     (tes : taggedElementStack, b : proof that P(tes) holds)
       * 
       * where P(tes) is a predicate that is only true when, for every sublist of tes,
       * including tes itself, the heads and tails are compatible.
       *)
      
    4. 我如何在Coq中执行第三步?

1 个答案:

答案 0 :(得分:2)

看看你的estack,它有什么作用?概括! element只是一种关系(A -> A -> Set),tag只是Set。你得到了什么?

Inductive RTList {I : Set} (X : Rel I) : Rel I :=
  | RTNil  : forall {i : I}, RTList X i i
  | RTCons : forall {i j k : I},    X i j -> RTList X j k -> RTList X i k.

Rel只是Rel I = I -> I -> Set的定义。)

反身传递闭合! 是常见的,可重用的和模块化的。或者你认为。

我在Coq的库中找到的唯一实现是在Coq.Relations.Relation_Operators,名为clos_refl_trans,结构不同并锁定在Prop(根据文档,所有都没有尝试)。

你可能不得不重新实现它或在某个地方找到一个库。至少,您只需执行一次此操作(或SetPropType最多三次。


你的另一个想法可能会更难管理。查看NoDup与您的描述类似的内容,您可以重用该模式。如果你真的想要那个。 NoDup使用In,这是一个检查元素是否在列表中的函数。我最后一次尝试使用它时,我发现解决涉及In的证据要困难得多。你不能只是destruct但是必须使用辅助引理,你必须小心地展开$ n级别,折回很难等等。我建议除非真的有必要,否则你最好坚持下去包含Prop s。

的数据类型