Coq - 如何显示函数的第一个参数正在减少?

时间:2013-02-21 20:45:57

标签: coq

我正在通过this Coq教程,我坚持使用最后一个练习。 我为自然数的二进制表示定义了一种数据类型,现在我想将自然数转换为这种表示形式:

Inductive bin : Type :=
  | BO : bin
  | TO : bin -> bin
  | T1 : bin -> bin.

我的第一个天真的方法就是:

Fixpoint divmod_2 (n : nat) :=
  match n with
  | O => (O, 0)
  | S O => (O, 1)
  | S (S n') => match (divmod_2 n') with
                | (q, u') => ((S q), u')
                end
  end.

Fixpoint to_bin (n : nat) : bin :=
  match n with
  | O => BO
  | S n' => match divmod_2 n' with
            | (q, 0) => TO (to_bin q)
            | (q, 1) => T1 (to_bin q)
            | (_, _) => BO
            end
  end.

Coq在to_bin的定义中停止说:

Error:
Recursive definition of to_bin is ill-formed.
In environment
to_bin : nat -> bin
n : nat
n' : nat
q : nat
n0 : nat
Recursive call to to_bin has principal argument equal to "q" instead of
"n'".

所以这就是问题:如何修复此to_bin功能?
我是否必须按照here所述提供有根据的递归证明? 我认为有一个更简单的解决方案,因为它是一个新手教程?

1 个答案:

答案 0 :(得分:4)

我认为最简单的解决方案是先为二元自然定义一个后继函数,然后用它来转换一元自然的后继函数。