带有“承认义务”和嵌套递归的程序修订点错误

时间:2018-12-17 12:14:13

标签: coq

我试图使用GetUsersInRole定义一个函数,该函数在其主体中使用了另一个(匿名)递归函数。我暂时尝试使用Program Fixpoint,看是否还有其他合理的地方,但出现错误。

这是一个显示相同错误的简单示例(也许有一个更简单的错误...)。

Admit Obligations

因此,运行此命令时会显示Require Import List. Import ListNotations. Require Import Program. Section Test. Inductive FType : Type := | Base : RType -> FType | Cons : RType -> FType -> FType with RType : Type := | Empty : RType | Nested : nat -> FType -> RType | NestedList : nat -> list FType -> RType. Variable ftype_size : FType -> nat. Program Fixpoint failing (ft : FType) {measure (ftype_size ft)} : FType := match ft with | Base _ => ft | Cons hd tl => match hd with | NestedList l rs => let fix loop (rs : list FType) (i : nat) : list FType := match rs with | [] => [] | r' :: rs' => (failing r') :: (loop rs' (i + 1)) end in Base (NestedList l (loop rs 0)) | _ => ft end end. Admit Obligations. End Test. 。我想知道为什么会这样吗?它与此issue有某种联系吗?

此外,如果我定义索引映射并重复此操作,则不会出现任何错误。

Recursive call to loop has not enough arguments.

我可能可以用不同的方式定义它,但是我仍然想知道为什么会这样。

1 个答案:

答案 0 :(得分:1)

进一步阅读错误消息,请注意loop在打印功能中出现了两次。第二种情况是您编写的,而第一种情况(有问题的)是由Admit Obligations生成的公理的参数。

Recursive call to loop has not enough arguments.
Recursive definition is:
"fun (rs0 : list FType) (i : nat) =>
 let program_branch_0 := fun _ : [] = rs0 => [] in
 let program_branch_1 :=
   fun (r' : FType) (rs' : list FType) (Heq_rs : r' :: rs' = rs0) =>
   failing r'
     (failing_obligation_1 ft failing hd tl Heq_ft l rs Heq_hd loop
        rs0 i r' rs' Heq_rs) :: loop rs' (i + 1) in
 match rs0 as rs' return (rs' = rs0 -> list FType) with
 | [] => program_branch_0
 | r' :: rs' => program_branch_1 r' rs'
 end eq_refl".

为避免这种情况,您可以手动执行相应的义务,并放置不依赖loop的公理。

Parameter TODO : forall {A : Prop}, A.

Program Fixpoint failing ... (* Your definition *)

Next Obligation.
  apply TODO.
Qed.

(* Now the rest can still be Admitted. *)
Admit Obligations.