Coq:在归纳类型

时间:2016-09-07 06:24:40

标签: logic coq induction mutual-recursion

我在归纳类型事件上定义了三个相互递归的函数,使用两种不同的方式:使用修复关键字,但是,Coq抱怨主要论点分别在...... 中找不到引用... 这两个函数的两个实现如下:

Require Import List.

Parameter max: list nat -> nat.
Inductive event : Type := node: list event -> event. 
Parameter eventbool : forall (P:event->Prop) (e:event), {P e} + {~ P e}.
Definition event_sumbool_b (e: event) (p: event -> Prop) : bool :=
  if eventbool p e then true else false.

Fixpoint parentround (e: event) : nat :=
  match e with
 | node l =>  max (rounds l)
 end

 with rounds l := 
   match l with 
   | nil => 0::nil 
   | h::tl => round h:: rounds tl
   end 

 with round e := 
   if event_sumbool_b e roundinc then parentround e + 1 else parentround e

 with roundinc e :=
  exists S:list event, (forall y, List.In y S /\ round y = parentround e). 

Coq抱怨递归调用round的主要参数等于“h”而不是“tl”。即使 h 调用 round e 的子词。根据{{​​3}}中的想法,我将 parentround 替换为以下内容:

Fixpoint parentround (e: event) : nat :=

 let round := 
   ( fix round (e: event) : nat := 
      if event_sumbool_b e roundinc then parentround e + 1 else parentround e
   ) in

 let roundinc := 
   ( fix roundinc (e: event) : Prop :=
     exists S:list event, (forall y, List.In y S /\ round y = parentround e)
   ) in

 match e with
 | node l =>  max (rounds l)
 end

 with rounds l :=
   match l with 
   | nil => 0::nil 
   | h::tl => round h:: rounds tl
   end. 

它现在抱怨缺少 roundinc 的定义。

请帮我定义这三个相互递归的函数 parentround round roundinc

编辑定义中有第四个函数 rounds ,但到目前为止它没有问题。

2 个答案:

答案 0 :(得分:2)

我想要计算出你想要计算的内容有点困难,我从以下内容开始:

From mathcomp Require Import ssreflect ssrbool eqtype ssrnat seq choice fintype.
From mathcomp Require Import bigop.

Definition max_seq l := \max_(x <- l) x.

Inductive event : Type :=
  node : seq event -> event.

Fixpoint round_lvl (e : event) : nat :=
  (* XXX: Missing condition *)
  let cond_inc x := round_lvl x in
  match e with
  | node l => max_seq (map cond_inc l)
  end.

但我无法解析存在条件的含义。我建议您首先尝试使用 Coq代码来表达问题,也许可以从中找到解决方案。

答案 1 :(得分:1)

根据我的经验,很难在类型Tlist T上定义相互功能。我记得关于这个子喷气机的关于Coq俱乐部的帖子,我必须再次找到它。

&#34; easy&#34;解决方案是定义一个互感类型,您可以同时定义eventevent_list。但是,您无法使用列表库...