我在归纳类型事件上定义了三个相互递归的函数,使用两种不同的方式:使用和和修复关键字,但是,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 ,但到目前为止它没有问题。
答案 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)
根据我的经验,很难在类型T
和list T
上定义相互功能。我记得关于这个子喷气机的关于Coq俱乐部的帖子,我必须再次找到它。
&#34; easy&#34;解决方案是定义一个互感类型,您可以同时定义event
和event_list
。但是,您无法使用列表库...