products/sources/formale Sprachen/PVS/ACCoRD image not shown  

Quellcode-Bibliothek

© Kompilation durch diese Firma

[Weder Korrektheit noch Funktionsfähigkeit der Software werden zugesichert.]

Datei: horizontal.pvs   Sprache: PVS

Original von: PVS©

%------------------------------------------------------------------------------
% horizontal.pvs
% ACCoRD v1.0
%
% This theory provides definitions for horizontal separation and conflict.
%
% It also provides solutions to the times when a velocity vector
% intersects the circular protected zone. Given a current position s,
% a vector v intersects the circle of radius D at times Theta_D's that 
% are roots to the quadratic equation
%    a = sqv(v)
%    b = 2*(s*v)
%    c = sqv(s) - D^2
% The discriminant of this equation is 4*Delta. 
%------------------------------------------------------------------------------

horizontal[D: posreal]: THEORY
BEGIN
  
  IMPORTING reals@sign,
            reals@quadratic_2b,
     reals@quad_minmax,
            vectors@det_2D,
            vectors@closest_approach_2D,
            definitions,
     vectors@parallel_2D,
     horizontal_dist_convexity[D]

  s,v,w     : VAR Vect2
  nzv     : VAR Nz_vect2
  eps,dir : VAR Sign
  t,
  t1,t2   : VAR real
  nzk     : VAR nzreal
  pt,pr   : VAR posreal
 
  %% Horizontal separation at current time
  horizontal_sep?(s): MACRO bool = 
    sqv(s) >= sq(D)
  
  horizontal_sep_at?(s,v,t): MACRO bool =
    horizontal_sep?(s+t*v)

  %% Strict horizontal separation
  strict_horizontal_sep?(s): MACRO bool = 
    sqv(s) > sq(D)

  on_D?(s): MACRO bool =
    sqv(s) = sq(D)

  Sp_vect2  : TYPE = (horizontal_sep?)
  Ss_vect2  : TYPE = (strict_horizontal_sep?)

  sp : VAR Sp_vect2
  ss : VAR Ss_vect2

  ss_nzv : JUDGEMENT
    Ss_vect2 SUBTYPE_OF Nz_vect2

  ss_sp : JUDGEMENT
    Ss_vect2 SUBTYPE_OF Sp_vect2

  neg_ss : JUDGEMENT
    -(ss) HAS_TYPE Ss_vect2

  neg_sp : JUDGEMENT
    -(sp) HAS_TYPE Sp_vect2

  %% Horizontal separation in the direction given by dir (1=after,-1=before)
  horizontal_sep_dir_at?(s,v,t1,dir): MACRO bool =
    FORALL(t2): dir*t2 >= dir*t1 IMPLIES horizontal_sep_at?(s,v,t2)

  horizontal_sep_after?(s,v,t): MACRO bool = 
    horizontal_sep_dir_at?(s,v,t,1)

  %% Horizontal loss of separation
  horizontal_los?(s): MACRO bool = 
    sqv(s) < sq(D)

  horizontal_los_at?(s,v,t): MACRO bool =
    horizontal_los?(s+t*v)

  LoS_vect2 : TYPE  = {s: Nz_vect2 | horizontal_los?(s)}

  %% Horizontal conflict ever (infinite look-ahead time)
  horizontal_conflict_ever?(s,v): bool =
    EXISTS (t:real) : horizontal_los_at?(s,v,t)

  %% Horizontal conflict in the future (infinite look-ahead time)
  horizontal_conflict?(s,v):bool =
    EXISTS (nnt:nnreal) : horizontal_los_at?(s,v,nnt) 

  horizontal_conflict_sum_closed: LEMMA
    horizontal_conflict?(s,v) AND horizontal_conflict?(s,w)
    IMPLIES
    horizontal_conflict?(s,v+w)

  horizontal_conflict_neg : LEMMA
    horizontal_conflict?(-s,-v) IMPLIES horizontal_conflict?(s,v)

  horizontal_conflict_symm : LEMMA
    horizontal_conflict?(-s,-v) IFF horizontal_conflict?(s,v)

  horizontal_conflict_scal : LEMMA
    horizontal_conflict?(s,v) IFF horizontal_conflict?(s,pt*v)    

  horizontal_conflict_ever : LEMMA
    horizontal_conflict?(s,v) IMPLIES
    horizontal_conflict_ever?(s,v) 

  horizontal_conflict_ever_scal : LEMMA
    horizontal_conflict_ever?(s,v) IFF
    horizontal_conflict_ever?(s,nzk*v)    

  Delta(s,v) : real = 
    sq(D)*sqv(v) - sq(det(s,v))

  Delta_zero_eq_0 : LEMMA
    Delta(s,zero) = 0

  Delta_scal: LEMMA
    Delta(s,t*v) = sq(t)*Delta(s,v)

  Delta_eq : LEMMA
    Delta(s,v) = Delta(s+t*v,v) 

  Delta_symm : LEMMA 
    Delta(-s,-v) = Delta(s,v) 

  Delta_discr2b : LEMMA
    LET a = sqv(nzv),
        b = s*nzv,
        c = sqv(s) - sq(D) IN
    Delta(s,nzv) = discr2b(a,b,c)

  Delta_gt_0_nzv : LEMMA           
    Delta(s,v) > 0
    IMPLIES
      nz_vector?(v)

  ground_speed : LEMMA
    horizontal_conflict_ever?(sp,v)
    IMPLIES
      nz_vector?(v)

  Delta_gt_0 : LEMMA
    (horizontal_sep?(s) OR nz_vector?(v)) AND
    horizontal_conflict_ever?(s,v)
    IMPLIES 
      Delta(s,v) > 0

  Delta_gt_0_on_D: LEMMA on_D?(s) AND 
    s*v /= 0 IMPLIES
    Delta(s,v) > 0

  Delta_eq_0_dot_on_D: LEMMA on_D?(s) 
    AND s*v = 0 IMPLIES
    Delta(s,v) = 0

  Delta_ge_0 : LEMMA
    Delta(s,nzv) >= 0 IFF 
    (EXISTS (t: real): on_D?(s+t*nzv))

  Delta_ge_0_2: LEMMA
    Delta(s,nzv) >= 0 IFF 
    (EXISTS (t: real): sqv(s+t*nzv) <= sq(D))

  Delta_eq_0_eq_tca: LEMMA
    Delta(s,nzv) = 0 AND on_D?(s+t*nzv) IMPLIES
    ((s+t*nzv)*nzv = 0 AND t = horizontal_tca(s,nzv))

  sdotv_lt_0 : LEMMA  
    horizontal_conflict?(sp,v)
    IMPLIES
      sp*v < 0 

  %% eps chooses between the two solutions of the quadratic equation
  %% eps = Entry:  entry time into protected zone
  %% eps = Exit :  exit time from protected zone

  Theta_D(s,(nzv|Delta(s,nzv)>=0),eps):real =
    LET a = sqv(nzv),
        b = s*nzv,
        c = sqv(s) - sq(D) IN
    root2b(a,b,c,eps)

  Theta_D_on_D : LEMMA
    Delta(s,nzv) >= 0 IMPLIES
      LET t = Theta_D(s,nzv,eps) IN
      on_D?(s+t*nzv)

  Theta_D_unique_eps: LEMMA
    Delta(s,nzv) >= 0
    IMPLIES
      (on_D?(s+t*nzv) IFF
       EXISTS (eps): t = Theta_D(s,nzv,eps))

  Theta_D_unique: LEMMA
    Delta(s,nzv) >= 0 IMPLIES
      (on_D?(s+t*nzv) IFF
       t = Theta_D(s,nzv,Entry) OR t = Theta_D(s,nzv,Exit))

  Theta_D_symm : LEMMA
    Delta(s,nzv) >= 0 IMPLIES
      Theta_D(-s,-nzv,eps) = Theta_D(s,nzv,eps) 

  Theta_D_scal: LEMMA
     Delta(s,nzv) >= 0 IMPLIES
      nzk*Theta_D(s,nzk*nzv,eps) = Theta_D(s,nzv,sign(nzk)*eps)

  Theta_D_neg_nzv: LEMMA  
      Delta(s,nzv) >= 0 IMPLIES
      Theta_D(s,-nzv,-eps) = -Theta_D(s,nzv,eps) 

  Theta_D_le : LEMMA
    Delta(s,nzv) >= 0 IMPLIES
      Theta_D(s,nzv,Entry) <= Theta_D(s,nzv,Exit)

  Theta_D_lt : LEMMA
    Delta(s,v) > 0 IMPLIES
      Theta_D(s,v,Entry) < Theta_D(s,v,Exit)

  Theta_D_Delta_eq_0: LEMMA
    Delta(s,nzv) >= 0 IMPLIES
    (Delta(s,nzv) = 0 IFF
     Theta_D(s,nzv,Entry) = Theta_D(s,nzv,Exit))

  Theta_D_eq_0 : LEMMA
    on_D?(s) AND
    Delta(s,nzv) >= 0 AND
    horizontal_entry?(s,nzv)
    IMPLIES
    Theta_D(s,nzv,Entry) = 0

  Theta_D_ge_0 : LEMMA 
    Delta(sp,nzv) >= 0 AND
    horizontal_entry?(sp,nzv)
    IMPLIES 
      Theta_D(sp,nzv,Entry) >= 0

  Theta_D_neq_0 : LEMMA 
    Delta(ss,nzv) >= 0 
    IMPLIES 
      Theta_D(ss,nzv,eps) /= 0

  horizontal_conflict : LEMMA
    horizontal_conflict?(s,nzv) IFF
    Delta(s,nzv) > 0 AND 
    (horizontal_los?(s) OR horizontal_entry?(s,nzv))

  horizontal_conflict_on_D: LEMMA
    on_D?(s) IMPLIES
    (horizontal_conflict?(s,v) IFF s*v < 0)

  horizontal_entry_le : LEMMA
    t1 <= t2 AND
    sqv(s+t2*v) = sq(D) AND
    horizontal_entry_at?(s,v,t2) IMPLIES
    sqv(s+t1*v) >= sq(D) 

  not_horizontal_entry_lt : LEMMA
    LET t1 = max(0,horizontal_tca(s,nzv)) IN
      t2 > 0 AND
      sqv(s+t2*nzv) = sq(D) AND
      NOT horizontal_entry_at?(s,nzv,t2) IMPLIES
      t1 < t2 AND 
      horizontal_los?(s+t1*nzv)

  horizontal_los_inside_Theta : LEMMA
    Delta(s,nzv) >= 0 IMPLIES
      (t > Theta_D(s,nzv,Entry) AND
       t < Theta_D(s,nzv,Exit) IFF
       horizontal_los?(s+t*nzv))  

  horizontal_sep_outside_Theta : LEMMA
    Delta(s,nzv) >= 0 IMPLIES
    (t < Theta_D(s,nzv,Entry) OR
    t > Theta_D(s,nzv,Exit) IFF
    sqv(s + t*nzv) > sq(D))

  not_horiz_sep_inside_closed_Theta: LEMMA
    Delta(s,nzv) >= 0 IMPLIES
      (t >= Theta_D(s,nzv,Entry) AND  
       t <= Theta_D(s,nzv,Exit) IFF
      sqv(s+t*nzv) <= sq(D))

  Theta_D_entry_gt_0 : LEMMA
    horizontal_conflict?(ss,nzv) IMPLIES
      Theta_D(ss,nzv,Entry) > 0

  Theta_D_exit_gt_0 : LEMMA
    Delta(s,v) > 0
    IMPLIES
      (horizontal_los?(s) OR horizontal_entry?(s,v)
       IFF 
       Theta_D(s,v,Exit) > 0)

  Theta_D_entry_lt_t :LEMMA
    LET d = Delta(s,v),
        a = sqv(v),
 b = s*v IN
    d > 0 IMPLIES
      (d > sq(a*t+b) or a*t+b >= 0 
       IFF 
       Theta_D(s,v,Entry) < t)

  horizontal_conflict_entry : LEMMA
    horizontal_conflict?(sp,nzv) AND
    t <= Theta_D(sp,nzv,Entry)
    IMPLIES
      horizontal_conflict?(sp+t*nzv,nzv)

  not_horizontal_conflict_exit : LEMMA
    horizontal_conflict?(s,nzv) AND
    t >= Theta_D(s,nzv,Exit)
    IMPLIES
      NOT horizontal_conflict?(s+t*nzv,nzv)

  Theta_D_horizontal_dir: LEMMA
    nz_vect2?(v) AND Delta(s,v) >= 0 OR
    Delta(s,v) > 0 
    IMPLIES
    horizontal_dir_at?(s,v,Theta_D(s,v,eps),eps)

  horizontal_tca_midpoint : LEMMA
    Delta(s,nzv) >= 0 IMPLIES
      horizontal_tca(s,nzv) = (Theta_D(s,nzv,Entry)+Theta_D(s,nzv,Exit))/2

  horizontal_tca_entry_exit : LEMMA
    Delta(s,nzv) > 0 IMPLIES
      horizontal_tca(s,nzv) > Theta_D(s,nzv,Entry) AND 
      horizontal_tca(s,nzv) < Theta_D(s,nzv,Exit) 

  horizontal_tca_los : LEMMA
    Delta(s,nzv) > 0 IMPLIES
    horizontal_los?(s+horizontal_tca(s,nzv)*nzv)

  horizontal_tca_le_D : LEMMA
    Delta(s,nzv) >= 0 IMPLIES
    sqv(s+horizontal_tca(s,nzv)*nzv) <= sq(D)

  horizontal_tca_pos : LEMMA
    Delta(sp,nzv) > 0 AND
    horizontal_entry?(sp,nzv)
    IMPLIES 
      horizontal_tca(sp,nzv) > 0

  Theta_D_positive_conflict: LEMMA
    Delta(s,v) > 0 IMPLIES
    (horizontal_conflict?(s,v) IFF
    Theta_D(s,v,Exit) > 0)

  %% Circle solutions are vectors v such that at time t the ownship is on the 
  %% circle of radius D. If dir=-1, v points into the circle; if dir=1, v points
  %% outside the circle.

  circle_solution_2D?(s,v,t,dir): bool =
    on_D?(s+t*v) AND
    horizontal_dir_at?(s,v,t,dir)

  circle_solution_2D_horizontal_sep : LEMMA
    circle_solution_2D?(s,v,t,Entry) IMPLIES
    FORALL (tt:real) : tt <= t IMPLIES horizontal_sep_at?(s,v,tt)

  Theta_D_circle_solution_2D: LEMMA
    nz_vect2?(v) AND Delta(s,v) >= 0 OR
    Delta(s,v) > 0 IMPLIES
    circle_solution_2D?(s,v,Theta_D(s,v,eps),eps)

  circle_solution_2D_Delta_ge_0 : LEMMA
    circle_solution_2D?(s,nzv,t,dir) IMPLIES
    Delta(s,nzv) >= 0 

  circle_solution_2D_Theta_D: LEMMA
    circle_solution_2D?(s,nzv,t,dir) IMPLIES
    t = Theta_D(s,nzv,dir)

  circle_solution_2D_strict_horizontal_sep : LEMMA
    circle_solution_2D?(s,nzv,t,Entry) IMPLIES
    FORALL (tt:real) : tt < t IMPLIES strict_horizontal_sep?(s+tt*nzv)

  Theta_D_line_intersection: LEMMA
    Delta(s,v) > 0 IMPLIES
    LET ppoint = s + Theta_D(s,v,eps)*v IN
    v*ppoint /= 0
    IMPLIES
    (sq(D) - s*ppoint)/(v*ppoint) = Theta_D(s,v,eps)

  tangent_line_intersection_v_independent: LEMMA
    sqv(s+pt*v) = (s+pr*w)*(s+pt*v)
    IMPLIES
    sign(v*(s+pt*v)) = sign(w*(s+pt*v))

  tangent_vector_not_conflict: LEMMA
    Delta(s,v) > 0 AND
    (s+t*w)*(s+Theta_D(s,v,dir)*v) = sq(D) AND
    w*(s+Theta_D(s,v,dir)*v) = 0 AND
    Theta_D(s,v,dir) /= 0
    IMPLIES
    NOT horizontal_conflict?(s,v)

  horizontal_conflict_is_an_open_set: LEMMA
      FORALL (ss, vv: Vect2):
      horizontal_conflict?(ss, vv) IMPLIES
      (EXISTS (epsilon: posreal):
      FORALL (ww: Vect2):
      norm(ww) < epsilon IMPLIES horizontal_conflict?(ss, vv + ww))

END horizontal

¤ Dauer der Verarbeitung: 0.15 Sekunden  (vorverarbeitet)  ¤





Download des
Quellennavigators
Download des
sprechenden Kalenders

in der Quellcodebibliothek suchen




Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.


Bemerkung:

Die farbliche Syntaxdarstellung ist noch experimentell.


Bot Zugriff