集合論とかの演算を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は集合