From Coq Require Import FunctionalExtensionality. From Coq Require Import ZArith.Znumtheory. From stdpp Require Import prelude.From VLSM.Core Require Import VLSM PreloadedVLSM ConstrainedVLSM Composition. From VLSM.Core Require Import VLSMProjections ProjectionTraces. From VLSM.Examples Require Import Multiply.
Tutorial: Primes Composition of VLSMs
#[local] Open Scope Z_scope. Section sec_radix_vlsm.
We parameterize a radix VLSM on an integer multiplier
greater than one.
Context
(multiplier : Z)
(multiplier_gt_1 : multiplier > 1)
.
Definition of the Radix VLSM
multiplier
parameter, and that it outputs its input multiplied by
the multiplier
.
Definition radix_transition
(l : multiplying_label) (st : multiplying_state) (om : option multiplying_message)
: multiplying_state * option multiplying_message :=
match om with
| Some j => (st - j, Some (multiplier * j))
| None => (st, None)
end.
We must also provide a proof that the intial state type
is inhabited as the set of initial states is non-empty.
An intermediate representation for the VLSM is required.
It uses the previously defined specifications.
Definition radix_machine : VLSMMachine multiplying_type :=
{|
initial_state_prop := multiplying_initial_state_prop;
initial_message_prop := fun (ms : multiplying_message) => ms = multiplier;
s0 := multiplying_initial_state_type_inhabited;
transition := fun l '(st, om) => radix_transition l st om;
valid := fun l '(st, om) => multiplying_valid l st om;
|}.
The definition of the Radix VLSM.
Definition radix_vlsm : VLSM multiplying_message :=
{|
vlsm_type := multiplying_type;
vlsm_machine := radix_machine;
|}.
To improve readability, we explicitly define radix_label as the value of
the unit type.
Definition radix_label : label multiplying_type := ().
multiplier: Z
multiplier_gt_1: multiplier > 1∀ m : multiplying_message, constrained_message_prop radix_vlsm m → ∃ j : Z, m = multiplier * j ∧ j > 1multiplier: Z
multiplier_gt_1: multiplier > 1∀ m : multiplying_message, constrained_message_prop radix_vlsm m → ∃ j : Z, m = multiplier * j ∧ j > 1multiplier: Z
multiplier_gt_1: multiplier > 1
m: multiplying_message
s: state (preloaded_with_all_messages_vlsm radix_vlsm)
m0: multiplying_message
s': state (preloaded_with_all_messages_vlsm radix_vlsm)
H: 2 ≤ m0
H0: m0 ≤ s
Ht: transition () (s, Some m0) = (s', Some m)∃ j : Z, m = multiplier * j ∧ j > 1by eexists; split; [done | lia]. Qed.multiplier: Z
multiplier_gt_1: multiplier > 1
s: state (preloaded_with_all_messages_vlsm radix_vlsm)
m0: multiplying_message
H: 2 ≤ m0
H0: m0 ≤ s
Ht: transition () (s, Some m0) = (s - m0, Some (multiplier * m0))∃ j : Z, multiplier * m0 = multiplier * j ∧ j > 1multiplier: Z
multiplier_gt_1: multiplier > 1∀ m : multiplying_message, (∃ j : Z, m = multiplier * j) → m > multiplier → constrained_message_prop radix_vlsm mmultiplier: Z
multiplier_gt_1: multiplier > 1∀ m : multiplying_message, (∃ j : Z, m = multiplier * j) → m > multiplier → constrained_message_prop radix_vlsm mmultiplier: Z
multiplier_gt_1: multiplier > 1
m: multiplying_message
j: Z
Hj: m = multiplier * j
Hmgt0: m > multiplierconstrained_message_prop radix_vlsm mmultiplier: Z
multiplier_gt_1: multiplier > 1
m: multiplying_message
j: Z
Hj: m = multiplier * j
Hmgt0: m > multiplierconstrained_message_prop radix_vlsm mmultiplier: Z
multiplier_gt_1: multiplier > 1
m: multiplying_message
j: Z
Hj: m = multiplier * j
Hmgt0: m > multiplierinput_valid_transition (preloaded_with_all_messages_vlsm radix_vlsm) radix_label (j, Some j) (0, Some m)multiplier: Z
multiplier_gt_1: multiplier > 1
m: multiplying_message
j: Z
Hj: m = multiplier * j
Hmgt0: m > multipliervalid_state_prop (preloaded_with_all_messages_vlsm radix_vlsm) jmultiplier: Z
multiplier_gt_1: multiplier > 1
m: multiplying_message
j: Z
Hj: m = multiplier * j
Hmgt0: m > multiplieroption_valid_message_prop (preloaded_with_all_messages_vlsm radix_vlsm) (Some j)multiplier: Z
multiplier_gt_1: multiplier > 1
m: multiplying_message
j: Z
Hj: m = multiplier * j
Hmgt0: m > multiplier2 ≤ jmultiplier: Z
multiplier_gt_1: multiplier > 1
m: multiplying_message
j: Z
Hj: m = multiplier * j
Hmgt0: m > multiplierj ≤ jmultiplier: Z
multiplier_gt_1: multiplier > 1
m: multiplying_message
j: Z
Hj: m = multiplier * j
Hmgt0: m > multipliertransition radix_label (j, Some j) = (0, Some m)by apply initial_state_is_valid; cbn; red; nia.multiplier: Z
multiplier_gt_1: multiplier > 1
m: multiplying_message
j: Z
Hj: m = multiplier * j
Hmgt0: m > multipliervalid_state_prop (preloaded_with_all_messages_vlsm radix_vlsm) jby apply any_message_is_valid_in_preloaded.multiplier: Z
multiplier_gt_1: multiplier > 1
m: multiplying_message
j: Z
Hj: m = multiplier * j
Hmgt0: m > multiplieroption_valid_message_prop (preloaded_with_all_messages_vlsm radix_vlsm) (Some j)by nia.multiplier: Z
multiplier_gt_1: multiplier > 1
m: multiplying_message
j: Z
Hj: m = multiplier * j
Hmgt0: m > multiplier2 ≤ jby lia.multiplier: Z
multiplier_gt_1: multiplier > 1
m: multiplying_message
j: Z
Hj: m = multiplier * j
Hmgt0: m > multiplierj ≤ jby cbn; do 2 f_equal; lia. Qed.multiplier: Z
multiplier_gt_1: multiplier > 1
m: multiplying_message
j: Z
Hj: m = multiplier * j
Hmgt0: m > multipliertransition radix_label (j, Some j) = (0, Some m)multiplier: Z
multiplier_gt_1: multiplier > 1∀ m : multiplying_message, constrained_message_prop radix_vlsm m ↔ (∃ j : Z, m = multiplier * j ∧ j > 1)multiplier: Z
multiplier_gt_1: multiplier > 1∀ m : multiplying_message, constrained_message_prop radix_vlsm m ↔ (∃ j : Z, m = multiplier * j ∧ j > 1)multiplier: Z
multiplier_gt_1: multiplier > 1
m: multiplying_messageconstrained_message_prop radix_vlsm m → ∃ j : Z, m = multiplier * j ∧ j > 1multiplier: Z
multiplier_gt_1: multiplier > 1
m: multiplying_message(∃ j : Z, m = multiplier * j ∧ j > 1) → constrained_message_prop radix_vlsm mby apply radix_constrained_messages_left.multiplier: Z
multiplier_gt_1: multiplier > 1
m: multiplying_messageconstrained_message_prop radix_vlsm m → ∃ j : Z, m = multiplier * j ∧ j > 1by intros [? []]; apply radix_constrained_messages_right; [exists x | nia]. Qed.multiplier: Z
multiplier_gt_1: multiplier > 1
m: multiplying_message(∃ j : Z, m = multiplier * j ∧ j > 1) → constrained_message_prop radix_vlsm m
multiplier: Z
multiplier_gt_1: multiplier > 1∀ st : multiplying_state, constrained_state_prop radix_vlsm st → st >= 0multiplier: Z
multiplier_gt_1: multiplier > 1∀ st : multiplying_state, constrained_state_prop radix_vlsm st → st >= 0multiplier: Z
multiplier_gt_1: multiplier > 1
s: state (preloaded_with_all_messages_vlsm radix_vlsm)
Hs: initial_state_prop ss >= 0multiplier: Z
multiplier_gt_1: multiplier > 1
s': state (preloaded_with_all_messages_vlsm radix_vlsm)
l: label (preloaded_with_all_messages_vlsm radix_vlsm)
om, om': option multiplying_message
s: state (preloaded_with_all_messages_vlsm radix_vlsm)
Ht: input_valid_transition (preloaded_with_all_messages_vlsm radix_vlsm) l (s, om) (s', om')
IHvalid_state_prop: s >= 0s' >= 0by cbn in Hs; red in Hs; lia.multiplier: Z
multiplier_gt_1: multiplier > 1
s: state (preloaded_with_all_messages_vlsm radix_vlsm)
Hs: initial_state_prop ss >= 0multiplier: Z
multiplier_gt_1: multiplier > 1
s': state (preloaded_with_all_messages_vlsm radix_vlsm)
l: label (preloaded_with_all_messages_vlsm radix_vlsm)
om, om': option multiplying_message
s: state (preloaded_with_all_messages_vlsm radix_vlsm)
Ht: input_valid_transition (preloaded_with_all_messages_vlsm radix_vlsm) l (s, om) (s', om')
IHvalid_state_prop: s >= 0s' >= 0by inversion Ht; subst; cbn in *; lia. Qed.multiplier: Z
multiplier_gt_1: multiplier > 1
s': state (preloaded_with_all_messages_vlsm radix_vlsm)
m: multiplying_message
om': option multiplying_message
s: state (preloaded_with_all_messages_vlsm radix_vlsm)
Hs: valid_state_prop (preloaded_with_all_messages_vlsm radix_vlsm) s
H: 2 ≤ m
H0: m ≤ s
Ht: transition () (s, Some m) = (s', om')
IHvalid_state_prop: s >= 0s' >= 0multiplier: Z
multiplier_gt_1: multiplier > 1∀ st : multiplying_state, st >= 0 → constrained_state_prop radix_vlsm stmultiplier: Z
multiplier_gt_1: multiplier > 1∀ st : multiplying_state, st >= 0 → constrained_state_prop radix_vlsm stmultiplier: Z
multiplier_gt_1: multiplier > 1
st: multiplying_state
Hst: st >= 0constrained_state_prop radix_vlsm stmultiplier: Z
multiplier_gt_1: multiplier > 1
st: multiplying_state
Hst: st >= 0input_valid_transition (preloaded_with_all_messages_vlsm radix_vlsm) radix_label (st + 2, Some 2) (st, Some (2 * multiplier))multiplier: Z
multiplier_gt_1: multiplier > 1
st: multiplying_state
Hst: st >= 0valid_state_prop (preloaded_with_all_messages_vlsm radix_vlsm) (st + 2)multiplier: Z
multiplier_gt_1: multiplier > 1
st: multiplying_state
Hst: st >= 0option_valid_message_prop (preloaded_with_all_messages_vlsm radix_vlsm) (Some 2)by apply initial_state_is_valid; cbn; red; lia.multiplier: Z
multiplier_gt_1: multiplier > 1
st: multiplying_state
Hst: st >= 0valid_state_prop (preloaded_with_all_messages_vlsm radix_vlsm) (st + 2)by apply any_message_is_valid_in_preloaded. Qed.multiplier: Z
multiplier_gt_1: multiplier > 1
st: multiplying_state
Hst: st >= 0option_valid_message_prop (preloaded_with_all_messages_vlsm radix_vlsm) (Some 2)multiplier: Z
multiplier_gt_1: multiplier > 1∀ st : multiplying_state, constrained_state_prop radix_vlsm st ↔ st >= 0multiplier: Z
multiplier_gt_1: multiplier > 1∀ st : multiplying_state, constrained_state_prop radix_vlsm st ↔ st >= 0multiplier: Z
multiplier_gt_1: multiplier > 1
st: multiplying_stateconstrained_state_prop radix_vlsm st → st >= 0multiplier: Z
multiplier_gt_1: multiplier > 1
st: multiplying_statest >= 0 → constrained_state_prop radix_vlsm stby apply radix_constrained_states_right.multiplier: Z
multiplier_gt_1: multiplier > 1
st: multiplying_stateconstrained_state_prop radix_vlsm st → st >= 0by apply radix_constrained_states_left. Qed.multiplier: Z
multiplier_gt_1: multiplier > 1
st: multiplying_statest >= 0 → constrained_state_prop radix_vlsm st
multiplier: Z
multiplier_gt_1: multiplier > 1∀ m : multiplying_message, valid_message_prop radix_vlsm m → ∃ p : Z, p >= 1 ∧ m = multiplier ^ pmultiplier: Z
multiplier_gt_1: multiplier > 1∀ m : multiplying_message, valid_message_prop radix_vlsm m → ∃ p : Z, p >= 1 ∧ m = multiplier ^ pmultiplier: Z
multiplier_gt_1: multiplier > 1
m: multiplying_message
s: state radix_vlsm
Hvsm: valid_state_message_prop radix_vlsm s (Some m)∃ p : Z, p >= 1 ∧ m = multiplier ^ pmultiplier: Z
multiplier_gt_1: multiplier > 1
m: multiplying_message
s: state radix_vlsm
Hvsm: valid_state_message_prop radix_vlsm s (Some m)
Hom: is_Some (Some m)∃ p : Z, p >= 1 ∧ m = multiplier ^ pmultiplier: Z
multiplier_gt_1: multiplier > 1
m: multiplying_message
s: state radix_vlsm
Hvsm: valid_state_message_prop radix_vlsm s (Some m)
Hom: is_Some (Some m)∃ p : Z, p >= 1 ∧ is_Some_proj Hom = multiplier ^ pmultiplier: Z
multiplier_gt_1: multiplier > 1
m: multiplying_message
s: state radix_vlsm
om: option multiplying_message
Hvsm: valid_state_message_prop radix_vlsm s om
Hom: is_Some om∃ p : Z, p >= 1 ∧ is_Some_proj Hom = multiplier ^ pmultiplier: Z
multiplier_gt_1: multiplier > 1
s: state radix_vlsm
Hs: initial_state_prop s
om: option multiplying_message
Hom0: option_initial_message_prop radix_vlsm om
Hom: is_Some om∃ p : Z, p >= 1 ∧ is_Some_proj Hom = multiplier ^ pmultiplier: Z
multiplier_gt_1: multiplier > 1
s: state radix_vlsm
_om: option multiplying_message
Hvsm1: valid_state_message_prop radix_vlsm s _om
_s: state radix_vlsm
om: option multiplying_message
Hvsm2: valid_state_message_prop radix_vlsm _s om
l: label radix_vlsm
Hv: valid l (s, om)
s': state radix_vlsm
om': option multiplying_message
Ht: transition l (s, om) = (s', om')
Hom: is_Some om'
IHHvsm1: ∀ Hom : is_Some _om, ∃ p : Z, p >= 1 ∧ is_Some_proj Hom = multiplier ^ p
IHHvsm2: ∀ Hom : is_Some om, ∃ p : Z, p >= 1 ∧ is_Some_proj Hom = multiplier ^ p∃ p : Z, p >= 1 ∧ is_Some_proj Hom = multiplier ^ pmultiplier: Z
multiplier_gt_1: multiplier > 1
s: state radix_vlsm
Hs: initial_state_prop s
om: option multiplying_message
Hom0: option_initial_message_prop radix_vlsm om
Hom: is_Some om∃ p : Z, p >= 1 ∧ is_Some_proj Hom = multiplier ^ pmultiplier: Z
multiplier_gt_1: multiplier > 1
s: state radix_vlsm
Hs: initial_state_prop s
om: option multiplying_message
Hom0: option_initial_message_prop radix_vlsm om
Hom: is_Some om∃ p : Z, p >= 1 ∧ is_Some_proj Hom = multiplier ^ pby exists 1; split; [lia | f_equal; lia].multiplier: Z
multiplier_gt_1: multiplier > 1
s: multiplying_state
Hs: multiplying_initial_state_prop s
m: multiplying_message
Hom0: m = multiplier∃ p : Z, p >= 1 ∧ m = multiplier ^ pmultiplier: Z
multiplier_gt_1: multiplier > 1
s: state radix_vlsm
_om: option multiplying_message
Hvsm1: valid_state_message_prop radix_vlsm s _om
_s: state radix_vlsm
om: option multiplying_message
Hvsm2: valid_state_message_prop radix_vlsm _s om
l: label radix_vlsm
Hv: valid l (s, om)
s': state radix_vlsm
om': option multiplying_message
Ht: transition l (s, om) = (s', om')
Hom: is_Some om'
IHHvsm1: ∀ Hom : is_Some _om, ∃ p : Z, p >= 1 ∧ is_Some_proj Hom = multiplier ^ p
IHHvsm2: ∀ Hom : is_Some om, ∃ p : Z, p >= 1 ∧ is_Some_proj Hom = multiplier ^ p∃ p : Z, p >= 1 ∧ is_Some_proj Hom = multiplier ^ pmultiplier: Z
multiplier_gt_1: multiplier > 1
s: state radix_vlsm
_om: option multiplying_message
Hvsm1: valid_state_message_prop radix_vlsm s _om
_s: state radix_vlsm
m: multiplying_message
Hvsm2: valid_state_message_prop radix_vlsm _s (Some m)
l: label radix_vlsm
Hv: valid l (s, Some m)
s': state radix_vlsm
om': option multiplying_message
Ht: transition l (s, Some m) = (s', om')
Hom: is_Some om'
IHHvsm1: ∀ Hom : is_Some _om, ∃ p : Z, p >= 1 ∧ is_Some_proj Hom = multiplier ^ p
IHHvsm2: ∀ Hom : is_Some (Some m), ∃ p : Z, p >= 1 ∧ is_Some_proj Hom = multiplier ^ p∃ p : Z, p >= 1 ∧ is_Some_proj Hom = multiplier ^ pmultiplier: Z
multiplier_gt_1: multiplier > 1
s: state radix_vlsm
_om: option multiplying_message
Hvsm1: valid_state_message_prop radix_vlsm s _om
_s: state radix_vlsm
m: multiplying_message
Hvsm2: valid_state_message_prop radix_vlsm _s (Some m)
l: label radix_vlsm
Hv: valid l (s, Some m)
s': state radix_vlsm
om': option multiplying_message
Ht: transition l (s, Some m) = (s', om')
Hom: is_Some om'
IHHvsm1: ∀ Hom : is_Some _om, ∃ p : Z, p >= 1 ∧ is_Some_proj Hom = multiplier ^ p
IHHvsm2: ∀ Hom : is_Some (Some m), ∃ p : Z, p >= 1 ∧ is_Some_proj Hom = multiplier ^ p
x: Z
Hx: x >= 1 ∧ is_Some_proj (ex_intro (λ x : multiplying_message, Some m = Some x) m eq_refl) = multiplier ^ x∃ p : Z, p >= 1 ∧ is_Some_proj Hom = multiplier ^ pmultiplier: Z
multiplier_gt_1: multiplier > 1
s: state radix_vlsm
_om: option multiplying_message
Hvsm1: valid_state_message_prop radix_vlsm s _om
_s: state radix_vlsm
m: multiplying_message
Hvsm2: valid_state_message_prop radix_vlsm _s (Some m)
l: label radix_vlsm
Hv: valid l (s, Some m)
Hom: is_Some (Some (multiplier * m))
IHHvsm1: ∀ Hom : is_Some _om, ∃ p : Z, p >= 1 ∧ is_Some_proj Hom = multiplier ^ p
IHHvsm2: ∀ Hom : is_Some (Some m), ∃ p : Z, p >= 1 ∧ is_Some_proj Hom = multiplier ^ p
x: Z
Hx: x >= 1 ∧ is_Some_proj (ex_intro (λ x : multiplying_message, Some m = Some x) m eq_refl) = multiplier ^ x∃ p : Z, p >= 1 ∧ is_Some_proj Hom = multiplier ^ pmultiplier: Z
multiplier_gt_1: multiplier > 1
s: state radix_vlsm
_om: option multiplying_message
Hvsm1: valid_state_message_prop radix_vlsm s _om
_s: state radix_vlsm
x: Z
Hvsm2: valid_state_message_prop radix_vlsm _s (Some (multiplier ^ x))
l: label radix_vlsm
Hom: is_Some (Some (multiplier * multiplier ^ x))
Hv: valid l (s, Some (multiplier ^ x))
IHHvsm1: ∀ Hom : is_Some _om, ∃ p : Z, p >= 1 ∧ is_Some_proj Hom = multiplier ^ p
IHHvsm2: ∀ Hom : is_Some (Some (multiplier ^ x)), ∃ p : Z, p >= 1 ∧ is_Some_proj Hom = multiplier ^ p
Hgeq1: x >= 1∃ p : Z, p >= 1 ∧ multiplier * multiplier ^ x = multiplier ^ pmultiplier: Z
multiplier_gt_1: multiplier > 1
s: state radix_vlsm
_om: option multiplying_message
Hvsm1: valid_state_message_prop radix_vlsm s _om
_s: state radix_vlsm
x: Z
Hvsm2: valid_state_message_prop radix_vlsm _s (Some (multiplier ^ x))
l: label radix_vlsm
Hom: is_Some (Some (multiplier * multiplier ^ x))
Hv: valid l (s, Some (multiplier ^ x))
IHHvsm1: ∀ Hom : is_Some _om, ∃ p : Z, p >= 1 ∧ is_Some_proj Hom = multiplier ^ p
IHHvsm2: ∀ Hom : is_Some (Some (multiplier ^ x)), ∃ p : Z, p >= 1 ∧ is_Some_proj Hom = multiplier ^ p
Hgeq1: x >= 1x + 1 >= 1 ∧ multiplier * multiplier ^ x = multiplier ^ (x + 1)by rewrite <- Z.pow_succ_r; [| lia]. Qed.multiplier: Z
multiplier_gt_1: multiplier > 1
s: state radix_vlsm
_om: option multiplying_message
Hvsm1: valid_state_message_prop radix_vlsm s _om
_s: state radix_vlsm
x: Z
Hvsm2: valid_state_message_prop radix_vlsm _s (Some (multiplier ^ x))
l: label radix_vlsm
Hom: is_Some (Some (multiplier * multiplier ^ x))
Hv: valid l (s, Some (multiplier ^ x))
IHHvsm1: ∀ Hom : is_Some _om, ∃ p : Z, p >= 1 ∧ is_Some_proj Hom = multiplier ^ p
IHHvsm2: ∀ Hom : is_Some (Some (multiplier ^ x)), ∃ p : Z, p >= 1 ∧ is_Some_proj Hom = multiplier ^ p
Hgeq1: x >= 1multiplier * multiplier ^ x = multiplier ^ (x + 1)multiplier: Z
multiplier_gt_1: multiplier > 1∀ p : Z, p >= 1 → valid_message_prop radix_vlsm (multiplier ^ p)multiplier: Z
multiplier_gt_1: multiplier > 1∀ p : Z, p >= 1 → valid_message_prop radix_vlsm (multiplier ^ p)multiplier: Z
multiplier_gt_1: multiplier > 1
p: Z
Hp: p >= 1valid_message_prop radix_vlsm (multiplier ^ p)multiplier: Z
multiplier_gt_1: multiplier > 1
p: Z
Hp: p >= 1
Hle: 0 ≤ p - 1valid_message_prop radix_vlsm (multiplier ^ p)multiplier: Z
multiplier_gt_1: multiplier > 1
p: Z
Hp: p >= 1
Hle: 0 ≤ p - 1valid_message_prop radix_vlsm (multiplier ^ (p - 1 + 1))multiplier: Z
multiplier_gt_1: multiplier > 1
p: Z
Hp: p >= 1
x: Z
Heqx: x = p - 1
Hle: 0 ≤ xvalid_message_prop radix_vlsm (multiplier ^ (x + 1))multiplier: Z
multiplier_gt_1: multiplier > 1
x: Z
Hle: 0 ≤ xvalid_message_prop radix_vlsm (multiplier ^ (x + 1))multiplier: Z
multiplier_gt_1: multiplier > 1∀ x : Z, 0 ≤ x → valid_message_prop radix_vlsm (multiplier ^ (x + 1))multiplier: Z
multiplier_gt_1: multiplier > 1∀ x : Z, 0 ≤ x → valid_message_prop radix_vlsm (multiplier ^ (x + 1)) → valid_message_prop radix_vlsm (multiplier ^ (Z.succ x + 1))multiplier: Z
multiplier_gt_1: multiplier > 1
x: Z
Hxgt0: 0 ≤ x
Hindh: valid_message_prop radix_vlsm (multiplier ^ (x + 1))valid_message_prop radix_vlsm (multiplier ^ (Z.succ x + 1))multiplier: Z
multiplier_gt_1: multiplier > 1
x: Z
Hxgt0: 0 ≤ x
Hindh: valid_message_prop radix_vlsm (multiplier ^ (x + 1))
msgin:= multiplier ^ (x + 1): Zvalid_message_prop radix_vlsm (multiplier ^ (Z.succ x + 1))multiplier: Z
multiplier_gt_1: multiplier > 1
x: Z
Hxgt0: 0 ≤ x
Hindh: valid_message_prop radix_vlsm (multiplier ^ (x + 1))
msgin:= multiplier ^ (x + 1): Zcan_emit radix_vlsm (multiplier ^ (Z.succ x + 1))multiplier: Z
multiplier_gt_1: multiplier > 1
x: Z
Hxgt0: 0 ≤ x
Hindh: valid_message_prop radix_vlsm (multiplier ^ (x + 1))
msgin:= multiplier ^ (x + 1): Zinput_valid_transition radix_vlsm radix_label (msgin, Some (multiplier ^ (x + 1))) (0, Some (multiplier ^ (Z.succ x + 1)))multiplier: Z
multiplier_gt_1: multiplier > 1
x: Z
Hxgt0: 0 ≤ x
Hindh: valid_message_prop radix_vlsm (multiplier ^ (x + 1))
msgin:= multiplier ^ (x + 1): Zvalid_state_prop radix_vlsm msginmultiplier: Z
multiplier_gt_1: multiplier > 1
x: Z
Hxgt0: 0 ≤ x
Hindh: valid_message_prop radix_vlsm (multiplier ^ (x + 1))
msgin:= multiplier ^ (x + 1): Zoption_valid_message_prop radix_vlsm (Some (multiplier ^ (x + 1)))multiplier: Z
multiplier_gt_1: multiplier > 1
x: Z
Hxgt0: 0 ≤ x
Hindh: valid_message_prop radix_vlsm (multiplier ^ (x + 1))
msgin:= multiplier ^ (x + 1): Z2 ≤ multiplier ^ (x + 1)multiplier: Z
multiplier_gt_1: multiplier > 1
x: Z
Hxgt0: 0 ≤ x
Hindh: valid_message_prop radix_vlsm (multiplier ^ (x + 1))
msgin:= multiplier ^ (x + 1): Zmultiplier ^ (x + 1) ≤ msginmultiplier: Z
multiplier_gt_1: multiplier > 1
x: Z
Hxgt0: 0 ≤ x
Hindh: valid_message_prop radix_vlsm (multiplier ^ (x + 1))
msgin:= multiplier ^ (x + 1): Ztransition radix_label (msgin, Some (multiplier ^ (x + 1))) = (0, Some (multiplier ^ (Z.succ x + 1)))by apply initial_state_is_valid; cbn; red; lia.multiplier: Z
multiplier_gt_1: multiplier > 1
x: Z
Hxgt0: 0 ≤ x
Hindh: valid_message_prop radix_vlsm (multiplier ^ (x + 1))
msgin:= multiplier ^ (x + 1): Zvalid_state_prop radix_vlsm msginby apply Hindh.multiplier: Z
multiplier_gt_1: multiplier > 1
x: Z
Hxgt0: 0 ≤ x
Hindh: valid_message_prop radix_vlsm (multiplier ^ (x + 1))
msgin:= multiplier ^ (x + 1): Zoption_valid_message_prop radix_vlsm (Some (multiplier ^ (x + 1)))multiplier: Z
multiplier_gt_1: multiplier > 1
x: Z
Hxgt0: 0 ≤ x
Hindh: valid_message_prop radix_vlsm (multiplier ^ (x + 1))
msgin:= multiplier ^ (x + 1): Z2 ≤ multiplier ^ (x + 1)by rewrite Z.pow_succ_r; lia.multiplier: Z
multiplier_gt_1: multiplier > 1
x: Z
Hxgt0: 0 ≤ x
Hindh: valid_message_prop radix_vlsm (multiplier ^ (x + 1))
msgin:= multiplier ^ (x + 1): Z2 ≤ multiplier ^ Z.succ xby lia.multiplier: Z
multiplier_gt_1: multiplier > 1
x: Z
Hxgt0: 0 ≤ x
Hindh: valid_message_prop radix_vlsm (multiplier ^ (x + 1))
msgin:= multiplier ^ (x + 1): Zmultiplier ^ (x + 1) ≤ msginby cbn; rewrite <- Z.pow_succ_r, Z.add_succ_l; [do 2 f_equal; lia | lia]. Qed.multiplier: Z
multiplier_gt_1: multiplier > 1
x: Z
Hxgt0: 0 ≤ x
Hindh: valid_message_prop radix_vlsm (multiplier ^ (x + 1))
msgin:= multiplier ^ (x + 1): Ztransition radix_label (msgin, Some (multiplier ^ (x + 1))) = (0, Some (multiplier ^ (Z.succ x + 1)))multiplier: Z
multiplier_gt_1: multiplier > 1∀ m : multiplying_message, valid_message_prop radix_vlsm m ↔ (∃ p : Z, p >= 1 ∧ m = multiplier ^ p)multiplier: Z
multiplier_gt_1: multiplier > 1∀ m : multiplying_message, valid_message_prop radix_vlsm m ↔ (∃ p : Z, p >= 1 ∧ m = multiplier ^ p)multiplier: Z
multiplier_gt_1: multiplier > 1
m: multiplying_messagevalid_message_prop radix_vlsm m → ∃ p : Z, p >= 1 ∧ m = multiplier ^ pmultiplier: Z
multiplier_gt_1: multiplier > 1
m: multiplying_message(∃ p : Z, p >= 1 ∧ m = multiplier ^ p) → valid_message_prop radix_vlsm mby intros; apply radix_valid_messages_powers_of_mult_right.multiplier: Z
multiplier_gt_1: multiplier > 1
m: multiplying_messagevalid_message_prop radix_vlsm m → ∃ p : Z, p >= 1 ∧ m = multiplier ^ pby intros (p & Hpgt0 & [= ->]); apply radix_valid_messages_powers_of_mult_left. Qed. End sec_radix_vlsm. Section sec_composition. Context {index : Type} (multipliers : index -> Z) (Hmultipliers : forall (i : index), multipliers i <> 0) `{FinSet index indexSet} . Definition indexed_radix_vlsms (i : index) : VLSM multiplying_message := radix_vlsm (multipliers i). Context (radix_constraint : composite_label indexed_radix_vlsms -> composite_state indexed_radix_vlsms * option multiplying_message -> Prop) . Definition radix_composite_vlsm : VLSM multiplying_message := composite_vlsm indexed_radix_vlsms radix_constraint.multiplier: Z
multiplier_gt_1: multiplier > 1
m: multiplying_message(∃ p : Z, p >= 1 ∧ m = multiplier ^ p) → valid_message_prop radix_vlsm mindex: Type
multipliers: index → Z
Hmultipliers: ∀ i : index, multipliers i ≠ 0
indexSet: Type
H: ElemOf index indexSet
H0: Empty indexSet
H1: Singleton index indexSet
H2: Union indexSet
H3: Intersection indexSet
H4: Difference indexSet
H5: Elements index indexSet
EqDecision0: EqDecision index
H6: FinSet index indexSet
radix_constraint: composite_label indexed_radix_vlsms → composite_state indexed_radix_vlsms * option multiplying_message → Prop
s: composite_state indexed_radix_vlsms
Hs: valid_state_prop radix_composite_vlsm s∀ i : index, s i >= 0index: Type
multipliers: index → Z
Hmultipliers: ∀ i : index, multipliers i ≠ 0
indexSet: Type
H: ElemOf index indexSet
H0: Empty indexSet
H1: Singleton index indexSet
H2: Union indexSet
H3: Intersection indexSet
H4: Difference indexSet
H5: Elements index indexSet
EqDecision0: EqDecision index
H6: FinSet index indexSet
radix_constraint: composite_label indexed_radix_vlsms → composite_state indexed_radix_vlsms * option multiplying_message → Prop
s: composite_state indexed_radix_vlsms
Hs: valid_state_prop radix_composite_vlsm s∀ i : index, s i >= 0index: Type
multipliers: index → Z
Hmultipliers: ∀ i : index, multipliers i ≠ 0
indexSet: Type
H: ElemOf index indexSet
H0: Empty indexSet
H1: Singleton index indexSet
H2: Union indexSet
H3: Intersection indexSet
H4: Difference indexSet
H5: Elements index indexSet
EqDecision0: EqDecision index
H6: FinSet index indexSet
radix_constraint: composite_label indexed_radix_vlsms → composite_state indexed_radix_vlsms * option multiplying_message → Prop
s: composite_state indexed_radix_vlsms
Hs: valid_state_prop radix_composite_vlsm s
i: indexs i >= 0by apply (valid_state_project_preloaded multiplying_message indexed_radix_vlsms radix_constraint). Qed.index: Type
multipliers: index → Z
Hmultipliers: ∀ i : index, multipliers i ≠ 0
indexSet: Type
H: ElemOf index indexSet
H0: Empty indexSet
H1: Singleton index indexSet
H2: Union indexSet
H3: Intersection indexSet
H4: Difference indexSet
H5: Elements index indexSet
EqDecision0: EqDecision index
H6: FinSet index indexSet
radix_constraint: composite_label indexed_radix_vlsms → composite_state indexed_radix_vlsms * option multiplying_message → Prop
s: composite_state indexed_radix_vlsms
Hs: valid_state_prop radix_composite_vlsm s
i: indexconstrained_state_prop (radix_vlsm (multipliers i)) (s i)
Any valid message can be expressed as a non-empty product of powers
of the multipliers associated to the components.
index: Type
multipliers: index → Z
Hmultipliers: ∀ i : index, multipliers i ≠ 0
indexSet: Type
H: ElemOf index indexSet
H0: Empty indexSet
H1: Singleton index indexSet
H2: Union indexSet
H3: Intersection indexSet
H4: Difference indexSet
H5: Elements index indexSet
EqDecision0: EqDecision index
H6: FinSet index indexSet
radix_constraint: composite_label indexed_radix_vlsms → composite_state indexed_radix_vlsms * option multiplying_message → Prop
m: multiplying_messagevalid_message_prop radix_composite_vlsm m → ∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers findex: Type
multipliers: index → Z
Hmultipliers: ∀ i : index, multipliers i ≠ 0
indexSet: Type
H: ElemOf index indexSet
H0: Empty indexSet
H1: Singleton index indexSet
H2: Union indexSet
H3: Intersection indexSet
H4: Difference indexSet
H5: Elements index indexSet
EqDecision0: EqDecision index
H6: FinSet index indexSet
radix_constraint: composite_label indexed_radix_vlsms → composite_state indexed_radix_vlsms * option multiplying_message → Prop
m: multiplying_messagevalid_message_prop radix_composite_vlsm m → ∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers findex: Type
multipliers: index → Z
Hmultipliers: ∀ i : index, multipliers i ≠ 0
indexSet: Type
H: ElemOf index indexSet
H0: Empty indexSet
H1: Singleton index indexSet
H2: Union indexSet
H3: Intersection indexSet
H4: Difference indexSet
H5: Elements index indexSet
EqDecision0: EqDecision index
H6: FinSet index indexSet
radix_constraint: composite_label indexed_radix_vlsms → composite_state indexed_radix_vlsms * option multiplying_message → Prop
m: multiplying_message
s: state radix_composite_vlsm
Hvsm: valid_state_message_prop radix_composite_vlsm s (Some m)∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers findex: Type
multipliers: index → Z
Hmultipliers: ∀ i : index, multipliers i ≠ 0
indexSet: Type
H: ElemOf index indexSet
H0: Empty indexSet
H1: Singleton index indexSet
H2: Union indexSet
H3: Intersection indexSet
H4: Difference indexSet
H5: Elements index indexSet
EqDecision0: EqDecision index
H6: FinSet index indexSet
radix_constraint: composite_label indexed_radix_vlsms → composite_state indexed_radix_vlsms * option multiplying_message → Prop
m: multiplying_message
s: state radix_composite_vlsm
om: option multiplying_message
Heqom: om = Some m
Hvsm: valid_state_message_prop radix_composite_vlsm s om∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers findex: Type
multipliers: index → Z
Hmultipliers: ∀ i : index, multipliers i ≠ 0
indexSet: Type
H: ElemOf index indexSet
H0: Empty indexSet
H1: Singleton index indexSet
H2: Union indexSet
H3: Intersection indexSet
H4: Difference indexSet
H5: Elements index indexSet
EqDecision0: EqDecision index
H6: FinSet index indexSet
radix_constraint: composite_label indexed_radix_vlsms → composite_state indexed_radix_vlsms * option multiplying_message → Prop
s: state radix_composite_vlsm
om: option multiplying_message
Hvsm: valid_state_message_prop radix_composite_vlsm s om∀ m : multiplying_message, om = Some m → ∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers findex: Type
multipliers: index → Z
Hmultipliers: ∀ i : index, multipliers i ≠ 0
indexSet: Type
H: ElemOf index indexSet
H0: Empty indexSet
H1: Singleton index indexSet
H2: Union indexSet
H3: Intersection indexSet
H4: Difference indexSet
H5: Elements index indexSet
EqDecision0: EqDecision index
H6: FinSet index indexSet
radix_constraint: composite_label indexed_radix_vlsms → composite_state indexed_radix_vlsms * option multiplying_message → Prop
s: state radix_composite_vlsm
Hs: initial_state_prop s
m: multiplying_message
Hom: option_initial_message_prop radix_composite_vlsm (Some m)∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers findex: Type
multipliers: index → Z
Hmultipliers: ∀ i : index, multipliers i ≠ 0
indexSet: Type
H: ElemOf index indexSet
H0: Empty indexSet
H1: Singleton index indexSet
H2: Union indexSet
H3: Intersection indexSet
H4: Difference indexSet
H5: Elements index indexSet
EqDecision0: EqDecision index
H6: FinSet index indexSet
radix_constraint: composite_label indexed_radix_vlsms → composite_state indexed_radix_vlsms * option multiplying_message → Prop
s: state radix_composite_vlsm
_om: option multiplying_message
Hvsm1: valid_state_message_prop radix_composite_vlsm s _om
_s: state radix_composite_vlsm
om: option multiplying_message
Hvsm2: valid_state_message_prop radix_composite_vlsm _s om
l: label radix_composite_vlsm
Hv: valid l (s, om)
s': state radix_composite_vlsm
m: multiplying_message
Ht: transition l (s, om) = (s', Some m)
IHHvsm1: ∀ m : multiplying_message, _om = Some m → ∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers f
IHHvsm2: ∀ m : multiplying_message, om = Some m → ∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers f∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers findex: Type
multipliers: index → Z
Hmultipliers: ∀ i : index, multipliers i ≠ 0
indexSet: Type
H: ElemOf index indexSet
H0: Empty indexSet
H1: Singleton index indexSet
H2: Union indexSet
H3: Intersection indexSet
H4: Difference indexSet
H5: Elements index indexSet
EqDecision0: EqDecision index
H6: FinSet index indexSet
radix_constraint: composite_label indexed_radix_vlsms → composite_state indexed_radix_vlsms * option multiplying_message → Prop
s: state radix_composite_vlsm
Hs: initial_state_prop s
m: multiplying_message
Hom: option_initial_message_prop radix_composite_vlsm (Some m)∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers findex: Type
multipliers: index → Z
Hmultipliers: ∀ i : index, multipliers i ≠ 0
indexSet: Type
H: ElemOf index indexSet
H0: Empty indexSet
H1: Singleton index indexSet
H2: Union indexSet
H3: Intersection indexSet
H4: Difference indexSet
H5: Elements index indexSet
EqDecision0: EqDecision index
H6: FinSet index indexSet
radix_constraint: composite_label indexed_radix_vlsms → composite_state indexed_radix_vlsms * option multiplying_message → Prop
s: state radix_composite_vlsm
Hs: initial_state_prop s
m: multiplying_message
n: index
mielem: multiplying_message
mi: mielem = multipliers n
Hmi: mielem = m∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers findex: Type
multipliers: index → Z
Hmultipliers: ∀ i : index, multipliers i ≠ 0
indexSet: Type
H: ElemOf index indexSet
H0: Empty indexSet
H1: Singleton index indexSet
H2: Union indexSet
H3: Intersection indexSet
H4: Difference indexSet
H5: Elements index indexSet
EqDecision0: EqDecision index
H6: FinSet index indexSet
radix_constraint: composite_label indexed_radix_vlsms → composite_state indexed_radix_vlsms * option multiplying_message → Prop
s: state radix_composite_vlsm
Hs: initial_state_prop s
m: multiplying_message
n: index
mielem: multiplying_message
mi: mielem = multipliers n
Hmi: mielem = mfin_supp (delta_nat_fsfun n) ≠ [] ∧ m = fsfun_prod multipliers (delta_nat_fsfun n)by rewrite <- Hmi, mi, prod_powers_delta.index: Type
multipliers: index → Z
Hmultipliers: ∀ i : index, multipliers i ≠ 0
indexSet: Type
H: ElemOf index indexSet
H0: Empty indexSet
H1: Singleton index indexSet
H2: Union indexSet
H3: Intersection indexSet
H4: Difference indexSet
H5: Elements index indexSet
EqDecision0: EqDecision index
H6: FinSet index indexSet
radix_constraint: composite_label indexed_radix_vlsms → composite_state indexed_radix_vlsms * option multiplying_message → Prop
s: state radix_composite_vlsm
Hs: initial_state_prop s
m: multiplying_message
n: index
mielem: multiplying_message
mi: mielem = multipliers n
Hmi: mielem = mm = fsfun_prod multipliers (delta_nat_fsfun n)index: Type
multipliers: index → Z
Hmultipliers: ∀ i : index, multipliers i ≠ 0
indexSet: Type
H: ElemOf index indexSet
H0: Empty indexSet
H1: Singleton index indexSet
H2: Union indexSet
H3: Intersection indexSet
H4: Difference indexSet
H5: Elements index indexSet
EqDecision0: EqDecision index
H6: FinSet index indexSet
radix_constraint: composite_label indexed_radix_vlsms → composite_state indexed_radix_vlsms * option multiplying_message → Prop
s: state radix_composite_vlsm
_om: option multiplying_message
Hvsm1: valid_state_message_prop radix_composite_vlsm s _om
_s: state radix_composite_vlsm
om: option multiplying_message
Hvsm2: valid_state_message_prop radix_composite_vlsm _s om
l: label radix_composite_vlsm
Hv: valid l (s, om)
s': state radix_composite_vlsm
m: multiplying_message
Ht: transition l (s, om) = (s', Some m)
IHHvsm1: ∀ m : multiplying_message, _om = Some m → ∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers f
IHHvsm2: ∀ m : multiplying_message, om = Some m → ∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers f∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers findex: Type
multipliers: index → Z
Hmultipliers: ∀ i : index, multipliers i ≠ 0
indexSet: Type
H: ElemOf index indexSet
H0: Empty indexSet
H1: Singleton index indexSet
H2: Union indexSet
H3: Intersection indexSet
H4: Difference indexSet
H5: Elements index indexSet
EqDecision0: EqDecision index
H6: FinSet index indexSet
radix_constraint: composite_label indexed_radix_vlsms → composite_state indexed_radix_vlsms * option multiplying_message → Prop
s: state radix_composite_vlsm
_om: option multiplying_message
Hvsm1: valid_state_message_prop radix_composite_vlsm s _om
_s: state radix_composite_vlsm
om: option multiplying_message
Hvsm2: valid_state_message_prop radix_composite_vlsm _s om
k: index
lk: label (indexed_radix_vlsms k)
Hv: valid (existT k lk) (s, om)
s': state radix_composite_vlsm
m: multiplying_message
Ht: transition (existT k lk) (s, om) = (s', Some m)
IHHvsm1: ∀ m : multiplying_message, _om = Some m → ∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers f
IHHvsm2: ∀ m : multiplying_message, om = Some m → ∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers f∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers findex: Type
multipliers: index → Z
Hmultipliers: ∀ i : index, multipliers i ≠ 0
indexSet: Type
H: ElemOf index indexSet
H0: Empty indexSet
H1: Singleton index indexSet
H2: Union indexSet
H3: Intersection indexSet
H4: Difference indexSet
H5: Elements index indexSet
EqDecision0: EqDecision index
H6: FinSet index indexSet
radix_constraint: composite_label indexed_radix_vlsms → composite_state indexed_radix_vlsms * option multiplying_message → Prop
s: state radix_composite_vlsm
_om: option multiplying_message
Hvsm1: valid_state_message_prop radix_composite_vlsm s _om
_s: state radix_composite_vlsm
m0: multiplying_message
Hvsm2: valid_state_message_prop radix_composite_vlsm _s (Some m0)
k: index
lk: label (indexed_radix_vlsms k)
Hv: valid (existT k lk) (s, Some m0)
s': state radix_composite_vlsm
m: multiplying_message
Ht: transition (existT k lk) (s, Some m0) = (s', Some m)
IHHvsm1: ∀ m : multiplying_message, _om = Some m → ∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers f
IHHvsm2: ∀ m : multiplying_message, Some m0 = Some m → ∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers f∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers findex: Type
multipliers: index → Z
Hmultipliers: ∀ i : index, multipliers i ≠ 0
indexSet: Type
H: ElemOf index indexSet
H0: Empty indexSet
H1: Singleton index indexSet
H2: Union indexSet
H3: Intersection indexSet
H4: Difference indexSet
H5: Elements index indexSet
EqDecision0: EqDecision index
H6: FinSet index indexSet
radix_constraint: composite_label indexed_radix_vlsms → composite_state indexed_radix_vlsms * option multiplying_message → Prop
s: state radix_composite_vlsm
_om: option multiplying_message
Hvsm1: valid_state_message_prop radix_composite_vlsm s _om
_s: state radix_composite_vlsm
f: fsfun index 0%nat
Hvsm2: valid_state_message_prop radix_composite_vlsm _s (Some (fsfun_prod multipliers f))
k: index
lk: label (indexed_radix_vlsms k)
Hv: valid (existT k lk) (s, Some (fsfun_prod multipliers f))
s': state radix_composite_vlsm
m: multiplying_message
Ht: transition (existT k lk) (s, Some (fsfun_prod multipliers f)) = (s', Some m)
IHHvsm1: ∀ m : multiplying_message, _om = Some m → ∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers f
IHHvsm2: ∀ m : multiplying_message, Some (fsfun_prod multipliers f) = Some m → ∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers f
Hdomf: fin_supp f ≠ []∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers findex: Type
multipliers: index → Z
Hmultipliers: ∀ i : index, multipliers i ≠ 0
indexSet: Type
H: ElemOf index indexSet
H0: Empty indexSet
H1: Singleton index indexSet
H2: Union indexSet
H3: Intersection indexSet
H4: Difference indexSet
H5: Elements index indexSet
EqDecision0: EqDecision index
H6: FinSet index indexSet
radix_constraint: composite_label indexed_radix_vlsms → composite_state indexed_radix_vlsms * option multiplying_message → Prop
s: state radix_composite_vlsm
_om: option multiplying_message
Hvsm1: valid_state_message_prop radix_composite_vlsm s _om
_s: state radix_composite_vlsm
f: fsfun index 0%nat
Hvsm2: valid_state_message_prop radix_composite_vlsm _s (Some (fsfun_prod multipliers f))
k: index
lk: label (indexed_radix_vlsms k)
Hv: valid (existT k lk) (s, Some (fsfun_prod multipliers f))
s': state radix_composite_vlsm
m: multiplying_message
Ht: transition (existT k lk) (s, Some (fsfun_prod multipliers f)) = (s', Some m)
IHHvsm1: ∀ m : multiplying_message, _om = Some m → ∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers f
IHHvsm2: ∀ m : multiplying_message, Some (fsfun_prod multipliers f) = Some m → ∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers f
Hdomf: fin_supp f ≠ []
H8: state_update indexed_radix_vlsms s k (s k - fsfun_prod multipliers f) = s'
H9: multipliers k * fsfun_prod multipliers f = m∃ f0 : fsfun index 0%nat, fin_supp f0 ≠ [] ∧ multipliers k * fsfun_prod multipliers f = fsfun_prod multipliers f0index: Type
multipliers: index → Z
Hmultipliers: ∀ i : index, multipliers i ≠ 0
indexSet: Type
H: ElemOf index indexSet
H0: Empty indexSet
H1: Singleton index indexSet
H2: Union indexSet
H3: Intersection indexSet
H4: Difference indexSet
H5: Elements index indexSet
EqDecision0: EqDecision index
H6: FinSet index indexSet
radix_constraint: composite_label indexed_radix_vlsms → composite_state indexed_radix_vlsms * option multiplying_message → Prop
s: state radix_composite_vlsm
_om: option multiplying_message
Hvsm1: valid_state_message_prop radix_composite_vlsm s _om
_s: state radix_composite_vlsm
f: fsfun index 0%nat
Hvsm2: valid_state_message_prop radix_composite_vlsm _s (Some (fsfun_prod multipliers f))
k: index
lk: label (indexed_radix_vlsms k)
Hv: valid (existT k lk) (s, Some (fsfun_prod multipliers f))
s': state radix_composite_vlsm
m: multiplying_message
Ht: transition (existT k lk) (s, Some (fsfun_prod multipliers f)) = (s', Some m)
IHHvsm1: ∀ m : multiplying_message, _om = Some m → ∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers f
IHHvsm2: ∀ m : multiplying_message, Some (fsfun_prod multipliers f) = Some m → ∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers f
Hdomf: fin_supp f ≠ []
H8: state_update indexed_radix_vlsms s k (s k - fsfun_prod multipliers f) = s'
H9: multipliers k * fsfun_prod multipliers f = mfin_supp (succ_fsfun f k) ≠ [] ∧ multipliers k * fsfun_prod multipliers f = fsfun_prod multipliers (succ_fsfun f k)index: Type
multipliers: index → Z
Hmultipliers: ∀ i : index, multipliers i ≠ 0
indexSet: Type
H: ElemOf index indexSet
H0: Empty indexSet
H1: Singleton index indexSet
H2: Union indexSet
H3: Intersection indexSet
H4: Difference indexSet
H5: Elements index indexSet
EqDecision0: EqDecision index
H6: FinSet index indexSet
radix_constraint: composite_label indexed_radix_vlsms → composite_state indexed_radix_vlsms * option multiplying_message → Prop
s: state radix_composite_vlsm
_om: option multiplying_message
Hvsm1: valid_state_message_prop radix_composite_vlsm s _om
_s: state radix_composite_vlsm
f: fsfun index 0%nat
Hvsm2: valid_state_message_prop radix_composite_vlsm _s (Some (fsfun_prod multipliers f))
k: index
lk: label (indexed_radix_vlsms k)
Hv: valid (existT k lk) (s, Some (fsfun_prod multipliers f))
s': state radix_composite_vlsm
m: multiplying_message
Ht: transition (existT k lk) (s, Some (fsfun_prod multipliers f)) = (s', Some m)
IHHvsm1: ∀ m : multiplying_message, _om = Some m → ∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers f
IHHvsm2: ∀ m : multiplying_message, Some (fsfun_prod multipliers f) = Some m → ∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers f
Hdomf: fin_supp f ≠ []
H8: state_update indexed_radix_vlsms s k (s k - fsfun_prod multipliers f) = s'
H9: multipliers k * fsfun_prod multipliers f = mfin_supp (succ_fsfun f k) ≠ []by eapply elem_of_not_nil, elem_of_succ_fsfun; right. Qed. End sec_composition. Section sec_free_composition. Context `{EqDecision index} (multipliers : index -> Z) `{Inhabited index} . Definition free_radix_composite_vlsm : VLSM multiplying_message := free_composite_vlsm (indexed_radix_vlsms multipliers).index: Type
multipliers: index → Z
Hmultipliers: ∀ i : index, multipliers i ≠ 0
indexSet: Type
H: ElemOf index indexSet
H0: Empty indexSet
H1: Singleton index indexSet
H2: Union indexSet
H3: Intersection indexSet
H4: Difference indexSet
H5: Elements index indexSet
EqDecision0: EqDecision index
H6: FinSet index indexSet
radix_constraint: composite_label indexed_radix_vlsms → composite_state indexed_radix_vlsms * option multiplying_message → Prop
s: state radix_composite_vlsm
_om: option multiplying_message
Hvsm1: valid_state_message_prop radix_composite_vlsm s _om
_s: state radix_composite_vlsm
f: fsfun index 0%nat
Hvsm2: valid_state_message_prop radix_composite_vlsm _s (Some (fsfun_prod multipliers f))
k: index
lk: label (indexed_radix_vlsms k)
Hv: valid (existT k lk) (s, Some (fsfun_prod multipliers f))
s': state radix_composite_vlsm
m: multiplying_message
Ht: transition (existT k lk) (s, Some (fsfun_prod multipliers f)) = (s', Some m)
IHHvsm1: ∀ m : multiplying_message, _om = Some m → ∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers f
IHHvsm2: ∀ m : multiplying_message, Some (fsfun_prod multipliers f) = Some m → ∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers f
Hdomf: dsig (λ i : index, i ∈ fin_supp f)
H8: state_update indexed_radix_vlsms s k (s k - fsfun_prod multipliers f) = s'
H9: multipliers k * fsfun_prod multipliers f = m
i: index
Hi: i ∈ fin_supp f
Heq: Hdomf = dexist i Hifin_supp (succ_fsfun f k) ≠ []index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index∀ m : multiplying_message, valid_message_prop free_radix_composite_vlsm m → m >= 2 → ∀ n : index, input_valid_transition free_radix_composite_vlsm (existT n radix_label) (update (const 1) n (m + 1), Some m) (const 1, Some (multipliers n * m))index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index∀ m : multiplying_message, valid_message_prop free_radix_composite_vlsm m → m >= 2 → ∀ n : index, input_valid_transition free_radix_composite_vlsm (existT n radix_label) (update (const 1) n (m + 1), Some m) (const 1, Some (multipliers n * m))index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
m: multiplying_message
H0: valid_message_prop free_radix_composite_vlsm m
H1: m >= 2
n: indexvalid_state_prop free_radix_composite_vlsm (update (const 1) n (m + 1))index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
m: multiplying_message
H0: valid_message_prop free_radix_composite_vlsm m
H1: m >= 2
n: indexoption_valid_message_prop free_radix_composite_vlsm (Some m)index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
m: multiplying_message
H0: valid_message_prop free_radix_composite_vlsm m
H1: m >= 2
n: index2 ≤ mindex: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
m: multiplying_message
H0: valid_message_prop free_radix_composite_vlsm m
H1: m >= 2
n: indexm ≤ update (const 1) n (m + 1) nindex: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
m: multiplying_message
H0: valid_message_prop free_radix_composite_vlsm m
H1: m >= 2
n: indextransition (existT n radix_label) (update (const 1) n (m + 1), Some m) = (const 1, Some (multipliers n * m))index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
m: multiplying_message
H0: valid_message_prop free_radix_composite_vlsm m
H1: m >= 2
n: indexvalid_state_prop free_radix_composite_vlsm (update (const 1) n (m + 1))index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
m: multiplying_message
H0: valid_message_prop free_radix_composite_vlsm m
H1: m >= 2
n: indexinitial_state_prop (update (const 1) n (m + 1))by destruct (decide (n = j)) as [-> |]; [rewrite update_eq; lia | rewrite update_neq].index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
m: multiplying_message
H0: valid_message_prop free_radix_composite_vlsm m
H1: m >= 2
n, j: indexupdate (const 1) n (m + 1) j >= 1done.index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
m: multiplying_message
H0: valid_message_prop free_radix_composite_vlsm m
H1: m >= 2
n: indexoption_valid_message_prop free_radix_composite_vlsm (Some m)by lia.index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
m: multiplying_message
H0: valid_message_prop free_radix_composite_vlsm m
H1: m >= 2
n: index2 ≤ mby rewrite update_eq; lia.index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
m: multiplying_message
H0: valid_message_prop free_radix_composite_vlsm m
H1: m >= 2
n: indexm ≤ update (const 1) n (m + 1) nindex: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
m: multiplying_message
H0: valid_message_prop free_radix_composite_vlsm m
H1: m >= 2
n: indextransition (existT n radix_label) (update (const 1) n (m + 1), Some m) = (const 1, Some (multipliers n * m))index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
m: multiplying_message
H0: valid_message_prop free_radix_composite_vlsm m
H1: m >= 2
n: indexstate_update (indexed_radix_vlsms multipliers) (update (const 1) n (m + 1)) n (m + 1 - m) = const 1index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
m: multiplying_message
H0: valid_message_prop free_radix_composite_vlsm m
H1: m >= 2
n, j: indexstate_update (indexed_radix_vlsms multipliers) (update (const 1) n (m + 1)) n (m + 1 - m) j = 1by rewrite update_neq. Qed.index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
m: multiplying_message
H0: valid_message_prop free_radix_composite_vlsm m
H1: m >= 2
n, j: index
n0: n ≠ jupdate (const 1) n (m + 1) j = 1index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
m: multiplying_message
f: fsfun index 0%natfin_supp f ≠ [] ∧ m = fsfun_prod multipliers f → valid_message_prop free_radix_composite_vlsm mindex: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
m: multiplying_message
f: fsfun index 0%natfin_supp f ≠ [] ∧ m = fsfun_prod multipliers f → valid_message_prop free_radix_composite_vlsm mindex: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1∀ f : fsfun index 0%nat, fin_supp f ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f → valid_message_prop free_radix_composite_vlsm mindex: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1Proper (equiv ==> impl) (λ f : fsfun index 0%nat, fin_supp f ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f → valid_message_prop free_radix_composite_vlsm m)index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1∀ (i : index) (f : fsfun index 0%nat), (fin_supp f ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f → valid_message_prop free_radix_composite_vlsm m) → fin_supp (succ_fsfun f i) ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers (succ_fsfun f i) → valid_message_prop free_radix_composite_vlsm mindex: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1Proper (equiv ==> impl) (λ f : fsfun index 0%nat, fin_supp f ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f → valid_message_prop free_radix_composite_vlsm m)index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
f1, f2: fsfun index 0%nat
Heq: f1 ≡ f2
Hall: fin_supp f1 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f1 → valid_message_prop free_radix_composite_vlsm m
Hi: fin_supp f2 ≠ []
m: multiplying_message
Hm: m = fsfun_prod multipliers f2valid_message_prop free_radix_composite_vlsm mindex: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
f1, f2: fsfun index 0%nat
Heq: f1 ≡ f2
Hall: fin_supp f1 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f1 → valid_message_prop free_radix_composite_vlsm m
Hi: fin_supp f2 ≠ []
m: multiplying_message
Hm: m = fsfun_prod multipliers f2fin_supp f1 ≠ []index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
f1, f2: fsfun index 0%nat
Heq: f1 ≡ f2
Hall: fin_supp f1 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f1 → valid_message_prop free_radix_composite_vlsm m
m: multiplying_message
Hm: m = fsfun_prod multipliers f2
Hi: fin_supp f1 = []fin_supp f2 = []by rewrite <- Hi, Heq.index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
f1, f2: fsfun index 0%nat
Heq: f1 ≡ f2
Hall: fin_supp f1 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f1 → valid_message_prop free_radix_composite_vlsm m
m: multiplying_message
Hm: m = fsfun_prod multipliers f2
Hi: fin_supp f1 = [][] ≡ₚ fin_supp f2index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1∀ (i : index) (f : fsfun index 0%nat), (fin_supp f ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f → valid_message_prop free_radix_composite_vlsm m) → fin_supp (succ_fsfun f i) ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers (succ_fsfun f i) → valid_message_prop free_radix_composite_vlsm mindex: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
n: index
f0: fsfun index 0%nat
IHf0: fin_supp f0 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f0 → valid_message_prop free_radix_composite_vlsm m
Hi: fin_supp (succ_fsfun f0 n) ≠ []
m: multiplying_message
Hm: m = fsfun_prod multipliers (succ_fsfun f0 n)valid_message_prop free_radix_composite_vlsm mindex: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
n: index
f0: fsfun index 0%nat
IHf0: fin_supp f0 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f0 → valid_message_prop free_radix_composite_vlsm m
Hi: fin_supp (succ_fsfun f0 n) ≠ []
m: multiplying_message
Hm: m = fsfun_prod multipliers (succ_fsfun f0 n)
Heq: f0 ≡ zero_fsfunvalid_message_prop free_radix_composite_vlsm mindex: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
n: index
f0: fsfun index 0%nat
IHf0: fin_supp f0 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f0 → valid_message_prop free_radix_composite_vlsm m
Hi: fin_supp (succ_fsfun f0 n) ≠ []
m: multiplying_message
Hm: m = fsfun_prod multipliers (succ_fsfun f0 n)
n': index
f0': fsfun index 0%nat
Heq: f0 ≡ succ_fsfun f0' n'valid_message_prop free_radix_composite_vlsm mindex: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
n: index
f0: fsfun index 0%nat
IHf0: fin_supp f0 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f0 → valid_message_prop free_radix_composite_vlsm m
Hi: fin_supp (succ_fsfun f0 n) ≠ []
m: multiplying_message
Hm: m = fsfun_prod multipliers (succ_fsfun f0 n)
Heq: f0 ≡ zero_fsfunvalid_message_prop free_radix_composite_vlsm mindex: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
n: index
f0: fsfun index 0%nat
IHf0: fin_supp f0 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f0 → valid_message_prop free_radix_composite_vlsm m
Hi: fin_supp (succ_fsfun f0 n) ≠ []
m: multiplying_message
Hm: m = multipliers n * 1
Heq: f0 ≡ zero_fsfunvalid_message_prop free_radix_composite_vlsm mindex: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
n: index
f0: fsfun index 0%nat
IHf0: fin_supp f0 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f0 → valid_message_prop free_radix_composite_vlsm m
Hi: fin_supp (succ_fsfun f0 n) ≠ []
m: multiplying_message
Hm: m = multipliers n * 1
Heq: f0 ≡ zero_fsfuninitial_message_prop mby unshelve eexists (exist _ m _); cbn; lia.index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
n: index
f0: fsfun index 0%nat
IHf0: fin_supp f0 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f0 → valid_message_prop free_radix_composite_vlsm m
Hi: fin_supp (succ_fsfun f0 n) ≠ []
m: multiplying_message
Hm: m = multipliers n * 1
Heq: f0 ≡ zero_fsfun∃ mi : initial_message (indexed_radix_vlsms multipliers n), `mi = mindex: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
n: index
f0: fsfun index 0%nat
IHf0: fin_supp f0 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f0 → valid_message_prop free_radix_composite_vlsm m
Hi: fin_supp (succ_fsfun f0 n) ≠ []
m: multiplying_message
Hm: m = fsfun_prod multipliers (succ_fsfun f0 n)
n': index
f0': fsfun index 0%nat
Heq: f0 ≡ succ_fsfun f0' n'valid_message_prop free_radix_composite_vlsm mindex: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
n: index
f0: fsfun index 0%nat
IHf0: fin_supp f0 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f0 → valid_message_prop free_radix_composite_vlsm m
Hi: fin_supp (succ_fsfun f0 n) ≠ []
m: multiplying_message
Hm: m = fsfun_prod multipliers (succ_fsfun f0 n)
n': index
f0': fsfun index 0%nat
Heq: f0 ≡ succ_fsfun f0' n'valid_message_prop free_radix_composite_vlsm (fsfun_prod multipliers f0)index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
n: index
f0: fsfun index 0%nat
IHf0: fin_supp f0 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f0 → valid_message_prop free_radix_composite_vlsm m
Hi: fin_supp (succ_fsfun f0 n) ≠ []
m: multiplying_message
Hm: m = fsfun_prod multipliers (succ_fsfun f0 n)
n': index
f0': fsfun index 0%nat
Heq: f0 ≡ succ_fsfun f0' n'
Hmvalid: valid_message_prop free_radix_composite_vlsm (fsfun_prod multipliers f0)valid_message_prop free_radix_composite_vlsm mindex: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
n: index
f0: fsfun index 0%nat
IHf0: fin_supp f0 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f0 → valid_message_prop free_radix_composite_vlsm m
Hi: fin_supp (succ_fsfun f0 n) ≠ []
m: multiplying_message
Hm: m = fsfun_prod multipliers (succ_fsfun f0 n)
n': index
f0': fsfun index 0%nat
Heq: f0 ≡ succ_fsfun f0' n'valid_message_prop free_radix_composite_vlsm (fsfun_prod multipliers f0)index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
n: index
f0: fsfun index 0%nat
IHf0: fin_supp f0 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f0 → valid_message_prop free_radix_composite_vlsm m
Hi: fin_supp (succ_fsfun f0 n) ≠ []
m: multiplying_message
Hm: m = fsfun_prod multipliers (succ_fsfun f0 n)
n': index
f0': fsfun index 0%nat
Heq: f0 ≡ succ_fsfun f0' n'fin_supp f0 ≠ []index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
n: index
f0: fsfun index 0%nat
IHf0: fin_supp f0 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f0 → valid_message_prop free_radix_composite_vlsm m
Hi: fin_supp (succ_fsfun f0 n) ≠ []
m: multiplying_message
Hm: m = fsfun_prod multipliers (succ_fsfun f0 n)
n': index
f0': fsfun index 0%nat
Heq: f0 ≡ succ_fsfun f0' n'fin_supp (succ_fsfun f0' n') ≠ []index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
n: index
f0: fsfun index 0%nat
IHf0: fin_supp f0 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f0 → valid_message_prop free_radix_composite_vlsm m
Hi: fin_supp (succ_fsfun f0 n) ≠ []
m: multiplying_message
Hm: m = fsfun_prod multipliers (succ_fsfun f0 n)
n': index
f0': fsfun index 0%nat
Heq: f0 ≡ succ_fsfun f0' n'
Hinh: fin_supp (succ_fsfun f0' n') ≠ []fin_supp f0 ≠ []by eapply elem_of_not_nil, elem_of_succ_fsfun; left.index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
n: index
f0: fsfun index 0%nat
IHf0: fin_supp f0 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f0 → valid_message_prop free_radix_composite_vlsm m
Hi: fin_supp (succ_fsfun f0 n) ≠ []
m: multiplying_message
Hm: m = fsfun_prod multipliers (succ_fsfun f0 n)
n': index
f0': fsfun index 0%nat
Heq: f0 ≡ succ_fsfun f0' n'fin_supp (succ_fsfun f0' n') ≠ []index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
n: index
f0: fsfun index 0%nat
IHf0: fin_supp f0 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f0 → valid_message_prop free_radix_composite_vlsm m
Hi: fin_supp (succ_fsfun f0 n) ≠ []
m: multiplying_message
Hm: m = fsfun_prod multipliers (succ_fsfun f0 n)
n': index
f0': fsfun index 0%nat
Heq: f0 ≡ succ_fsfun f0' n'
Hinh: fin_supp (succ_fsfun f0' n') ≠ []fin_supp f0 ≠ []by rewrite <- Hinh, Heq.index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
n: index
f0: fsfun index 0%nat
IHf0: fin_supp f0 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f0 → valid_message_prop free_radix_composite_vlsm m
Hi: fin_supp (succ_fsfun f0 n) ≠ []
m: multiplying_message
Hm: m = fsfun_prod multipliers (succ_fsfun f0 n)
n': index
f0': fsfun index 0%nat
Heq: f0 ≡ succ_fsfun f0' n'
Hinh: fin_supp f0 = [][] ≡ₚ fin_supp (succ_fsfun f0' n')index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
n: index
f0: fsfun index 0%nat
IHf0: fin_supp f0 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f0 → valid_message_prop free_radix_composite_vlsm m
Hi: fin_supp (succ_fsfun f0 n) ≠ []
m: multiplying_message
Hm: m = fsfun_prod multipliers (succ_fsfun f0 n)
n': index
f0': fsfun index 0%nat
Heq: f0 ≡ succ_fsfun f0' n'
Hmvalid: valid_message_prop free_radix_composite_vlsm (fsfun_prod multipliers f0)valid_message_prop free_radix_composite_vlsm mindex: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
n: index
f0: fsfun index 0%nat
IHf0: fin_supp f0 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f0 → valid_message_prop free_radix_composite_vlsm m
Hi: fin_supp (succ_fsfun f0 n) ≠ []
n': index
f0': fsfun index 0%nat
Heq: f0 ≡ succ_fsfun f0' n'
Hmvalid: valid_message_prop free_radix_composite_vlsm (fsfun_prod multipliers f0)valid_message_prop free_radix_composite_vlsm (multipliers n * fsfun_prod multipliers f0)index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
n: index
f0: fsfun index 0%nat
IHf0: fin_supp f0 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f0 → valid_message_prop free_radix_composite_vlsm m
Hi: fin_supp (succ_fsfun f0 n) ≠ []
n': index
f0': fsfun index 0%nat
Heq: f0 ≡ succ_fsfun f0' n'
Hmvalid: valid_message_prop free_radix_composite_vlsm (fsfun_prod multipliers f0)fsfun_prod multipliers f0 >= multipliers n'index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
n: index
f0: fsfun index 0%nat
IHf0: fin_supp f0 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f0 → valid_message_prop free_radix_composite_vlsm m
Hi: fin_supp (succ_fsfun f0 n) ≠ []
n': index
f0': fsfun index 0%nat
Heq: f0 ≡ succ_fsfun f0' n'
Hmvalid: valid_message_prop free_radix_composite_vlsm (fsfun_prod multipliers f0)
Hpos: fsfun_prod multipliers f0 >= multipliers n'valid_message_prop free_radix_composite_vlsm (multipliers n * fsfun_prod multipliers f0)index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
n: index
f0: fsfun index 0%nat
IHf0: fin_supp f0 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f0 → valid_message_prop free_radix_composite_vlsm m
Hi: fin_supp (succ_fsfun f0 n) ≠ []
n': index
f0': fsfun index 0%nat
Heq: f0 ≡ succ_fsfun f0' n'
Hmvalid: valid_message_prop free_radix_composite_vlsm (fsfun_prod multipliers f0)fsfun_prod multipliers f0 >= multipliers n'index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
n: index
f0: fsfun index 0%nat
IHf0: fin_supp f0 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f0 → valid_message_prop free_radix_composite_vlsm m
Hi: fin_supp (succ_fsfun f0 n) ≠ []
n': index
f0': fsfun index 0%nat
Heq: f0 ≡ succ_fsfun f0' n'
Hmvalid: valid_message_prop free_radix_composite_vlsm (fsfun_prod multipliers f0)multipliers n' * fsfun_prod multipliers f0' >= multipliers n'index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
n: index
f0: fsfun index 0%nat
IHf0: fin_supp f0 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f0 → valid_message_prop free_radix_composite_vlsm m
Hi: fin_supp (succ_fsfun f0 n) ≠ []
n': index
f0': fsfun index 0%nat
Heq: f0 ≡ succ_fsfun f0' n'
Hmvalid: valid_message_prop free_radix_composite_vlsm (fsfun_prod multipliers f0)fsfun_prod multipliers f0' > 0index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
n: index
f0: fsfun index 0%nat
IHf0: fin_supp f0 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f0 → valid_message_prop free_radix_composite_vlsm m
Hi: fin_supp (succ_fsfun f0 n) ≠ []
n': index
f0': fsfun index 0%nat
Heq: f0 ≡ succ_fsfun f0' n'
Hmvalid: valid_message_prop free_radix_composite_vlsm (fsfun_prod multipliers f0)
Hz: fin_supp f0' = []fsfun_prod multipliers f0' > 0index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
n: index
f0: fsfun index 0%nat
IHf0: fin_supp f0 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f0 → valid_message_prop free_radix_composite_vlsm m
Hi: fin_supp (succ_fsfun f0 n) ≠ []
n': index
f0': fsfun index 0%nat
Heq: f0 ≡ succ_fsfun f0' n'
Hmvalid: valid_message_prop free_radix_composite_vlsm (fsfun_prod multipliers f0)
n0: fin_supp f0' ≠ []fsfun_prod multipliers f0' > 0index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
n: index
f0: fsfun index 0%nat
IHf0: fin_supp f0 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f0 → valid_message_prop free_radix_composite_vlsm m
Hi: fin_supp (succ_fsfun f0 n) ≠ []
n': index
f0': fsfun index 0%nat
Heq: f0 ≡ succ_fsfun f0' n'
Hmvalid: valid_message_prop free_radix_composite_vlsm (fsfun_prod multipliers f0)
Hz: fin_supp f0' = []fsfun_prod multipliers f0' > 0by setoid_rewrite fsfun_prod_zero; lia.index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
n: index
f0: fsfun index 0%nat
IHf0: fin_supp f0 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f0 → valid_message_prop free_radix_composite_vlsm m
Hi: fin_supp (succ_fsfun f0 n) ≠ []
n': index
f0': fsfun index 0%nat
Heq: f0 ≡ succ_fsfun f0' n'
Hmvalid: valid_message_prop free_radix_composite_vlsm (fsfun_prod multipliers f0)fsfun_prod multipliers empty_fsfun > 0index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
n: index
f0: fsfun index 0%nat
IHf0: fin_supp f0 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f0 → valid_message_prop free_radix_composite_vlsm m
Hi: fin_supp (succ_fsfun f0 n) ≠ []
n': index
f0': fsfun index 0%nat
Heq: f0 ≡ succ_fsfun f0' n'
Hmvalid: valid_message_prop free_radix_composite_vlsm (fsfun_prod multipliers f0)
n0: fin_supp f0' ≠ []fsfun_prod multipliers f0' > 0by intro i; specialize (Hmpos i); lia.index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
n: index
f0: fsfun index 0%nat
IHf0: fin_supp f0 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f0 → valid_message_prop free_radix_composite_vlsm m
Hi: fin_supp (succ_fsfun f0 n) ≠ []
n': index
f0': fsfun index 0%nat
Heq: f0 ≡ succ_fsfun f0' n'
Hmvalid: valid_message_prop free_radix_composite_vlsm (fsfun_prod multipliers f0)
n0: fin_supp f0' ≠ []∀ i : index, multipliers i > 0index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
n: index
f0: fsfun index 0%nat
IHf0: fin_supp f0 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f0 → valid_message_prop free_radix_composite_vlsm m
Hi: fin_supp (succ_fsfun f0 n) ≠ []
n': index
f0': fsfun index 0%nat
Heq: f0 ≡ succ_fsfun f0' n'
Hmvalid: valid_message_prop free_radix_composite_vlsm (fsfun_prod multipliers f0)
Hpos: fsfun_prod multipliers f0 >= multipliers n'valid_message_prop free_radix_composite_vlsm (multipliers n * fsfun_prod multipliers f0)by eapply input_valid_transition_out, free_radix_composite_vlsm_emits_multiplier; [| lia]. Qed.index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
n': index
Hmpos: multipliers n' > 1
n: index
f0: fsfun index 0%nat
IHf0: fin_supp f0 ≠ [] → ∀ m : multiplying_message, m = fsfun_prod multipliers f0 → valid_message_prop free_radix_composite_vlsm m
Hi: fin_supp (succ_fsfun f0 n) ≠ []
f0': fsfun index 0%nat
Heq: f0 ≡ succ_fsfun f0' n'
Hmvalid: valid_message_prop free_radix_composite_vlsm (fsfun_prod multipliers f0)
Hpos: fsfun_prod multipliers f0 >= multipliers n'valid_message_prop free_radix_composite_vlsm (multipliers n * fsfun_prod multipliers f0)index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
m: multiplying_messagevalid_message_prop free_radix_composite_vlsm m ↔ (∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers f)index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
m: multiplying_messagevalid_message_prop free_radix_composite_vlsm m ↔ (∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers f)index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
m: multiplying_messagevalid_message_prop free_radix_composite_vlsm m → ∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers findex: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
m: multiplying_message(∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers f) → valid_message_prop free_radix_composite_vlsm mindex: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
m: multiplying_messagevalid_message_prop free_radix_composite_vlsm m → ∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers findex: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
m: multiplying_message
Hvm: valid_message_prop free_radix_composite_vlsm m∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers findex: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
m: multiplying_message
Hvm: valid_message_prop free_radix_composite_vlsm mVLSM_incl_part (free_composite_vlsm_machine (indexed_radix_vlsms multipliers)) ?MYindex: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
m: multiplying_message
Hvm: valid_message_prop free_radix_composite_vlsm mstrong_incl_initial_message_preservation (free_composite_vlsm_machine (indexed_radix_vlsms multipliers)) ?MYindex: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
m: multiplying_message
Hvm: valid_message_prop {| vlsm_type := composite_type (indexed_radix_vlsms multipliers); vlsm_machine := ?MY |} m∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers fby apply free_composite_vlsm_spec.index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
m: multiplying_message
Hvm: valid_message_prop free_radix_composite_vlsm mVLSM_incl_part (free_composite_vlsm_machine (indexed_radix_vlsms multipliers)) ?MYby do 2 red.index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
m: multiplying_message
Hvm: valid_message_prop free_radix_composite_vlsm mstrong_incl_initial_message_preservation (free_composite_vlsm_machine (indexed_radix_vlsms multipliers)) {| vlsm_type := free_composite_vlsm (indexed_radix_vlsms multipliers); vlsm_machine := composite_vlsm (indexed_radix_vlsms multipliers) (free_constraint (indexed_radix_vlsms multipliers)) |}by cbn in Hvm; eapply composition_valid_messages_powers_of_mults_right.index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
m: multiplying_message
Hvm: valid_message_prop {| vlsm_type := composite_type (indexed_radix_vlsms multipliers); vlsm_machine := {| vlsm_type := free_composite_vlsm (indexed_radix_vlsms multipliers); vlsm_machine := composite_vlsm (indexed_radix_vlsms multipliers) (free_constraint (indexed_radix_vlsms multipliers)) |} |} m∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers fby intros [? []]; eapply composition_valid_messages_powers_of_mults_left. Qed.index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
m: multiplying_message(∃ f : fsfun index 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod multipliers f) → valid_message_prop free_radix_composite_vlsm mindex: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
m: multiplying_messagevalid_message_prop free_radix_composite_vlsm m → m >= 2index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
m: multiplying_messagevalid_message_prop free_radix_composite_vlsm m → m >= 2index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
m: multiplying_message
Hv: valid_message_prop free_radix_composite_vlsm mm >= 2index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
i: fsfun index 0%nat
Hsupp: fin_supp i ≠ []fsfun_prod multipliers i >= 2by apply prod_powers_gt; [lia | ..]. Qed. End sec_free_composition.index: Type
EqDecision0: EqDecision index
multipliers: index → Z
H: Inhabited index
Hmpos: ∀ i : index, multipliers i > 1
i: fsfun index 0%nat
Hsupp: fin_supp i ≠ []fsfun_prod multipliers i > 1
A VLSM composition for all primes
Section sec_primes_vlsm_composition. Definition primes_vlsm_composition : VLSM Z := free_radix_composite_vlsm (fun p : primes => `p).∀ m : Z, valid_message_prop primes_vlsm_composition m ↔ m > 1∀ m : Z, valid_message_prop primes_vlsm_composition m ↔ m > 1∀ i : primes, `i > 1Hprime_pos: ∀ i : primes, `i > 1∀ m : Z, valid_message_prop primes_vlsm_composition m ↔ m > 1∀ i : primes, `i > 1i: primes`i > 1by destruct Hn; lia.n: Z
Hn: prime nn > 1Hprime_pos: ∀ i : primes, `i > 1∀ m : Z, valid_message_prop primes_vlsm_composition m ↔ m > 1Hprime_pos: ∀ i : primes, `i > 1
m: Zvalid_message_prop (free_radix_composite_vlsm (λ p : primes, `p)) m ↔ m > 1Hprime_pos: ∀ i : primes, `i > 1
m: Z(∃ f : fsfun primes 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod (λ p : primes, `p) f) ↔ m > 1Hprime_pos: ∀ i : primes, `i > 1
m: Z(∃ f : fsfun primes 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod (λ p : primes, `p) f) → m > 1Hprime_pos: ∀ i : primes, `i > 1
m: Zm > 1 → ∃ f : fsfun primes 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod (λ p : primes, `p) fHprime_pos: ∀ i : primes, `i > 1
m: Z(∃ f : fsfun primes 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod (λ p : primes, `p) f) → m > 1by apply prod_powers_gt.Hprime_pos: ∀ i : primes, `i > 1
fp: fsfun primes 0%nat
Hdom_fp: fin_supp fp ≠ []fsfun_prod (λ p : primes, `p) fp > 1by apply primes_factorization. Qed.Hprime_pos: ∀ i : primes, `i > 1
m: Zm > 1 → ∃ f : fsfun primes 0%nat, fin_supp f ≠ [] ∧ m = fsfun_prod (λ p : primes, `p) f
For any prime number, its corresponding component in the primes_vlsm_composition
is a validator for that composition, i.e., all of its constrained transitions
can be lifted to valid transitions for the composition.
∀ p : primes, component_projection_validator_prop (indexed_radix_vlsms (λ p0 : primes, `p0)) (λ (_ : composite_label (indexed_radix_vlsms (λ p0 : primes, `p0))) (_ : composite_state (indexed_radix_vlsms (λ p0 : primes, `p0)) * option multiplying_message), True) p∀ p : primes, component_projection_validator_prop (indexed_radix_vlsms (λ p0 : primes, `p0)) (λ (_ : composite_label (indexed_radix_vlsms (λ p0 : primes, `p0))) (_ : composite_state (indexed_radix_vlsms (λ p0 : primes, `p0)) * option multiplying_message), True) pp: primes
lp: label (indexed_radix_vlsms (λ p : primes, `p) p)
sp: state (indexed_radix_vlsms (λ p : primes, `p) p)
m: multiplying_message
Hsp: valid_state_prop (preloaded_with_all_messages_vlsm (indexed_radix_vlsms (λ p : primes, `p) p)) sp
H: 2 ≤ m
H0: m ≤ spvalid lp (sp, Some m)p: primes
lp: label (indexed_radix_vlsms (λ p : primes, `p) p)
sp: state (indexed_radix_vlsms (λ p : primes, `p) p)
m: multiplying_message
Hsp: valid_state_prop (preloaded_with_all_messages_vlsm (indexed_radix_vlsms (λ p : primes, `p) p)) sp
H: 2 ≤ m
H0: m ≤ splift_to_composite_state' (indexed_radix_vlsms (λ p : primes, `p)) p sp p = sp ∧ input_valid (composite_vlsm (indexed_radix_vlsms (λ p : primes, `p)) (λ (_ : composite_label (indexed_radix_vlsms (λ p : primes, `p))) (_ : composite_state (indexed_radix_vlsms (λ p : primes, `p)) * option multiplying_message), True)) (existT p lp) (lift_to_composite_state' (indexed_radix_vlsms (λ p : primes, `p)) p sp, Some m)p: primes
lp: label (indexed_radix_vlsms (λ p : primes, `p) p)
sp: state (indexed_radix_vlsms (λ p : primes, `p) p)
m: multiplying_message
Hsp: valid_state_prop (preloaded_with_all_messages_vlsm (indexed_radix_vlsms (λ p : primes, `p) p)) sp
H: 2 ≤ m
H0: m ≤ spvalid_state_prop (composite_vlsm (indexed_radix_vlsms (λ p : primes, `p)) (λ (_ : composite_label (indexed_radix_vlsms (λ p : primes, `p))) (_ : composite_state (indexed_radix_vlsms (λ p : primes, `p)) * option multiplying_message), True)) (lift_to_composite_state' (indexed_radix_vlsms (λ p : primes, `p)) p sp)p: primes
lp: label (indexed_radix_vlsms (λ p : primes, `p) p)
sp: state (indexed_radix_vlsms (λ p : primes, `p) p)
m: multiplying_message
Hsp: valid_state_prop (preloaded_with_all_messages_vlsm (indexed_radix_vlsms (λ p : primes, `p) p)) sp
H: 2 ≤ m
H0: m ≤ spoption_valid_message_prop (composite_vlsm (indexed_radix_vlsms (λ p : primes, `p)) (λ (_ : composite_label (indexed_radix_vlsms (λ p : primes, `p))) (_ : composite_state (indexed_radix_vlsms (λ p : primes, `p)) * option multiplying_message), True)) (Some m)p: primes
lp: label (indexed_radix_vlsms (λ p : primes, `p) p)
sp: state (indexed_radix_vlsms (λ p : primes, `p) p)
m: multiplying_message
Hsp: valid_state_prop (preloaded_with_all_messages_vlsm (indexed_radix_vlsms (λ p : primes, `p) p)) sp
H: 2 ≤ m
H0: m ≤ spvalid_state_prop (composite_vlsm (indexed_radix_vlsms (λ p : primes, `p)) (λ (_ : composite_label (indexed_radix_vlsms (λ p : primes, `p))) (_ : composite_state (indexed_radix_vlsms (λ p : primes, `p)) * option multiplying_message), True)) (lift_to_composite_state' (indexed_radix_vlsms (λ p : primes, `p)) p sp)p: primes
lp: label (indexed_radix_vlsms (λ p : primes, `p) p)
sp: state (indexed_radix_vlsms (λ p : primes, `p) p)
m: multiplying_message
Hsp: valid_state_prop (preloaded_with_all_messages_vlsm (indexed_radix_vlsms (λ p : primes, `p) p)) sp
H: 2 ≤ m
H0: m ≤ spinitial_state_prop (lift_to_composite_state' (indexed_radix_vlsms (λ p : primes, `p)) p sp)by destruct (decide (p = p')); subst; state_update_simpl; cbn; [lia |].p: primes
lp: label (indexed_radix_vlsms (λ p : primes, `p) p)
sp: state (indexed_radix_vlsms (λ p : primes, `p) p)
m: multiplying_message
Hsp: valid_state_prop (preloaded_with_all_messages_vlsm (indexed_radix_vlsms (λ p : primes, `p) p)) sp
H: 2 ≤ m
H0: m ≤ sp
p': primeslift_to_composite_state' (indexed_radix_vlsms (λ p : primes, `p)) p sp p' >= 1p: primes
lp: label (indexed_radix_vlsms (λ p : primes, `p) p)
sp: state (indexed_radix_vlsms (λ p : primes, `p) p)
m: multiplying_message
Hsp: valid_state_prop (preloaded_with_all_messages_vlsm (indexed_radix_vlsms (λ p : primes, `p) p)) sp
H: 2 ≤ m
H0: m ≤ spoption_valid_message_prop (composite_vlsm (indexed_radix_vlsms (λ p : primes, `p)) (λ (_ : composite_label (indexed_radix_vlsms (λ p : primes, `p))) (_ : composite_state (indexed_radix_vlsms (λ p : primes, `p)) * option multiplying_message), True)) (Some m)p: primes
lp: label (indexed_radix_vlsms (λ p : primes, `p) p)
sp: state (indexed_radix_vlsms (λ p : primes, `p) p)
m: multiplying_message
Hsp: valid_state_prop (preloaded_with_all_messages_vlsm (indexed_radix_vlsms (λ p : primes, `p) p)) sp
H: 2 ≤ m
H0: m ≤ spstrong_incl_initial_message_preservation {| vlsm_type := free_composite_vlsm (indexed_radix_vlsms (λ p : primes, `p)); vlsm_machine := free_composite_vlsm (indexed_radix_vlsms (λ p : primes, `p)) |} (constrained_vlsm_machine (free_composite_vlsm (indexed_radix_vlsms (λ p : primes, `p))) (λ (_ : composite_label (indexed_radix_vlsms (λ p : primes, `p))) (_ : composite_state (indexed_radix_vlsms (λ p : primes, `p)) * option multiplying_message), True))p: primes
lp: label (indexed_radix_vlsms (λ p : primes, `p) p)
sp: state (indexed_radix_vlsms (λ p : primes, `p) p)
m: multiplying_message
Hsp: valid_state_prop (preloaded_with_all_messages_vlsm (indexed_radix_vlsms (λ p : primes, `p) p)) sp
H: 2 ≤ m
H0: m ≤ spvalid_message_prop {| vlsm_type := free_composite_vlsm (indexed_radix_vlsms (λ p : primes, `p)); vlsm_machine := {| vlsm_type := free_composite_vlsm (indexed_radix_vlsms (λ p : primes, `p)); vlsm_machine := free_composite_vlsm (indexed_radix_vlsms (λ p : primes, `p)) |} |} mby do 2 red.p: primes
lp: label (indexed_radix_vlsms (λ p : primes, `p) p)
sp: state (indexed_radix_vlsms (λ p : primes, `p) p)
m: multiplying_message
Hsp: valid_state_prop (preloaded_with_all_messages_vlsm (indexed_radix_vlsms (λ p : primes, `p) p)) sp
H: 2 ≤ m
H0: m ≤ spstrong_incl_initial_message_preservation {| vlsm_type := free_composite_vlsm (indexed_radix_vlsms (λ p : primes, `p)); vlsm_machine := free_composite_vlsm (indexed_radix_vlsms (λ p : primes, `p)) |} (constrained_vlsm_machine (free_composite_vlsm (indexed_radix_vlsms (λ p : primes, `p))) (λ (_ : composite_label (indexed_radix_vlsms (λ p : primes, `p))) (_ : composite_state (indexed_radix_vlsms (λ p : primes, `p)) * option multiplying_message), True))by apply primes_vlsm_composition_valid_message_char; lia. Qed.p: primes
lp: label (indexed_radix_vlsms (λ p : primes, `p) p)
sp: state (indexed_radix_vlsms (λ p : primes, `p) p)
m: multiplying_message
Hsp: valid_state_prop (preloaded_with_all_messages_vlsm (indexed_radix_vlsms (λ p : primes, `p) p)) sp
H: 2 ≤ m
H0: m ≤ spvalid_message_prop {| vlsm_type := free_composite_vlsm (indexed_radix_vlsms (λ p : primes, `p)); vlsm_machine := {| vlsm_type := free_composite_vlsm (indexed_radix_vlsms (λ p : primes, `p)); vlsm_machine := free_composite_vlsm (indexed_radix_vlsms (λ p : primes, `p)) |} |} m
To show how a composition constraint affects validation, we here add a very
simple constraint, that the received message must be even, to the composition.
Inductive EvenConstraint : label primes_vlsm_composition -> state primes_vlsm_composition * option Z -> Prop := | even_constraint : forall l s m, Z.Even m -> EvenConstraint l (s, Some m). Definition even_constrained_primes_composition : VLSM Z := constrained_vlsm primes_vlsm_composition EvenConstraint.∀ m : multiplying_message, valid_message_prop even_constrained_primes_composition m → m >= 2 → Z.Even m → ∀ n : primes, input_valid_transition even_constrained_primes_composition (existT n radix_label) (update (const 1) n (m + 1), Some m) (const 1, Some (`n * m))∀ m : multiplying_message, valid_message_prop even_constrained_primes_composition m → m >= 2 → Z.Even m → ∀ n : primes, input_valid_transition even_constrained_primes_composition (existT n radix_label) (update (const 1) n (m + 1), Some m) (const 1, Some (`n * m))m: multiplying_message
H: valid_message_prop even_constrained_primes_composition m
H0: m >= 2
H1: Z.Even m
n: primesvalid_state_prop even_constrained_primes_composition (update (const 1) n (m + 1))m: multiplying_message
H: valid_message_prop even_constrained_primes_composition m
H0: m >= 2
H1: Z.Even m
n: primesoption_valid_message_prop even_constrained_primes_composition (Some m)m: multiplying_message
H: valid_message_prop even_constrained_primes_composition m
H0: m >= 2
H1: Z.Even m
n: primes2 ≤ mm: multiplying_message
H: valid_message_prop even_constrained_primes_composition m
H0: m >= 2
H1: Z.Even m
n: primesm ≤ update (const 1) n (m + 1) nm: multiplying_message
H: valid_message_prop even_constrained_primes_composition m
H0: m >= 2
H1: Z.Even m
n: primesZ.Even mm: multiplying_message
H: valid_message_prop even_constrained_primes_composition m
H0: m >= 2
H1: Z.Even m
n: primestransition (existT n radix_label) (update (const 1) n (m + 1), Some m) = (const 1, Some (`n * m))m: multiplying_message
H: valid_message_prop even_constrained_primes_composition m
H0: m >= 2
H1: Z.Even m
n: primesvalid_state_prop even_constrained_primes_composition (update (const 1) n (m + 1))m: multiplying_message
H: valid_message_prop even_constrained_primes_composition m
H0: m >= 2
H1: Z.Even m
n: primesinitial_state_prop (update (const 1) n (m + 1))by destruct (decide (n = j)) as [-> |]; [rewrite update_eq; lia | rewrite update_neq].m: multiplying_message
H: valid_message_prop even_constrained_primes_composition m
H0: m >= 2
H1: Z.Even m
n, j: primesupdate (const 1) n (m + 1) j >= 1done.m: multiplying_message
H: valid_message_prop even_constrained_primes_composition m
H0: m >= 2
H1: Z.Even m
n: primesoption_valid_message_prop even_constrained_primes_composition (Some m)by lia.m: multiplying_message
H: valid_message_prop even_constrained_primes_composition m
H0: m >= 2
H1: Z.Even m
n: primes2 ≤ mby rewrite update_eq; lia.m: multiplying_message
H: valid_message_prop even_constrained_primes_composition m
H0: m >= 2
H1: Z.Even m
n: primesm ≤ update (const 1) n (m + 1) ndone.m: multiplying_message
H: valid_message_prop even_constrained_primes_composition m
H0: m >= 2
H1: Z.Even m
n: primesZ.Even mm: multiplying_message
H: valid_message_prop even_constrained_primes_composition m
H0: m >= 2
H1: Z.Even m
n: primestransition (existT n radix_label) (update (const 1) n (m + 1), Some m) = (const 1, Some (`n * m))m: multiplying_message
H: valid_message_prop even_constrained_primes_composition m
H0: m >= 2
H1: Z.Even m
n, j: primesstate_update (indexed_radix_vlsms (λ p : primes, `p)) (update (const 1) n (m + 1)) n (update (const 1) n (m + 1) n - m) j = 1m: multiplying_message
H: valid_message_prop even_constrained_primes_composition m
H0: m >= 2
H1: Z.Even m
j: primesupdate (const 1) j (m + 1) j - m = 1m: multiplying_message
H: valid_message_prop even_constrained_primes_composition m
H0: m >= 2
H1: Z.Even m
n, j: primes
n0: n ≠ jupdate (const 1) n (m + 1) j = 1by rewrite update_eq; lia.m: multiplying_message
H: valid_message_prop even_constrained_primes_composition m
H0: m >= 2
H1: Z.Even m
j: primesupdate (const 1) j (m + 1) j - m = 1by rewrite update_neq. Qed.m: multiplying_message
H: valid_message_prop even_constrained_primes_composition m
H0: m >= 2
H1: Z.Even m
n, j: primes
n0: n ≠ jupdate (const 1) n (m + 1) j = 1m: Zm > 1 → Z.Even m → valid_message_prop even_constrained_primes_composition mm: Zm > 1 → Z.Even m → valid_message_prop even_constrained_primes_composition mm: Z
Hm1: m > 1
Hmeven: Z.Even mvalid_message_prop even_constrained_primes_composition mm: Z
Hm1: m > 1
Hmeven: Z.Even m
Hinit: composite_initial_message_prop (indexed_radix_vlsms (λ p : primes, `p)) 2valid_message_prop even_constrained_primes_composition mm: Z
Hm1: m > 1
Hmeven: Z.Even m
Hinit: composite_initial_message_prop (indexed_radix_vlsms (λ p : primes, `p)) 2
Hm2: m ≠ 2valid_message_prop even_constrained_primes_composition mn: Z
Hm1: 2 * n > 1
Hinit: composite_initial_message_prop (indexed_radix_vlsms (λ p : primes, `p)) 2
Hm2: 2 * n ≠ 2valid_message_prop even_constrained_primes_composition (2 * n)n: Z
Hm1: 2 * n > 1
Hinit: composite_initial_message_prop (indexed_radix_vlsms (λ p : primes, `p)) 2
Hm2: 2 * n ≠ 2
Hn: 2 ≤ nvalid_message_prop even_constrained_primes_composition (2 * n)n: Z
Hm1: 2 * n > 1
Hinit: composite_initial_message_prop (indexed_radix_vlsms (λ p : primes, `p)) 2
Hm2: 2 * n ≠ 2
Hn: 2 ≤ n
P:= λ n : Z, valid_message_prop even_constrained_primes_composition (2 * n): Z → Propvalid_message_prop even_constrained_primes_composition (2 * n)n: Z
Hm1: 2 * n > 1
Hinit: composite_initial_message_prop (indexed_radix_vlsms (λ p : primes, `p)) 2
Hm2: 2 * n ≠ 2
Hn: 2 ≤ n
P:= λ n : Z, valid_message_prop even_constrained_primes_composition (2 * n): Z → PropP nHinit: composite_initial_message_prop (indexed_radix_vlsms (λ p : primes, `p)) 2
n: Z
Hind: ∀ y : Z, 2 ≤ y < n → valid_message_prop even_constrained_primes_composition (2 * y)
Hn: 2 ≤ nvalid_message_prop even_constrained_primes_composition (2 * n)Hinit: composite_initial_message_prop (indexed_radix_vlsms (λ p : primes, `p)) 2
n: Z
Hind: ∀ y : Z, 2 ≤ y < n → valid_message_prop even_constrained_primes_composition (2 * y)
Hn: 2 ≤ n
Hp: prime nvalid_message_prop even_constrained_primes_composition (2 * n)Hinit: composite_initial_message_prop (indexed_radix_vlsms (λ p : primes, `p)) 2
n: Z
Hind: ∀ y : Z, 2 ≤ y < n → valid_message_prop even_constrained_primes_composition (2 * y)
Hn: 2 ≤ n
Hnp: ¬ prime nvalid_message_prop even_constrained_primes_composition (2 * n)Hinit: composite_initial_message_prop (indexed_radix_vlsms (λ p : primes, `p)) 2
n: Z
Hind: ∀ y : Z, 2 ≤ y < n → valid_message_prop even_constrained_primes_composition (2 * y)
Hn: 2 ≤ n
Hp: prime nvalid_message_prop even_constrained_primes_composition (2 * n)Hinit: composite_initial_message_prop (indexed_radix_vlsms (λ p : primes, `p)) 2
n: Z
Hind: ∀ y : Z, 2 ≤ y < n → valid_message_prop even_constrained_primes_composition (2 * y)
Hn: 2 ≤ n
Hp: prime nvalid_message_prop even_constrained_primes_composition (`(dexist n Hp) * 2)by apply initial_message_is_valid.Hinit: composite_initial_message_prop (indexed_radix_vlsms (λ p : primes, `p)) 2
n: Z
Hind: ∀ y : Z, 2 ≤ y < n → valid_message_prop even_constrained_primes_composition (2 * y)
Hn: 2 ≤ n
Hp: prime nvalid_message_prop even_constrained_primes_composition 2Hinit: composite_initial_message_prop (indexed_radix_vlsms (λ p : primes, `p)) 2
n: Z
Hind: ∀ y : Z, 2 ≤ y < n → valid_message_prop even_constrained_primes_composition (2 * y)
Hn: 2 ≤ n
Hnp: ¬ prime nvalid_message_prop even_constrained_primes_composition (2 * n)Hinit: composite_initial_message_prop (indexed_radix_vlsms (λ p : primes, `p)) 2
m, q: Z
Hq: 2 ≤ q < q * m
Hn: 2 ≤ q * m
Hind: ∀ y : Z, 2 ≤ y < q * m → valid_message_prop even_constrained_primes_composition (2 * y)
Hp: prime mvalid_message_prop even_constrained_primes_composition (2 * (q * m))Hinit: composite_initial_message_prop (indexed_radix_vlsms (λ p : primes, `p)) 2
m, q: Z
Hq: 2 ≤ q < q * m
Hn: 2 ≤ q * m
Hind: ∀ y : Z, 2 ≤ y < q * m → valid_message_prop even_constrained_primes_composition (2 * y)
Hp: prime mvalid_message_prop even_constrained_primes_composition (`(dexist m Hp) * (2 * q))by apply Hind. Qed.Hinit: composite_initial_message_prop (indexed_radix_vlsms (λ p : primes, `p)) 2
m, q: Z
Hq: 2 ≤ q < q * m
Hn: 2 ≤ q * m
Hind: ∀ y : Z, 2 ≤ y < q * m → valid_message_prop even_constrained_primes_composition (2 * y)
Hp: prime mvalid_message_prop even_constrained_primes_composition (2 * q)
The valid messages of the even_constrained_primes_composition are precisely
all positive even numbers.
m: Zvalid_message_prop even_constrained_primes_composition m ↔ m > 1 ∧ Z.Even m ∨ prime mm: Zvalid_message_prop even_constrained_primes_composition m ↔ m > 1 ∧ Z.Even m ∨ prime mm: Zvalid_message_prop even_constrained_primes_composition m → m > 1 ∧ Z.Even m ∨ prime mm: Zm > 1 ∧ Z.Even m ∨ prime m → valid_message_prop even_constrained_primes_composition mm: Zvalid_message_prop even_constrained_primes_composition m → m > 1 ∧ Z.Even m ∨ prime mm: Z
Hm: valid_message_prop even_constrained_primes_composition mm > 1 ∧ Z.Even m ∨ prime mm: Z
Hm: valid_message_prop even_constrained_primes_composition mm > 1 ∧ (Z.Even m ∨ prime m) → m > 1 ∧ Z.Even m ∨ prime mm: Z
Hm: valid_message_prop even_constrained_primes_composition mm > 1 ∧ (Z.Even m ∨ prime m)by destruct (decide (prime m)); [right | left; itauto].m: Z
Hm: valid_message_prop even_constrained_primes_composition mm > 1 ∧ (Z.Even m ∨ prime m) → m > 1 ∧ Z.Even m ∨ prime mm: Z
Hm: valid_message_prop even_constrained_primes_composition mm > 1 ∧ (Z.Even m ∨ prime m)m: Z
Hm: valid_message_prop even_constrained_primes_composition mm > 1m: Z
Hm: valid_message_prop even_constrained_primes_composition mZ.Even m ∨ prime mm: Z
Hm: valid_message_prop even_constrained_primes_composition mm > 1m: Z
Hm: valid_message_prop even_constrained_primes_composition mvalid_message_prop primes_vlsm_composition mm: Z
Hm: valid_message_prop even_constrained_primes_composition mVLSM_incl_part (constrained_vlsm_machine primes_vlsm_composition EvenConstraint) (free_composite_vlsm_machine (indexed_radix_vlsms (λ p : primes, `p)))m: Z
Hm: valid_message_prop even_constrained_primes_composition mstrong_incl_initial_message_preservation (constrained_vlsm_machine primes_vlsm_composition EvenConstraint) (free_composite_vlsm_machine (indexed_radix_vlsms (λ p : primes, `p)))by apply (VLSM_incl_constrained_vlsm primes_vlsm_composition).m: Z
Hm: valid_message_prop even_constrained_primes_composition mVLSM_incl_part (constrained_vlsm_machine primes_vlsm_composition EvenConstraint) (free_composite_vlsm_machine (indexed_radix_vlsms (λ p : primes, `p)))by do 2 red.m: Z
Hm: valid_message_prop even_constrained_primes_composition mstrong_incl_initial_message_preservation (constrained_vlsm_machine primes_vlsm_composition EvenConstraint) (free_composite_vlsm_machine (indexed_radix_vlsms (λ p : primes, `p)))m: Z
Hm: valid_message_prop even_constrained_primes_composition mZ.Even m ∨ prime mm: Z
s: composite_state (indexed_radix_vlsms (λ p : primes, `p))
im: Z
i: primes
li: multiplying_label
s': composite_state (indexed_radix_vlsms (λ p : primes, `p))
Hc: EvenConstraint (existT i li) (s, Some im)
Ht: (state_update (indexed_radix_vlsms (λ p : primes, `p)) s i (s i - im), Some (`i * im)) = (s', Some m)Z.Even m ∨ prime mm: Z
s: composite_state (indexed_radix_vlsms (λ p : primes, `p))
im: Z
i: primes
li: multiplying_label
s': composite_state (indexed_radix_vlsms (λ p : primes, `p))
Ht: (state_update (indexed_radix_vlsms (λ p : primes, `p)) s i (s i - im), Some (`i * im)) = (s', Some m)
H1: Z.Even imZ.Even m ∨ prime mby left; apply Zeven_equiv, Zeven_mult_Zeven_r, Zeven_equiv.s: composite_state (indexed_radix_vlsms (λ p : primes, `p))
im: Z
i: primes
li: multiplying_label
H1: Z.Even imZ.Even (`i * im) ∨ prime (`i * im)m: Zm > 1 ∧ Z.Even m ∨ prime m → valid_message_prop even_constrained_primes_composition mm: Z
H: m > 1
H0: Z.Even mvalid_message_prop even_constrained_primes_composition mm: Z
Hprime: prime mvalid_message_prop even_constrained_primes_composition mby apply even_constrained_primes_composition_valid_messages_left.m: Z
H: m > 1
H0: Z.Even mvalid_message_prop even_constrained_primes_composition mm: Z
Hprime: prime mvalid_message_prop even_constrained_primes_composition mby unshelve eexists (dexist m Hprime), (exist _ m _). Qed.m: Z
Hprime: prime minitial_message_prop m
No component is validating for the even_constrained_primes_composition.
∀ p : primes, ¬ component_projection_validator_prop (indexed_radix_vlsms (λ p0 : primes, `p0)) EvenConstraint p∀ p : primes, ¬ component_projection_validator_prop (indexed_radix_vlsms (λ p0 : primes, `p0)) EvenConstraint pp: primes
Hnv: component_projection_validator_prop (indexed_radix_vlsms (λ p : primes, `p)) EvenConstraint pFalsep: primes
Hnv: component_projection_validator_prop (indexed_radix_vlsms (λ p : primes, `p)) EvenConstraint pinput_constrained (indexed_radix_vlsms (λ p0 : primes, `p0) p) () (3, Some 3) → Falsep: primes
Hnv: component_projection_validator_prop (indexed_radix_vlsms (λ p : primes, `p)) EvenConstraint pinput_constrained (indexed_radix_vlsms (λ p0 : primes, `p0) p) () (3, Some 3)p: primes
Hnv: component_projection_validator_prop (indexed_radix_vlsms (λ p : primes, `p)) EvenConstraint pinput_constrained (indexed_radix_vlsms (λ p0 : primes, `p0) p) () (3, Some 3) → Falsep: primes
Hnv: component_projection_validator_prop (indexed_radix_vlsms (λ p : primes, `p)) EvenConstraint p
Hiv: input_constrained (indexed_radix_vlsms (λ p0 : primes, `p0) p) () (3, Some 3)Falseby inversion Hc as [? ? ? []]; lia.p: primes
Hnv: component_projection_validator_prop (indexed_radix_vlsms (λ p : primes, `p)) EvenConstraint p
s: state (composite_vlsm (indexed_radix_vlsms (λ p : primes, `p)) EvenConstraint)
Hc: EvenConstraint (existT p ()) (s, Some 3)Falsep: primes
Hnv: component_projection_validator_prop (indexed_radix_vlsms (λ p : primes, `p)) EvenConstraint pinput_constrained (indexed_radix_vlsms (λ p0 : primes, `p0) p) () (3, Some 3)p: primes
Hnv: component_projection_validator_prop (indexed_radix_vlsms (λ p : primes, `p)) EvenConstraint pvalid_state_prop (preloaded_with_all_messages_vlsm (indexed_radix_vlsms (λ p0 : primes, `p0) p)) 3by red; lia. Qed.p: primes
Hnv: component_projection_validator_prop (indexed_radix_vlsms (λ p : primes, `p)) EvenConstraint pmultiplying_initial_state_prop 3
Now we show that if we constrain each component with a local condition
equivalent to the global constraint we can recover validation.
Inductive LocalEvenConstraint (mult : Z) : label (radix_vlsm mult) -> state (radix_vlsm mult) * option Z -> Prop := | local_even_constraint : forall l s m, Z.Even m -> LocalEvenConstraint mult l (s, Some m). Definition even_prime_vlsms (p : primes) : VLSM multiplying_message := constrained_vlsm (radix_vlsm (`p)) (LocalEvenConstraint (`p)).
Adding the local constraint to each component does not change the behavior
of the composition.
VLSM_incl even_constrained_primes_composition (composite_vlsm even_prime_vlsms EvenConstraint)VLSM_incl even_constrained_primes_composition (composite_vlsm even_prime_vlsms EvenConstraint)strong_incl_valid_preservation (constrained_vlsm_machine primes_vlsm_composition EvenConstraint) (constrained_vlsm_machine (free_composite_vlsm even_prime_vlsms) EvenConstraint)p: primes
s: state {| vlsm_type := primes_vlsm_composition; vlsm_machine := constrained_vlsm_machine primes_vlsm_composition EvenConstraint |}
m: Z
Hv: valid (existT p ()) (s, Some m)
Hc: EvenConstraint (existT p ()) (s, Some m)(2 ≤ m ≤ s p ∧ LocalEvenConstraint (`p) () (s p, Some m)) ∧ EvenConstraint (existT p ()) (s, Some m)p: primes
s: state {| vlsm_type := primes_vlsm_composition; vlsm_machine := constrained_vlsm_machine primes_vlsm_composition EvenConstraint |}
m: Z
Hv: valid (existT p ()) (s, Some m)
Hc: EvenConstraint (existT p ()) (s, Some m)2 ≤ m ≤ s p ∧ LocalEvenConstraint (`p) () (s p, Some m)by destruct Hv. Qed.p: primes
s: state {| vlsm_type := primes_vlsm_composition; vlsm_machine := constrained_vlsm_machine primes_vlsm_composition EvenConstraint |}
m: Z
Hv: valid (existT p ()) (s, Some m)
Hc: EvenConstraint (existT p ()) (s, Some m)2 ≤ m ≤ s p
The validation result is recovered for the new constrained components and composition.
∀ p : primes, component_projection_validator_prop even_prime_vlsms EvenConstraint p∀ p : primes, component_projection_validator_prop even_prime_vlsms EvenConstraint pp: primes
lp: label (even_prime_vlsms p)
sp: state (even_prime_vlsms p)
m: multiplying_message
Hsp: valid_state_prop (preloaded_with_all_messages_vlsm (even_prime_vlsms p)) sp
H: 2 ≤ m
H0: m ≤ sp
Hc: LocalEvenConstraint (`p) lp (sp, Some m)valid lp (sp, Some m)p: primes
lp: label (even_prime_vlsms p)
sp: state (even_prime_vlsms p)
m: multiplying_message
Hsp: valid_state_prop (preloaded_with_all_messages_vlsm (even_prime_vlsms p)) sp
H: 2 ≤ m
H0: m ≤ sp
Hc: LocalEvenConstraint (`p) lp (sp, Some m)
Heven: Z.Even mvalid lp (sp, Some m)p: primes
lp: label (even_prime_vlsms p)
sp: state (even_prime_vlsms p)
m: multiplying_message
Hsp: valid_state_prop (preloaded_with_all_messages_vlsm (even_prime_vlsms p)) sp
H: 2 ≤ m
H0: m ≤ sp
Hc: LocalEvenConstraint (`p) lp (sp, Some m)
Heven: Z.Even mlift_to_composite_state' (indexed_radix_vlsms (λ p : primes, `p)) p sp p = sp ∧ input_valid (composite_vlsm even_prime_vlsms EvenConstraint) (existT p lp) (lift_to_composite_state' (indexed_radix_vlsms (λ p : primes, `p)) p sp, Some m)p: primes
lp: label (even_prime_vlsms p)
sp: state (even_prime_vlsms p)
m: multiplying_message
Hsp: valid_state_prop (preloaded_with_all_messages_vlsm (even_prime_vlsms p)) sp
H: 2 ≤ m
H0: m ≤ sp
Hc: LocalEvenConstraint (`p) lp (sp, Some m)
Heven: Z.Even mvalid_state_prop (composite_vlsm even_prime_vlsms EvenConstraint) (lift_to_composite_state' (indexed_radix_vlsms (λ p : primes, `p)) p sp)p: primes
lp: label (even_prime_vlsms p)
sp: state (even_prime_vlsms p)
m: multiplying_message
Hsp: valid_state_prop (preloaded_with_all_messages_vlsm (even_prime_vlsms p)) sp
H: 2 ≤ m
H0: m ≤ sp
Hc: LocalEvenConstraint (`p) lp (sp, Some m)
Heven: Z.Even moption_valid_message_prop (composite_vlsm even_prime_vlsms EvenConstraint) (Some m)p: primes
lp: label (even_prime_vlsms p)
sp: state (even_prime_vlsms p)
m: multiplying_message
Hsp: valid_state_prop (preloaded_with_all_messages_vlsm (even_prime_vlsms p)) sp
H: 2 ≤ m
H0: m ≤ sp
Hc: LocalEvenConstraint (`p) lp (sp, Some m)
Heven: Z.Even mvalid_state_prop (composite_vlsm even_prime_vlsms EvenConstraint) (lift_to_composite_state' (indexed_radix_vlsms (λ p : primes, `p)) p sp)p: primes
lp: label (even_prime_vlsms p)
sp: state (even_prime_vlsms p)
m: multiplying_message
Hsp: valid_state_prop (preloaded_with_all_messages_vlsm (even_prime_vlsms p)) sp
H: 2 ≤ m
H0: m ≤ sp
Hc: LocalEvenConstraint (`p) lp (sp, Some m)
Heven: Z.Even minitial_state_prop (lift_to_composite_state' (indexed_radix_vlsms (λ p : primes, `p)) p sp)by destruct (decide (p = p')); subst; state_update_simpl; cbn; [lia |].p: primes
lp: label (even_prime_vlsms p)
sp: state (even_prime_vlsms p)
m: multiplying_message
Hsp: valid_state_prop (preloaded_with_all_messages_vlsm (even_prime_vlsms p)) sp
H: 2 ≤ m
H0: m ≤ sp
Hc: LocalEvenConstraint (`p) lp (sp, Some m)
Heven: Z.Even m
p': primeslift_to_composite_state' (indexed_radix_vlsms (λ p : primes, `p)) p sp p' >= 1p: primes
lp: label (even_prime_vlsms p)
sp: state (even_prime_vlsms p)
m: multiplying_message
Hsp: valid_state_prop (preloaded_with_all_messages_vlsm (even_prime_vlsms p)) sp
H: 2 ≤ m
H0: m ≤ sp
Hc: LocalEvenConstraint (`p) lp (sp, Some m)
Heven: Z.Even moption_valid_message_prop (composite_vlsm even_prime_vlsms EvenConstraint) (Some m)p: primes
lp: label (even_prime_vlsms p)
sp: state (even_prime_vlsms p)
m: multiplying_message
Hsp: valid_state_prop (preloaded_with_all_messages_vlsm (even_prime_vlsms p)) sp
H: 2 ≤ m
H0: m ≤ sp
Hc: LocalEvenConstraint (`p) lp (sp, Some m)
Heven: Z.Even mvalid_message_prop (composite_vlsm even_prime_vlsms EvenConstraint) mp: primes
lp: label (even_prime_vlsms p)
sp: state (even_prime_vlsms p)
m: multiplying_message
Hsp: valid_state_prop (preloaded_with_all_messages_vlsm (even_prime_vlsms p)) sp
H: 2 ≤ m
H0: m ≤ sp
Hc: LocalEvenConstraint (`p) lp (sp, Some m)
Heven: Z.Even mstrong_incl_initial_message_preservation even_constrained_primes_composition (constrained_vlsm_machine (free_composite_vlsm even_prime_vlsms) EvenConstraint)p: primes
lp: label (even_prime_vlsms p)
sp: state (even_prime_vlsms p)
m: multiplying_message
Hsp: valid_state_prop (preloaded_with_all_messages_vlsm (even_prime_vlsms p)) sp
H: 2 ≤ m
H0: m ≤ sp
Hc: LocalEvenConstraint (`p) lp (sp, Some m)
Heven: Z.Even mvalid_message_prop {| vlsm_type := free_composite_vlsm even_prime_vlsms; vlsm_machine := even_constrained_primes_composition |} mby do 2 red.p: primes
lp: label (even_prime_vlsms p)
sp: state (even_prime_vlsms p)
m: multiplying_message
Hsp: valid_state_prop (preloaded_with_all_messages_vlsm (even_prime_vlsms p)) sp
H: 2 ≤ m
H0: m ≤ sp
Hc: LocalEvenConstraint (`p) lp (sp, Some m)
Heven: Z.Even mstrong_incl_initial_message_preservation even_constrained_primes_composition (constrained_vlsm_machine (free_composite_vlsm even_prime_vlsms) EvenConstraint)p: primes
lp: label (even_prime_vlsms p)
sp: state (even_prime_vlsms p)
m: multiplying_message
Hsp: valid_state_prop (preloaded_with_all_messages_vlsm (even_prime_vlsms p)) sp
H: 2 ≤ m
H0: m ≤ sp
Hc: LocalEvenConstraint (`p) lp (sp, Some m)
Heven: Z.Even mvalid_message_prop {| vlsm_type := free_composite_vlsm even_prime_vlsms; vlsm_machine := even_constrained_primes_composition |} mby left; split; [lia |]. Qed. End sec_primes_vlsm_composition.p: primes
lp: label (even_prime_vlsms p)
sp: state (even_prime_vlsms p)
m: multiplying_message
Hsp: valid_state_prop (preloaded_with_all_messages_vlsm (even_prime_vlsms p)) sp
H: 2 ≤ m
H0: m ≤ sp
Hc: LocalEvenConstraint (`p) lp (sp, Some m)
Heven: Z.Even mm > 1 ∧ Z.Even m ∨ prime m