Как рассчитать sqrt натурального или рационального числа в coq?

Я изучаю coq и пытаюсь создать свои собственные типы данных Point и Line. Я хотел бы создать функцию, которая возвращает длину строки, но я не могу найти функцию 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
).

person Albtzrly    schedule 30.08.2015    source источник
comment
Вам нужно будет решить, какой тип должен иметь квадратный корень, и что вы хотите, чтобы произошло, когда квадратный корень не существует. Например, какое значение и тип вы хотите, чтобы line_length (line (point 0 0) (point 1 1)) возвращал?   -  person Mark Dickinson    schedule 30.08.2015
comment
Я бы хотел, чтобы тип был действительным числом, а затем ограничил квадратный корень только положительными числами, что должно произойти, если я возьму только квадратный корень из (x1 - x2)^2 + (y1 -y2)^2. Это гарантированно всегда будет положительным числом. Но затем преобразовать действительное число в рациональное число, если это возможно? В противном случае я не уверен. Могут ли выходные значения coq быть выражены в виде квадратного корня? Так, например, расстояние между точкой (0,0) и точкой (1,1) будет выводить sqrt (2).   -  person Albtzrly    schedule 30.08.2015


Ответы (1)


Если вы хотите, чтобы ваш квадратный корень вычислялся, вы можете сделать две вещи.

  • Используйте библиотеку CoRN. Затем вы получите функции действительных чисел, которые действительно вычисляют. Однако эти действительные числа будут просто функциями, которые вы можете запросить для приближения с определенной точностью, поэтому это может быть не то, что вы ищете. Кроме того, я думаю, что CoRN в настоящее время не очень хорошо поддерживается.

  • Используйте квадратный корень натурального числа из стандартной библиотеки, о которой вы уже упоминали, и используйте его для вычисления квадратных корней, которые вы хотите с определенной точностью самостоятельно. Эту функцию вы получаете, импортируяBinNat:

    Coq < Require Import BinNat.
    [Loading ML file z_syntax_plugin.cmxs ... done]
    
    Coq < Eval compute in N.sqrt 1000.  
          = 31%N
          : N
    
person Freek Wiedijk    schedule 22.01.2017