我正在浏览库Q_denumerable.v
中的代码QArithSternBrocot,这就是我遇到的情况。
Fixpoint positive_to_Qpositive_i (p:positive) : Qpositive :=
match p with
| xI p => nR (positive_to_Qpositive_i p)
| xO p => dL (positive_to_Qpositive_i p)
| xH => One
end.
nR
和dL
的含义是什么?
答案 0 :(得分:2)
库名称和文档引用Stern-Brocot tree,但实际上编码是名为Calkin-Wilf tree的变体。 One
是树的根,即数字1,构造函数nR
和dL
表示两个子项:if w
表示p / q(带p和q互质,即理性是不可简化的形式)然后nR w
代表((p + q)/ q)和dL w
代表(p /(p + q))。函数Qpositive_i
计算Qpositive
值的(分子,分母)表示。
函数positive_to_Qpositive_i
计算以二进制表示法给出的正整数的Calkin-Wilf表示。
答案 1 :(得分:1)
nR
和nL
是Qpositive
类型的构造函数,其definition是:
Inductive Qpositive : Set :=
| nR : Qpositive → Qpositive
| dL : Qpositive → Qpositive
| One : Qpositive.
根据我的理解,我们的想法是,如果某些x : Qpositive
表示正有理数p / q
,则dL x
代表p / (p + q)
,而nR x
代表(p + q) / q
。你可以看看,例如在Qpositive_i
函数:对于每个x : Qpositive
,它会为您提供自然数p
和q
,以便x
代表p / q
。
在这个表示法中弄清楚如何表示给定的正有理数并不太难(这是同一个文件中的Qpositive_c
函数似乎在做什么)。例如,以下是您如何表示5 / 8
(使用非正式的Coq语法):
5 / 8
= 5 / (5 + 3) = dL (5 / 3)
= dL ((2 + 3) / 3) = dL (nR (2 / 3))
= dL (nR (2 / (2 + 1))) = dL (nR (dL (2 / 1)))
= dL (nR (dL ((1 + 1) / 1))) = dL (nR (dL (nR (1 / 1))))
= dL (nR (dL (nR One)))
因此,顾名思义,positive_to_Qpositive_i
函数是positive
和Qpositive
类型之间的同构。两种类型都具有基本相同的构造函数集,但名称不同,因此函数只需要在两个声明之间进行转换。