QArithSternBrocot库中的positive_to_Qpositive_i有什么作用?

时间:2015-03-28 16:06:54

标签: math coq theorem-proving

我正在浏览库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. 

nRdL的含义是什么?

2 个答案:

答案 0 :(得分:2)

库名称和文档引用Stern-Brocot tree,但实际上编码是名为Calkin-Wilf tree的变体。 One是树的根,即数字1,构造函数nRdL表示两个子项: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)

nRnLQpositive类型的构造函数,其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,它会为您提供自然数pq,以便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函数是positiveQpositive类型之间的同构。两种类型都具有基本相同的构造函数集,但名称不同,因此函数只需要在两个声明之间进行转换。