Module Type LEGAL_ALIGNAS.
Parameter legal_alignas_obs: Type.
Parameter legal_alignas_type: composite_env -> PTree.t Z -> PTree.t legal_alignas_obs -> type -> legal_alignas_obs.
Parameter legal_alignas_composite: composite_env -> PTree.t Z -> PTree.t legal_alignas_obs -> composite -> legal_alignas_obs.
Parameter legal_alignas_env: composite_env -> PTree.t Z -> PTree.t legal_alignas_obs.
Parameter is_aligned_aux: legal_alignas_obs -> Z -> Z -> bool.
End LEGAL_ALIGNAS.
Module LegalAlignasDefsGen (LegalAlignas: LEGAL_ALIGNAS).
Definition legal_alignas_env_consistent (cenv: composite_env) (ha_env: PTree.t Z) (la_env: PTree.t legal_alignas_obs): Prop :=
forall i co la,
cenv ! i = Some co ->
la_env ! i = Some la ->
la = legal_alignas_composite cenv ha_env la_env co.
Definition legal_alignas_env_complete (cenv: composite_env) (la_env: PTree.t legal_alignas_obs): Prop :=
forall i,
(exists co, cenv ! i = Some co) <->
(exists la, la_env ! i = Some la).
Definition is_aligned cenv ha_env la_env (t: type) (ofs: Z): bool := is_aligned_aux (legal_alignas_type cenv ha_env la_env t) (hardware_alignof ha_env t) ofs.
Definition legal_alignas_env_sound (cenv: composite_env) (ha_env: PTree.t Z) (la_env: PTree.t legal_alignas_obs): Prop :=
forall ofs t,
complete_legal_cosu_type cenv t = true ->
is_aligned cenv ha_env la_env t ofs = true ->
align_compatible_rec cenv t ofs.
End LegalAlignasDefsGen.
Module Type LEGAL_ALIGNAS_FACTS.
Declare Module LegalAlignas: LEGAL_ALIGNAS.
Module LegalAlignasDefs := LegalAlignasDefsGen (LegalAlignas).
Export LegalAlignas LegalAlignasDefs.

Axiom legal_alignas_soundness: forall cenv ha_env la_env,
composite_env_consistent cenv ->
composite_env_complete_legal_cosu_type cenv ->
hardware_alignof_env_consistent cenv ha_env ->
hardware_alignof_env_complete cenv ha_env ->
legal_alignas_env_consistent cenv ha_env la_env ->
legal_alignas_env_complete cenv la_env ->
legal_alignas_env_sound cenv ha_env la_env.