%-----------------------------------------------------------------------------
% Split a sequence of countable length into a sequence containing the
% even-numbered elements and a sequence containing the odd-numbered elements.
%
% Author: Jerry James <loganjerry@gmail.com>
%
% 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_split[T:
TYPE]:
THEORY
BEGIN
IMPORTING csequence_nth[T], csequence_codt_coreduce[T, csequence]
t:
VAR T
p:
VAR pred[T]
n:
VAR nat
cseq, cseq1, cseq2:
VAR csequence
nseq:
VAR nonempty_csequence
fseq:
VAR finite_csequence
iseq:
VAR infinite_csequence
split_left_struct(cseq): csequence_struct =
IF empty?(cseq)
THEN inj_empty_cseq
ELSE inj_add(first(cseq),
IF empty?(rest(cseq))
THEN empty_cseq
ELSE rest(rest(cseq))
ENDIF)
ENDIF
split_right_struct(cseq): csequence_struct =
IF empty?(cseq)
OR empty?(rest(cseq))
THEN inj_empty_cseq
ELSE inj_add(first(rest(cseq)), rest(rest(cseq)))
ENDIF
split(cseq): [csequence, csequence] =
(coreduce(split_left_struct)(cseq),
coreduce(split_right_struct)(cseq))
split_empty_left:
THEOREM
FORALL cseq: empty?(split(cseq)`1)
IFF empty?(cseq)
split_empty_right:
THEOREM
FORALL cseq:
empty?(split(cseq)`2)
IFF empty?(cseq)
OR empty?(rest(cseq))
split_nonempty_left:
THEOREM
FORALL cseq:
nonempty?(split(cseq)`1)
IFF nonempty?(cseq)
split_nonempty_right:
THEOREM
FORALL cseq:
nonempty?(split(cseq)`2)
IFF nonempty?(cseq)
AND nonempty?(rest(cseq))
split_first_left:
THEOREM FORALL nseq: first(split(nseq)`1) = first(nseq)
split_first_right:
THEOREM
FORALL nseq:
nonempty?(rest(nseq))
IMPLIES first(split(nseq)`2) = first(rest(nseq))
split_rest_left:
THEOREM
FORALL nseq:
rest(split(nseq)`1) =
IF empty?(rest(nseq))
THEN empty_cseq
ELSE split(rest(rest(nseq)))`1
ENDIF
split_rest_right:
THEOREM
FORALL nseq:
nonempty?(rest(nseq))
IMPLIES
rest(split(nseq)`2) = split(rest(rest(nseq)))`2
split_rest_swap_left:
THEOREM
FORALL nseq: split(rest(nseq))`1 = split(nseq)`2
split_rest_swap_right:
THEOREM
FORALL nseq: split(rest(nseq))`2 = rest(split(nseq)`1)
split_finite:
JUDGEMENT
split(fseq) HAS_TYPE [finite_csequence, finite_csequence]
split_infinite:
JUDGEMENT
split(iseq) HAS_TYPE [infinite_csequence, infinite_csequence]
split_length_left:
THEOREM
FORALL fseq: length(split(fseq)`1) = ceiling(length(fseq) / 2)
split_length_right:
THEOREM
FORALL fseq: length(split(fseq)`2) = floor(length(fseq) / 2)
split_length:
THEOREM
FORALL fseq:
length(fseq) = length(split(fseq)`1) + length(split(fseq)`2)
split_index_left:
THEOREM
FORALL cseq, n: index?(split(cseq)`1)(n)
IFF index?(cseq)(2 * n)
split_index_right:
THEOREM
FORALL cseq, n: index?(split(cseq)`2)(n)
IFF index?(cseq)(2 * n + 1)
split_nth_left:
THEOREM
FORALL cseq, (n: indexes(split(cseq)`1)):
nth(split(cseq)`1, n) = nth(cseq, 2 * n)
split_nth_right:
THEOREM
FORALL cseq, (n: indexes(split(cseq)`2)):
nth(split(cseq)`2, n) = nth(cseq, 2 * n + 1)
split_add:
THEOREM
FORALL cseq, t:
split(add(t, cseq)) = (add(t, split(cseq)`2), split(cseq)`1)
split_last_left:
THEOREM
FORALL fseq:
nonempty?(split(fseq)`1)
IMPLIES
last(split(fseq)`1) =
IF odd?(length(fseq))
THEN last(fseq)
ELSE nth(fseq, length(fseq) - 2)
ENDIF
split_last_right:
THEOREM
FORALL fseq:
nonempty?(split(fseq)`2)
IMPLIES
last(split(fseq)`2) =
IF even?(length(fseq))
THEN last(fseq)
ELSE nth(fseq, length(fseq) - 2)
ENDIF
split_extensionality:
THEOREM
FORALL cseq1, cseq2: split(cseq1) = split(cseq2)
IMPLIES cseq1 = cseq2
split_some:
THEOREM
FORALL cseq, p:
some(p)(cseq)
IFF some(p)(split(cseq)`1)
OR some(p)(split(cseq)`2)
split_every:
THEOREM
FORALL cseq, p:
every(p)(cseq)
IFF every(p)(split(cseq)`1)
AND every(p)(split(cseq)`2)
END csequence_split