coq中的递归函数定义,限制可能的输入集

时间:2011-07-05 01:45:11

标签: coq

我需要定义一个没有容易测量的参数的递归函数。我保留了一个使用过的参数列表,以确保每个参数最多使用一次,输入空间是有限的。

使用度量(inpspacesize - (length l))主要起作用,但我陷入了一个案例。我似乎错过了以前l层已正确构建的信息,i。即没有重复项,所有条目都来自输入空间。

现在我正在寻找能够满足我需要的列表替换。

修改我已将此内容简化为以下内容:

nat小于给定的max,并且需要确保每个号码最多调用一次该函数。我想出了以下内容:

(* the condition imposed *)
Inductive limited_unique_list (max : nat) : list nat -> Prop :=
  | LUNil  : limited_unique_list max nil
  | LUCons : forall x xs, limited_unique_list max xs
             -> x <= max
             -> ~ (In x xs)
             -> limited_unique_list max (x :: xs).

(* same as function *)
Fixpoint is_lulist (max : nat) (xs0 : list nat) : bool :=
  match xs0 with
  | nil     => true
  | (x::xs) => if (existsb (beq_nat x) xs) || negb (leb x max)
                 then false
                 else is_lulist max xs
  end.

(* really equivalent *)
Theorem is_lulist_iff_limited_unique_list : forall (max:nat) (xs0 : list nat),
    true = is_lulist max xs0 <-> limited_unique_list max xs0.
Proof. ... Qed.

(* used in the recursive function's step *)
Definition lucons {max : nat} (x : nat) (xs : list nat) : option (list nat) :=
  if is_lulist max (x::xs)
    then Some (x :: xs)
    else None.

(* equivalent to constructor *)
Theorem lucons_iff_LUCons : forall max x xs, limited_unique_list max xs ->
    (@lucons max x xs = Some (x :: xs) <-> limited_unique_list max (x::xs)).
Proof. ... Qed.

(* unfolding one step *)
Theorem lucons_step : forall max x xs v, @lucons max x xs = v ->
  (v = Some (x :: xs) /\ x <= max /\ ~ (In x xs)) \/ (v = None).
Proof. ... Qed.

(* upper limit *)
Theorem lucons_toobig : forall max x xs, max < x
    -> ~ limited_unique_list max (x::xs).
Proof. ... Qed.

(* for induction: increasing max is ok *)
Theorem limited_unique_list_increasemax : forall max xs,
  limited_unique_list max xs -> limited_unique_list (S max) xs.
Proof. ... Qed.

当我试图证明我不能将一个元素插入完整列表时,我一直陷入困境(IH出现无法使用或无法找到我需要的信息)。由于我认为这种不可插入性对于显示终止至关重要,我仍然没有找到可行的解决方案。

有关如何以不同方式证明这一点,或重组以上内容的任何建议?

1 个答案:

答案 0 :(得分:1)

如果没有更多细节(请详细说明!),很难说很多,但是:

  • 您使用的是Program命令吗?对于使用非平凡的度量来定义函数当然非常有用。
  • 如果您尝试套装,那么它的独特性会不会起作用?我记得写一个听起来非常像你所说的函​​数:我有一个函数,其中一个参数包含一组项。这组项目单调增长,仅限于有限的项目空间,给出了终止论证。