如何在 coq 中计算自然数或有理数的平方根?
How do I the calculate the sqrt of a natural or rational number in coq?
我正在学习 coq,并且正在尝试创建自己的点和线数据类型。我想创建一个 return 行长的函数,但我似乎无法找到将 return 进行计算的 sqrt 函数。我试过使用 Coq.Reals.R_sqrt
,但显然它只用于抽象数学,所以它不会 运行 计算。
然后我尝试导入 Coq.Numbers.Natural.Abstract.NSqrt
和 Coq.Numbers.NatInt.NZSqrt.
但都没有将 sqrt 函数放入环境中。
这是我目前所拥有的...
Require Import Coq.QArith.QArith_base.
Require Import Coq.Numbers.NatInt.NZSqrt.
Require Import Coq.Numbers.Natural.Abstract.NSqrt.
Require Import Coq.ZArith.BinInt.
Inductive Point : Type :=
point : Q -> Q -> Point.
Inductive Line : Type :=
line : Point -> Point -> Line.
Definition line_fst (l:Line) :=
match l with
| line x y => x
end.
Definition line_snd (l:Line) :=
match l with
| line x y => y
end.
Definition point_fst (p:Point) :=
match p with
| point x y => x
end.
Definition point_snd (p:Point) :=
match p with
| point x y => y
end.
(* The reference sqrt was not found in the current environment. *)
Definition line_length (l:Line) :=
sqrt(
(minus (point_snd(line_fst l)) (point_fst(line_fst l)))^2
+
(minus (point_snd(line_snd l)) (point_fst(line_snd l)))^2
).
Example line_example : (
line_length (line (point 0 0) (point 0 2)) = 2
).
如果你想计算平方根,你可以做两件事。
使用CoRN library。然后您将获得实际计算的实数函数。但是,这些实数只是您可以要求获得一定精度的近似值的函数,因此可能不是您要找的东西。另外,我认为 CoRN 现在维护得不是很好。
使用您已经提到的标准库中的自然数平方根,并使用它自己计算您想要的某个精度的平方根。这个函数你通过导入BinNat
:
得到
Coq < Require Import BinNat.
[Loading ML file z_syntax_plugin.cmxs ... done]
Coq < Eval compute in N.sqrt 1000.
= 31%N
: N
我正在学习 coq,并且正在尝试创建自己的点和线数据类型。我想创建一个 return 行长的函数,但我似乎无法找到将 return 进行计算的 sqrt 函数。我试过使用 Coq.Reals.R_sqrt
,但显然它只用于抽象数学,所以它不会 运行 计算。
然后我尝试导入 Coq.Numbers.Natural.Abstract.NSqrt
和 Coq.Numbers.NatInt.NZSqrt.
但都没有将 sqrt 函数放入环境中。
这是我目前所拥有的...
Require Import Coq.QArith.QArith_base.
Require Import Coq.Numbers.NatInt.NZSqrt.
Require Import Coq.Numbers.Natural.Abstract.NSqrt.
Require Import Coq.ZArith.BinInt.
Inductive Point : Type :=
point : Q -> Q -> Point.
Inductive Line : Type :=
line : Point -> Point -> Line.
Definition line_fst (l:Line) :=
match l with
| line x y => x
end.
Definition line_snd (l:Line) :=
match l with
| line x y => y
end.
Definition point_fst (p:Point) :=
match p with
| point x y => x
end.
Definition point_snd (p:Point) :=
match p with
| point x y => y
end.
(* The reference sqrt was not found in the current environment. *)
Definition line_length (l:Line) :=
sqrt(
(minus (point_snd(line_fst l)) (point_fst(line_fst l)))^2
+
(minus (point_snd(line_snd l)) (point_fst(line_snd l)))^2
).
Example line_example : (
line_length (line (point 0 0) (point 0 2)) = 2
).
如果你想计算平方根,你可以做两件事。
使用CoRN library。然后您将获得实际计算的实数函数。但是,这些实数只是您可以要求获得一定精度的近似值的函数,因此可能不是您要找的东西。另外,我认为 CoRN 现在维护得不是很好。
使用您已经提到的标准库中的自然数平方根,并使用它自己计算您想要的某个精度的平方根。这个函数你通过导入
得到BinNat
:Coq < Require Import BinNat. [Loading ML file z_syntax_plugin.cmxs ... done] Coq < Eval compute in N.sqrt 1000. = 31%N : N