proposition: Theorem FunctionalDependency_symmetry' : forall H P attrlist1 attrlist2 n b', decides b' (forall tup' : @IndexedRawTuple H, P tup' -> FunctionalDependency_P attrlist1 attrlist2 n (indexedElement tup')) -> refine {b | decides b (forall tup' : @IndexedRawTuple H, P tup' -> FunctionalDependency_P attrlist1 attrlist2 (indexedElement tup') n)} (ret b').
proof: Proof. unfold FunctionalDependency_P; intros. refine pick val b'. reflexivity. destruct b'; simpl in *; unfold tupleAgree in *; intros; eauto. erewrite H0; eauto; intros; rewrite H1; eauto. unfold not; intros; eapply H0; intros. rewrite H1; eauto; intros; rewrite H2; eauto. Qed.
imports: Fiat.QueryStructure.Specification.Representation.QueryStructureNotations Fiat.QueryStructure.Specification.Operations.Query Coq.Lists.List Coq.Arith.Compare_dec Coq.Bool.Bool Coq.Strings.String Fiat.Common.BoolFacts Fiat.Common.List.PermutationFacts Fiat.Common.List.ListMorphisms Fiat.QueryStructure.Specification.Operations.FlattenCompList Fiat.Common.Ensembles.EnsembleListEquivalence Fiat.QueryStructure.Implementation.Operations.General.QueryRefinements Fiat.Common.IterateBoundedIndex Fiat.Common.List.ListFacts Fiat.Common.LogicFacts Fiat.Common.DecideableEnsembles Fiat.Computation.Refinements.Iterate_Decide_Comp Fiat.Computation.Refinements.General Fiat.QueryStructure.Specification.Constraints.tupleAgree Fiat.QueryStructure.Specification.Operations.Mutate