/// <summary> /// 部分集合族の包含関係 ⊆ から 自己関係 R を生成するメソッド /// </summary> /// <typeparam name="TEnum"></typeparam> /// <param name="subsets">部分集合族</param> /// <param name="universe">全体集合</param> /// <returns></returns> public static EndoRelation <FiniteSet <TEnum> > CreateSubsetRelation <TEnum>(this FamilyOfSubsets <TEnum> subsets, FiniteSet <TEnum> universe) where TEnum : Enum { if (!subsets.isUniverseOK(universe)) { throw new ArgumentException("全体集合が、部分集合族の要素である、集合の要素を網羅していません"); } var retRel = new EndoRelation <FiniteSet <TEnum> >(); //自己関係の全体集合は冪集合(もとの台集合の部分集合族なので) retRel.SetUniverse(universe.PowerSet()); //要素となる集合を格納 foreach (FiniteSet <TEnum> subsetX in subsets) { foreach (FiniteSet <TEnum> subsetY in subsets) { //X⊆Y ⇔ X R Y という定義で自己関係Rを定義 if (subsetX.IsSubsetOf(subsetY)) { retRel.Add((subsetX, subsetY)); } } } return(retRel); }
/// <summary> /// 補-完備かどうか(補集合cについて閉じているかどうか) /// </summary> /// <param name="subsets">集合族</param> /// <param name="universe">全体集合</param> /// <returns>補-完備</returns> public static bool isComplementComplete <TEnum>(this FamilyOfSubsets <TEnum> subsets, FiniteSet <TEnum> universe) where TEnum : Enum { if (!subsets.isUniverseOK(universe)) { throw new ArgumentException("全体集合が、部分集合族の要素である、集合の要素を網羅していません"); } foreach (FiniteSet <TEnum> subset in subsets) { FiniteSet <TEnum> diffSet = universe.Diff(subset); if (!subsets.Contains(diffSet)) { return(false); } } return(true); }