Metamath Proof Explorer


Theorem pfxlsw2ccat

Description: Reconstruct a word from its prefix and its last two symbols. (Contributed by Thierry Arnoux, 26-Sep-2023)

Ref Expression
Hypothesis pfxlsw2ccat.n
|- N = ( # ` W )
Assertion pfxlsw2ccat
|- ( ( W e. Word V /\ 2 <_ N ) -> W = ( ( W prefix ( N - 2 ) ) ++ <" ( W ` ( N - 2 ) ) ( W ` ( N - 1 ) ) "> ) )

Proof

Step Hyp Ref Expression
1 pfxlsw2ccat.n
 |-  N = ( # ` W )
2 simpl
 |-  ( ( W e. Word V /\ 2 <_ N ) -> W e. Word V )
3 simpr
 |-  ( ( W e. Word V /\ 2 <_ N ) -> 2 <_ N )
4 3 1 breqtrdi
 |-  ( ( W e. Word V /\ 2 <_ N ) -> 2 <_ ( # ` W ) )
5 wrdlenge2n0
 |-  ( ( W e. Word V /\ 2 <_ ( # ` W ) ) -> W =/= (/) )
6 2 4 5 syl2anc
 |-  ( ( W e. Word V /\ 2 <_ N ) -> W =/= (/) )
7 pfxlswccat
 |-  ( ( W e. Word V /\ W =/= (/) ) -> ( ( W prefix ( ( # ` W ) - 1 ) ) ++ <" ( lastS ` W ) "> ) = W )
8 2 6 7 syl2anc
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( ( W prefix ( ( # ` W ) - 1 ) ) ++ <" ( lastS ` W ) "> ) = W )
9 lsw
 |-  ( W e. Word V -> ( lastS ` W ) = ( W ` ( ( # ` W ) - 1 ) ) )
10 1 oveq1i
 |-  ( N - 1 ) = ( ( # ` W ) - 1 )
11 10 fveq2i
 |-  ( W ` ( N - 1 ) ) = ( W ` ( ( # ` W ) - 1 ) )
12 9 11 eqtr4di
 |-  ( W e. Word V -> ( lastS ` W ) = ( W ` ( N - 1 ) ) )
13 2 12 syl
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( lastS ` W ) = ( W ` ( N - 1 ) ) )
14 13 s1eqd
 |-  ( ( W e. Word V /\ 2 <_ N ) -> <" ( lastS ` W ) "> = <" ( W ` ( N - 1 ) ) "> )
15 14 oveq2d
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( ( W prefix ( ( # ` W ) - 1 ) ) ++ <" ( lastS ` W ) "> ) = ( ( W prefix ( ( # ` W ) - 1 ) ) ++ <" ( W ` ( N - 1 ) ) "> ) )
16 8 15 eqtr3d
 |-  ( ( W e. Word V /\ 2 <_ N ) -> W = ( ( W prefix ( ( # ` W ) - 1 ) ) ++ <" ( W ` ( N - 1 ) ) "> ) )
17 pfxcl
 |-  ( W e. Word V -> ( W prefix ( ( # ` W ) - 1 ) ) e. Word V )
18 2 17 syl
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( W prefix ( ( # ` W ) - 1 ) ) e. Word V )
19 lencl
 |-  ( W e. Word V -> ( # ` W ) e. NN0 )
20 2 19 syl
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( # ` W ) e. NN0 )
21 1 20 eqeltrid
 |-  ( ( W e. Word V /\ 2 <_ N ) -> N e. NN0 )
22 nn0ge2m1nn
 |-  ( ( N e. NN0 /\ 2 <_ N ) -> ( N - 1 ) e. NN )
23 21 3 22 syl2anc
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( N - 1 ) e. NN )
24 10 23 eqeltrrid
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( ( # ` W ) - 1 ) e. NN )
25 20 nn0red
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( # ` W ) e. RR )
26 25 lem1d
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( ( # ` W ) - 1 ) <_ ( # ` W ) )
27 pfxn0
 |-  ( ( W e. Word V /\ ( ( # ` W ) - 1 ) e. NN /\ ( ( # ` W ) - 1 ) <_ ( # ` W ) ) -> ( W prefix ( ( # ` W ) - 1 ) ) =/= (/) )
28 2 24 26 27 syl3anc
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( W prefix ( ( # ` W ) - 1 ) ) =/= (/) )
29 pfxlswccat
 |-  ( ( ( W prefix ( ( # ` W ) - 1 ) ) e. Word V /\ ( W prefix ( ( # ` W ) - 1 ) ) =/= (/) ) -> ( ( ( W prefix ( ( # ` W ) - 1 ) ) prefix ( ( # ` ( W prefix ( ( # ` W ) - 1 ) ) ) - 1 ) ) ++ <" ( lastS ` ( W prefix ( ( # ` W ) - 1 ) ) ) "> ) = ( W prefix ( ( # ` W ) - 1 ) ) )
30 18 28 29 syl2anc
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( ( ( W prefix ( ( # ` W ) - 1 ) ) prefix ( ( # ` ( W prefix ( ( # ` W ) - 1 ) ) ) - 1 ) ) ++ <" ( lastS ` ( W prefix ( ( # ` W ) - 1 ) ) ) "> ) = ( W prefix ( ( # ` W ) - 1 ) ) )
31 ige2m1fz
 |-  ( ( ( # ` W ) e. NN0 /\ 2 <_ ( # ` W ) ) -> ( ( # ` W ) - 1 ) e. ( 0 ... ( # ` W ) ) )
32 20 4 31 syl2anc
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( ( # ` W ) - 1 ) e. ( 0 ... ( # ` W ) ) )
33 pfxlen
 |-  ( ( W e. Word V /\ ( ( # ` W ) - 1 ) e. ( 0 ... ( # ` W ) ) ) -> ( # ` ( W prefix ( ( # ` W ) - 1 ) ) ) = ( ( # ` W ) - 1 ) )
34 2 32 33 syl2anc
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( # ` ( W prefix ( ( # ` W ) - 1 ) ) ) = ( ( # ` W ) - 1 ) )
35 34 oveq1d
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( ( # ` ( W prefix ( ( # ` W ) - 1 ) ) ) - 1 ) = ( ( ( # ` W ) - 1 ) - 1 ) )
36 0zd
 |-  ( ( W e. Word V /\ 2 <_ N ) -> 0 e. ZZ )
37 nn0ge2m1nn0
 |-  ( ( N e. NN0 /\ 2 <_ N ) -> ( N - 1 ) e. NN0 )
38 21 3 37 syl2anc
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( N - 1 ) e. NN0 )
39 10 38 eqeltrrid
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( ( # ` W ) - 1 ) e. NN0 )
40 39 nn0zd
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( ( # ` W ) - 1 ) e. ZZ )
41 1zzd
 |-  ( ( W e. Word V /\ 2 <_ N ) -> 1 e. ZZ )
42 40 41 zsubcld
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( ( ( # ` W ) - 1 ) - 1 ) e. ZZ )
43 2nn0
 |-  2 e. NN0
44 43 a1i
 |-  ( ( W e. Word V /\ 2 <_ N ) -> 2 e. NN0 )
45 nn0sub
 |-  ( ( 2 e. NN0 /\ N e. NN0 ) -> ( 2 <_ N <-> ( N - 2 ) e. NN0 ) )
46 45 biimpa
 |-  ( ( ( 2 e. NN0 /\ N e. NN0 ) /\ 2 <_ N ) -> ( N - 2 ) e. NN0 )
47 44 21 3 46 syl21anc
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( N - 2 ) e. NN0 )
48 47 nn0ge0d
 |-  ( ( W e. Word V /\ 2 <_ N ) -> 0 <_ ( N - 2 ) )
49 21 nn0cnd
 |-  ( ( W e. Word V /\ 2 <_ N ) -> N e. CC )
50 sub1m1
 |-  ( N e. CC -> ( ( N - 1 ) - 1 ) = ( N - 2 ) )
51 49 50 syl
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( ( N - 1 ) - 1 ) = ( N - 2 ) )
52 48 51 breqtrrd
 |-  ( ( W e. Word V /\ 2 <_ N ) -> 0 <_ ( ( N - 1 ) - 1 ) )
53 10 oveq1i
 |-  ( ( N - 1 ) - 1 ) = ( ( ( # ` W ) - 1 ) - 1 )
54 52 53 breqtrdi
 |-  ( ( W e. Word V /\ 2 <_ N ) -> 0 <_ ( ( ( # ` W ) - 1 ) - 1 ) )
55 24 nnred
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( ( # ` W ) - 1 ) e. RR )
56 55 lem1d
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( ( ( # ` W ) - 1 ) - 1 ) <_ ( ( # ` W ) - 1 ) )
57 36 40 42 54 56 elfzd
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( ( ( # ` W ) - 1 ) - 1 ) e. ( 0 ... ( ( # ` W ) - 1 ) ) )
58 35 57 eqeltrd
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( ( # ` ( W prefix ( ( # ` W ) - 1 ) ) ) - 1 ) e. ( 0 ... ( ( # ` W ) - 1 ) ) )
59 pfxpfx
 |-  ( ( W e. Word V /\ ( ( # ` W ) - 1 ) e. ( 0 ... ( # ` W ) ) /\ ( ( # ` ( W prefix ( ( # ` W ) - 1 ) ) ) - 1 ) e. ( 0 ... ( ( # ` W ) - 1 ) ) ) -> ( ( W prefix ( ( # ` W ) - 1 ) ) prefix ( ( # ` ( W prefix ( ( # ` W ) - 1 ) ) ) - 1 ) ) = ( W prefix ( ( # ` ( W prefix ( ( # ` W ) - 1 ) ) ) - 1 ) ) )
60 2 32 58 59 syl3anc
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( ( W prefix ( ( # ` W ) - 1 ) ) prefix ( ( # ` ( W prefix ( ( # ` W ) - 1 ) ) ) - 1 ) ) = ( W prefix ( ( # ` ( W prefix ( ( # ` W ) - 1 ) ) ) - 1 ) ) )
61 34 10 eqtr4di
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( # ` ( W prefix ( ( # ` W ) - 1 ) ) ) = ( N - 1 ) )
62 61 oveq1d
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( ( # ` ( W prefix ( ( # ` W ) - 1 ) ) ) - 1 ) = ( ( N - 1 ) - 1 ) )
63 62 51 eqtrd
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( ( # ` ( W prefix ( ( # ` W ) - 1 ) ) ) - 1 ) = ( N - 2 ) )
64 63 oveq2d
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( W prefix ( ( # ` ( W prefix ( ( # ` W ) - 1 ) ) ) - 1 ) ) = ( W prefix ( N - 2 ) ) )
65 60 64 eqtrd
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( ( W prefix ( ( # ` W ) - 1 ) ) prefix ( ( # ` ( W prefix ( ( # ` W ) - 1 ) ) ) - 1 ) ) = ( W prefix ( N - 2 ) ) )
66 pfxtrcfvl
 |-  ( ( W e. Word V /\ 2 <_ ( # ` W ) ) -> ( lastS ` ( W prefix ( ( # ` W ) - 1 ) ) ) = ( W ` ( ( # ` W ) - 2 ) ) )
67 2 4 66 syl2anc
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( lastS ` ( W prefix ( ( # ` W ) - 1 ) ) ) = ( W ` ( ( # ` W ) - 2 ) ) )
68 1 a1i
 |-  ( ( W e. Word V /\ 2 <_ N ) -> N = ( # ` W ) )
69 68 fvoveq1d
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( W ` ( N - 2 ) ) = ( W ` ( ( # ` W ) - 2 ) ) )
70 67 69 eqtr4d
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( lastS ` ( W prefix ( ( # ` W ) - 1 ) ) ) = ( W ` ( N - 2 ) ) )
71 70 s1eqd
 |-  ( ( W e. Word V /\ 2 <_ N ) -> <" ( lastS ` ( W prefix ( ( # ` W ) - 1 ) ) ) "> = <" ( W ` ( N - 2 ) ) "> )
72 65 71 oveq12d
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( ( ( W prefix ( ( # ` W ) - 1 ) ) prefix ( ( # ` ( W prefix ( ( # ` W ) - 1 ) ) ) - 1 ) ) ++ <" ( lastS ` ( W prefix ( ( # ` W ) - 1 ) ) ) "> ) = ( ( W prefix ( N - 2 ) ) ++ <" ( W ` ( N - 2 ) ) "> ) )
73 30 72 eqtr3d
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( W prefix ( ( # ` W ) - 1 ) ) = ( ( W prefix ( N - 2 ) ) ++ <" ( W ` ( N - 2 ) ) "> ) )
74 73 oveq1d
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( ( W prefix ( ( # ` W ) - 1 ) ) ++ <" ( W ` ( N - 1 ) ) "> ) = ( ( ( W prefix ( N - 2 ) ) ++ <" ( W ` ( N - 2 ) ) "> ) ++ <" ( W ` ( N - 1 ) ) "> ) )
75 pfxcl
 |-  ( W e. Word V -> ( W prefix ( N - 2 ) ) e. Word V )
76 2 75 syl
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( W prefix ( N - 2 ) ) e. Word V )
77 ccatw2s1ccatws2
 |-  ( ( W prefix ( N - 2 ) ) e. Word V -> ( ( ( W prefix ( N - 2 ) ) ++ <" ( W ` ( N - 2 ) ) "> ) ++ <" ( W ` ( N - 1 ) ) "> ) = ( ( W prefix ( N - 2 ) ) ++ <" ( W ` ( N - 2 ) ) ( W ` ( N - 1 ) ) "> ) )
78 76 77 syl
 |-  ( ( W e. Word V /\ 2 <_ N ) -> ( ( ( W prefix ( N - 2 ) ) ++ <" ( W ` ( N - 2 ) ) "> ) ++ <" ( W ` ( N - 1 ) ) "> ) = ( ( W prefix ( N - 2 ) ) ++ <" ( W ` ( N - 2 ) ) ( W ` ( N - 1 ) ) "> ) )
79 16 74 78 3eqtrd
 |-  ( ( W e. Word V /\ 2 <_ N ) -> W = ( ( W prefix ( N - 2 ) ) ++ <" ( W ` ( N - 2 ) ) ( W ` ( N - 1 ) ) "> ) )