集合論とかの演算をC#(LINQ)でどう書くか考えてみた。

とりあえず 数学記号の表 - Wikipedia に載ってる項目について。

■論理演算・量化

論理積 P ∧ Q P && Q
論理和 P ∨ Q P || Q
否定 ¬P !P
全称量化 ∀x ∈ S; P(x) S.All(x => P(x))
存在量化 ∃ x ∈ S; P(x) S.Any(x => P(x))
存在量化 ∃x(x ∈ S) S.Any()


■集合間の関係

集合の要素 x ∈ S S.Contains(x)
集合の要素の否定 x ∉ S !S.Contains(x)
集合の一致 S = T !S.Exept(T).Any() && !T.Exept(S).Any()
集合の一致の否定 S ≠ T S.Exept(T).Any() || T.Exept(S).Any()
部分集合 S ⊆ T !S.Exept(T).Any()
真部分集合 S ⊂ T !S.Exept(T).Any() && T.Exept(S).Any()
部分集合の否定 S ⊄ T S.Exept(T).Any()


■集合演算

※1 {x ∈ S : P(x)} S.Where(x => P(x))
積集合 S ∩ T S.Intersect(T)
和集合 S ∪ T S.Union(T)
差集合 S \ T S.Except(T)
順序対 (x, y, …) Tuple.Create(x, y, ...)
直積集合 S × T S.SelectMany(x => T.Select(y => Tuple.Create(x, y)))
商集合 S/~ S.GroupBy(x => ~(x))
写像の全体 Map(S, T) S.Select(x => f(x))
対象差 S△T S.Exept(T).Union(T.Exept(S))

※1)ある命題を満たす元を集めた集合

※)P,Qは命題。S,Tは集合