products/Sources/formale Sprachen/PVS/co_structures image not shown  

Quellcode-Bibliothek

© Kompilation durch diese Firma

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

Datei: csequence_flatten.pvs   Sprache: PVS

Original von: PVS©

%-----------------------------------------------------------------------------
% Flatten, an operator that takes a sequence of sequences, and concatenates
% the elements to form a single sequence of countable length.
%
% Author: Jerry James <[email protected]>
%
% This file and its accompanying proof file are distributed under the CC0 1.0
% Universal license: http://creativecommons.org/publicdomain/zero/1.0/.
%
% Version history:
%   2007 Feb 14: PVS 4.0 version
%   2011 May  6: PVS 5.0 version
%   2013 Jan 14: PVS 6.0 version
%-----------------------------------------------------------------------------
csequence_flatten[T: TYPE]: THEORY
 BEGIN

  IMPORTING csequence_prefix_suffix[T], csequence_filter[csequence[T]]

  nonempty_seq_seq: TYPE = {x: csequence[csequence[T]] | every(nonempty?)(x)}

  p: VAR pred[T]
  n: VAR nat
  tseq: VAR csequence[T]
  cseq: VAR csequence[csequence[T]]
  eseq: VAR empty_csequence[csequence[T]]
  nseq: VAR nonempty_seq_seq

  % A result we need several times in the ensuing proofs
  some_every_empty: LEMMA
    FORALL cseq: every(empty?)(cseq) IFF NOT some(nonempty?)(cseq)

  flatten_struct(nseq): csequence_struct[T, nonempty_seq_seq] =
      IF empty?(nseq) THEN inj_empty_cseq[T, nonempty_seq_seq]
      ELSE inj_add[T, nonempty_seq_seq]
               (first(first(nseq)),
                IF empty?(rest(first(nseq))) THEN rest(nseq)
                ELSE add(rest(first(nseq)), rest(nseq))
                ENDIF)
      ENDIF

  flatten(cseq): csequence[T] =
      coreduce(flatten_struct)(filter(cseq, nonempty?))

  flatten_empty: THEOREM
    FORALL cseq: empty?(flatten(cseq)) IFF every(empty?)(cseq)

  flatten_empty_cseq: COROLLARY FORALL eseq: empty?(flatten(eseq))

  flatten_nonempty: THEOREM
    FORALL cseq: nonempty?(flatten(cseq)) IFF some(nonempty?)(cseq)

  flatten_filter: THEOREM
    FORALL cseq: flatten(filter(cseq, nonempty?)) = flatten(cseq)

  flatten_reduce: THEOREM
    FORALL cseq:
      empty?(cseq) OR
       nonempty?(first(cseq)) OR flatten(cseq) = flatten(rest(cseq))

  flatten_rest: THEOREM
    FORALL cseq:
      nonempty?(flatten(cseq)) IMPLIES
       rest(flatten(cseq)) =
        flatten(add(rest(first(filter(cseq, nonempty?))),
                    rest(filter(cseq, nonempty?))))

  flatten_rest2: THEOREM
    FORALL cseq:
      empty?(cseq) OR
       empty?(first(cseq)) OR
        rest(flatten(cseq)) = flatten(add(rest(first(cseq)), rest(cseq)))

  flatten_first: THEOREM
    FORALL cseq:
      nonempty?(flatten(cseq)) IMPLIES
       first(flatten(cseq)) = first(first(filter(cseq, nonempty?)))

  flatten_suffix: THEOREM
    FORALL cseq:
      some(nonempty?)(cseq) IMPLIES
       flatten(cseq) = flatten(suffix(cseq, first_p(nonempty?, cseq)))

  % I would really like to define flatten like this:
  %   flatten(cseq) = reduce(o)(cseq)
  % but this theorem is as close as I can come
  flatten_concatenate: THEOREM
    FORALL cseq:
      nonempty?(cseq) IMPLIES
       flatten(cseq) = first(cseq) o flatten(rest(cseq))

  flatten_rest_suffix: THEOREM
    FORALL cseq:
      nonempty?(flatten(cseq)) IMPLIES
       LET first = first_p(nonempty?, cseq) IN
         rest(flatten(cseq)) =
          flatten(add(rest(nth(cseq, first)), suffix(cseq, first + 1)))

  flatten_finite: THEOREM
    FORALL cseq:
      is_finite(flatten(cseq)) IFF
       is_finite(filter(cseq, nonempty?)) AND every(is_finite)(cseq)

  flatten_infinite: THEOREM
    FORALL cseq:
      is_infinite(flatten(cseq)) IFF
       is_infinite(filter(cseq, nonempty?)) OR some(is_infinite)(cseq)

  finite_flatten_csequence: TYPE = {cseq | is_finite(flatten(cseq))}
  fseq: VAR finite_flatten_csequence

  length_of_flatten(fseq): RECURSIVE nat =
    IF empty?(flatten(fseq)) THEN 0
    ELSE length(nth(fseq, first_p(nonempty?, fseq))) +
          length_of_flatten(suffix(fseq, first_p(nonempty?, fseq) + 1))
    ENDIF
     MEASURE length(filter(fseq, nonempty?))

  length_of_flatten_add: THEOREM
    FORALL fseq, tseq:
      is_finite(tseq) IMPLIES
       length_of_flatten(add(tseq, fseq)) =
        length(tseq) + length_of_flatten(fseq)

  flatten_length: THEOREM
    FORALL cseq:
      is_finite(flatten(cseq)) IMPLIES
       length(flatten(cseq)) = length_of_flatten(cseq)

  flatten_some: THEOREM
    FORALL cseq, p: some(p)(flatten(cseq)) IMPLIES some(some(p))(cseq)

  flatten_some_finite: THEOREM
    FORALL cseq, p:
      every(is_finite)(cseq) IMPLIES
       (some(p)(flatten(cseq)) IFF some(some(p))(cseq))

  flatten_every: THEOREM
    FORALL cseq, p: every(every(p))(cseq) IMPLIES every(p)(flatten(cseq))

  flatten_every_finite: THEOREM
    FORALL cseq, p:
      every(is_finite)(cseq) IMPLIES
       (every(p)(flatten(cseq)) IFF every(every(p))(cseq))

  % I believe the following two theorems are true.  Proving them, however,
  % is a different matter.  If you have a proof strategy to suggest, or a
  % nicer way of stating these theorems, please contact me.
  %
  %   flatten_some_converse: THEOREM
  %     FORALL cseq, p:
  %       (EXISTS (i: indexes(cseq)):
  %          some(p)(nth(cseq, i)) AND
  %           (FORALL (j: indexes(cseq)):
  %              j < i IMPLIES is_finite(nth(cseq, j))))
  %        IMPLIES some(p)(flatten(cseq))
  %
  %   flatten_every_converse: THEOREM
  %     FORALL cseq, p:
  %       every(p)(flatten(cseq)) IMPLIES
  %        (FORALL (i: indexes(cseq)):
  %           (FORALL (j: indexes(cseq)):
  %              j < i IMPLIES is_finite(nth(cseq, j)))
  %            IMPLIES every(p)(nth(cseq, i)))

 END csequence_flatten

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