【发布时间】:2021-03-10 23:51:15
【问题描述】:
我目前正在阅读软件基础系列的第一卷。在其中一个练习中,我应该编写一个函数,将自然数(一元形式)转换为等效的二进制数。
这是我的代码/方法:
Inductive bin : Type :=
| Z
| B0 (n : bin)
| B1 (n : bin).
Fixpoint evenb (n:nat) : bool :=
match n with
| O => true
| S O => false
| S (S n') => evenb n'
end.
Fixpoint nat_to_bin (n:nat) : bin :=
match n with
| 0 => Z
| 1 => B1 Z
| 2 => B0 (B1 Z)
| m => match evenb(m) with
| true => B0 (nat_to_bin (Nat.div m 2))
| false => B1 (nat_to_bin (Nat.modulo m 2))
end
end.
我正在使用https://jscoq.github.io/scratchpad.html 进行这些练习。 现在我收到此错误消息:
nat_to_bin 的递归定义格式不正确。在环境中 nat_to_bin : nat -> bin
n : 自然
n0 : 自然
n1:自然
n2:自然
对 nat_to_bin 的递归调用的主要参数等于“Nat.div n 2 " 而不是以下变量之一: "n0" "n1" "n2" 。 递归定义为:“fun n : nat => match n with
| 0 => Z
| 1 => B1 Z
| 2 => B0 (B1 Z)
| S (S (S _) ) =>
如果 evenb n 那么 B0 (nat_to_bin (Nat.div n 2 ) )
else B1 (nat_to_bin (Nat.modulo n 2 ) )
结束“。
【问题讨论】: