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

Quellcode-Bibliothek

© Kompilation durch diese Firma

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

Datei: div.pvs   Sprache: PVS

Original von: PVS©

div: THEORY

%------------------------------------------------------------------------
% Defines natural and integer division  (Ada Style)
%
% There is no universally agreed semantics for integer division for a
% negative argument.  For a negative argument, division can be defined
% with truncation towards or away from zero.  The definition in this
% theory truncates toward zero (i.e. div(-7,3) = -2).  This is 
% simpler to compute because div(-i,m) = -div(i,m) and is the
% method defined in tha Ada reference manual. The alternate method
% (i.e. truncation away from zero: div(-7,3) = -3) is the approach
% used in most number theory books.  This approach has the
% advantage that div(i,m) = the greatest integer less than i/m.
%
% AUTHOR
% ------

%   Ricky W. Butler       email: [email protected]
%   Mail Stop 130      fax: (804) 864-4234
%   NASA Langley Research Center    phone: (804) 864-6198
%   Hampton, Virginia 23681-0001
%------------------------------------------------------------------------


  BEGIN

  IMPORTING floor_div_lems, abs_rews


  i,k: VAR int
  n: VAR nat
  m: VAR posnat
  j: VAR nonzero_integer
  x: VAR real

  div(i,j): integer = sgn(i)*sgn(j)*floor(abs(i)/abs(j))

  div_nat:     LEMMA div(n,m) = floor(n/m)

  div_rew:     LEMMA div(n,m) = IF n < m THEN 0 ELSE 1 + div(n-m,m) ENDIF

  div_def:     LEMMA div(i,j) = IF i/j >= 0 THEN floor(i/j)
    ELSE ceiling(i/j)
    ENDIF    


  div_value:    LEMMA IF sgn(i) = sgn(j) THEN
                         i >= k*j AND i < (k+1)*j IMPLIES div(i,j) = k 
                      ELSE
                         i > (k-1)*j AND i <= k*j IMPLIES div(i,j) = k
                      ENDIF 


  div_neg: LEMMA div(-i,j) = -div(i,j)

  div_neg_d: LEMMA div(i,-j) = -div(i,j)
 
% ================== div for special values =============================

  div_zero:   LEMMA div(0,j) = 0
  
  div_one:   LEMMA abs(j) > 1 IMPLIES div(1,j) = 0
  
  div_minus1:   LEMMA abs(j) > 1 IMPLIES div(-1, j) = 0
  
  div_eq_arg:   LEMMA div(j,j) = 1
  
  div_by_one:   LEMMA div(i,1) = i
  
  div_eq_0:   LEMMA div(i,j) = 0 IMPLIES abs(i) < abs(j)
  
  div_lt:   LEMMA abs(i) < abs(j) IMPLIES div(i,j) = 0

  div_lt_nat:   LEMMA n < m IMPLIES div(n,m) = 0

  div_is_0:       LEMMA div(i,j) = 0 IFF abs(i) < abs(j)
  
  div_parity:   LEMMA (sgn(i) = sgn(j) AND abs(i) >= abs(j)) IMPLIES
     div(i,j) > 0
      
  div_parity_neg: LEMMA (sgn(i) /= sgn(j) AND abs(i) >= abs(j)) IMPLIES
                          div(i,j) < 0

  div_ge_0:       LEMMA (sgn(i) = sgn(j) IMPLIES div(i,j) >= 0) AND
                          (div(i,j) >= 0 IMPLIES 
                             abs(i) < abs(j) OR sgn(i) = sgn(j))

  div_le_0:       LEMMA (sgn(i) /= sgn(j) IMPLIES div(i,j) <= 0) AND
     (div(i,j) <= 0 IMPLIES 
                             abs(i) < abs(j) OR sgn(i) /= sgn(j))

  div_smaller:    LEMMA m * div(n,m) <= n 
 
  div_abs:        LEMMA abs(div(i,j)) = div(abs(i),abs(j))

  div_max:        LEMMA abs(j)*abs(div(i,j)) <= abs(i)

% ================== div over addition =================================

  div_multiple:   LEMMA div(k*j,j) = k   
  
  div_even:   LEMMA integer_pred(i/j) IMPLIES i - j*div(i,j) = 0
  
  div_sum:   LEMMA IF integer_pred(i/j) OR sgn(i+k*j) = sgn(i) THEN
      div(i+k*j,j) = div(i,j) + k
   ELSE 
      div(i+k*j,j) = div(i,j) + k + sgn(i)*sgn(j)
   ENDIF

  b: VAR nat
  div_sum_nat:   LEMMA div(n+b*m,m) = div(n,m) + b

  nonposint: TYPE = {i: int | i <= 0} CONTAINING -1
  negint: TYPE = {i: int | i < 0} CONTAINING -1

  npi: VAR nonposint
  negi: VAR negint

  JUDGEMENT div(n,m) HAS_TYPE nat
  JUDGEMENT div(npi,m) HAS_TYPE  nonposint
  JUDGEMENT div(npi,negi) HAS_TYPE nat
  JUDGEMENT div(m,negi) HAS_TYPE nonposint

  div_0: LEMMA div(0,j) = 0

  AUTO_REWRITE+ div_0
  AUTO_REWRITE+ div_eq_arg              % LEMMA div(j,j) = 1
  AUTO_REWRITE+ div_by_one              % LEMMA div(i,1) = i
  AUTO_REWRITE+ div_multiple            % LEMMA div(k*j,j) = k   
  AUTO_REWRITE+ div_lt_nat              % LEMMA n < m IMPLIES div(n,m) = 0
  AUTO_REWRITE+ div_nat                 % LEMMA div(n,m) = floor(n/m)

  END div



¤ Dauer der Verarbeitung: 0.6 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