proposition: Lemma filter_join_fst : forall {A B} f s1 s2, List.filter (fun x => f (fst x)) (@Join_Lists A B s1 s2) = Join_Lists (List.filter f s1) s2.
proof: Proof. unfold Join_Lists; induction s1; intros; simpl. - reflexivity. - destruct (f a) eqn:eq_fa; rewrite filter_app, filter_map; simpl; rewrite eq_fa; [ rewrite filter_true | rewrite filter_false ]; simpl; rewrite IHs1; reflexivity. Qed.
imports: Coq.Strings.String Coq.ZArith.ZArith Coq.Lists.List Coq.Logic.FunctionalExtensionality Coq.Sets.Ensembles Coq.Sorting.Permutation Fiat.Computation Fiat.ADT Fiat.ADTRefinement Fiat.ADTNotation Fiat.ADTRefinement.GeneralBuildADTRefinements Fiat.QueryStructure.Specification.Representation.QueryStructureSchema Fiat.QueryStructure.Specification.Operations.Query Fiat.QueryStructure.Specification.Representation.QueryStructure Fiat.QueryStructure.Implementation.Operations.General.QueryRefinements Fiat.Common.SetEq Fiat.Common.Ensembles.IndexedEnsembles Fiat.Common.DecideableEnsembles Fiat.Common.List.ListMorphisms Fiat.Common.List.FlattenList Fiat.QueryStructure.Specification.Operations.FlattenCompList Fiat.Common.List.ListFacts